|
|
View previous topic :: View next topic |
Author |
Message |
melissa creek Guest
|
LCD on Analog Port |
Posted: Sat Feb 15, 2003 12:49 pm |
|
|
<font face="Courier New" size=-1>Hi,
Can anyone please solve this. I am trying to run an LCD display off of port a on a 16F873. As far as I know I have disabled the analog and enabled the digital IO on that port but the LCD refuses to initialise.
Any suggestions?
PRE
/*
---------
+5--20-|Vdd |
+5---1-|Mclr |
Gnd---8-|Vss |
Gnd--19-|Vss |
4MHz--10-|Xtal |
4MHz---9-|Xtal |
| |
| 16F873 |
| |
| |
| |
| |
| |
| |
| |
| | ---------
| A0|-15--11-|D4 |
| A1|-16--12-|D5 |
| A2|-17--13-|D6 |
| A3|-18--14-|D7 |
| | | |-3--20K pot (contrast)
| A4|-14---6-|EN |
| A5|-13---4-|RS |
| | | |
| | +5-2-| |
| | Gnd-1-| |
| | Gnd-5-| |
| | | DISPLAY |
--------- ---------
/PRE
*/
#include <16F873.h>
#include <jonsinc.h>
#fuses XT, NOPROTECT, NOPUT, NOWDT, NOBROWNOUT, NOLVP, NOCPD, NOWRT
// LCD STUFF
#define LCD_D0 PIN_A0
#define LCD_D1 PIN_A1
#define LCD_D2 PIN_A2
#define LCD_D3 PIN_A3
#define LCD_EN PIN_A4
#define LCD_RS PIN_A5
#define CLEAR_DISP 0x01
#use delay ( clock=4000000 )
#use standard_io ( A )
// These defines are specifically for a 4x16 line display.
#define LINE_16_1 0x00
#define LINE_16_2 0x40
#define LINE_16_3 0x10
#define LINE_16_4 0x50
// These defines are specifically for a 4x20 line display.
#define LINE_20_1 0x00
#define LINE_20_2 0x40
#define LINE_20_3 0x14
#define LINE_20_4 0x54
// These are prototype statements.
void LCD_SetPosition ( UCHAR cX );
void LCD_PutChar ( UCHAR cX );
void LCD_PutCmd ( UCHAR cX );
void LCD_Init ( void );
void LCD_PulseEnable ( void );
void LCD_SetData ( unsigned int cX );
void main( void )
{
LCD_Init (); // initializes display
LCD_PutCmd ( CLEAR_DISP ); // clears display
LCD_SetPosition ( LINE_16_1 ); // sets cursor at offset 0 in first line
printf ( LCD_PutChar, "Test" ); // displays "Test"
LCD_SetPosition ( LINE_16_2 + 5 ); // sets cursor at offset 5 in second line
printf ( LCD_PutChar, "Test" ); // displays "2nd test"
while ( TRUE ); // halts here
}
// These are the display subroutines.==============================
void LCD_Init ( void )
{
setup_adc(NO_ANALOGS); // make all of port a digital
LCD_SetData ( 0x00 );
delay_ms ( 200 ); // wait enough time after Vdd rise
output_low ( LCD_RS );
LCD_SetData ( 0x03 ); // init with specific nibbles to start 4-bit mode
LCD_PulseEnable();
LCD_PulseEnable();
LCD_PulseEnable();
LCD_SetData ( 0x02 ); // set 4-bit interface
LCD_PulseEnable(); // send dual nibbles hereafter, MSN first
LCD_PutCmd ( 0x2C ); // function set (all lines, 5x7 characters)
LCD_PutCmd ( 0x0C ); // display ON, cursor off, no blink
LCD_PutCmd ( 0x01 ); // clear display
LCD_PutCmd ( 0x06 ); // entry mode set, increment
}
void LCD_SetPosition ( unsigned int cX )
{
// this subroutine works specifically for 4-bit Port A
LCD_SetData ( swap ( cX ) | 0x08 );
LCD_PulseEnable();
LCD_SetData ( swap ( cX ) );
LCD_PulseEnable();
}
void LCD_PutChar ( unsigned int cX )
{
// this subroutine works specifically for 4-bit Port A
output_high ( LCD_RS );
LCD_SetData ( swap ( cX ) ); // send high nibble
LCD_PulseEnable();
LCD_SetData ( swap ( cX ) ); // send low nibble
LCD_PulseEnable();
output_low ( LCD_RS );
}
void LCD_PutCmd ( unsigned int cX )
{
// this subroutine works specifically for 4-bit Port A
LCD_SetData ( swap ( cX ) ); // send high nibble
LCD_PulseEnable();
LCD_SetData ( swap ( cX ) ); // send low nibble
LCD_PulseEnable();
}
void LCD_PulseEnable ( void )
{
output_high ( LCD_EN );
delay_us ( 10 );
output_low ( LCD_EN );
delay_ms ( 5 );
}
void LCD_SetData ( unsigned int cX )
{
output_bit ( LCD_D0, cX & 0x01 );
output_bit ( LCD_D1, cX & 0x02 );
output_bit ( LCD_D2, cX & 0x04 );
output_bit ( LCD_D3, cX & 0x08 );
}</font>
___________________________
This message was ported from CCS's old forum
Original Post ID: 11738 |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
Re: LCD on Analog Port |
Posted: Sat Feb 15, 2003 1:04 pm |
|
|
:=Hi,
:=Can anyone please solve this. I am trying to run an LCD display off of port a on a 16F873. As far as I know I have disabled the analog and enabled the digital IO on that port but the LCD refuses to initialise.
:=
------------------------------------------------------
The very first question would be, do you have a pull-up
resistor on pin A4 ? That's an open drain output, so
you'll need one. You could use a 4.7K resistor in this
circuit.
Also, your ASCII art doesn't display properly on this board.
You have to use the PRE and /PRE tags.
<a href="http://www.pic-c.com/forum/general/posts/11373.html" TARGET="_blank">http://www.pic-c.com/forum/general/posts/11373.html</a>
You could edit your post, and surround the art with those tags.
___________________________
This message was ported from CCS's old forum
Original Post ID: 11739 |
|
|
Hans Wedemeyer Guest
|
Re: LCD on Analog Port |
Posted: Sat Feb 15, 2003 4:46 pm |
|
|
Did you forget to set tris_a for the line that need to be Output. i.e. A4 and A5.
I did not see it in your code, did I miss something.
Don't forget to do that pulup resistor as PCM Programmer advised. 10K is fine.
___________________________
This message was ported from CCS's old forum
Original Post ID: 11748 |
|
|
melissa creek Guest
|
Re: LCD on Analog Port |
Posted: Sun Feb 16, 2003 12:20 pm |
|
|
Not sure that resistors are required!! I have had this code working on port A of a 16F84 without pullup resistors and the port doesn't have any internally.
Thanks
:=Hi,
:=Can anyone please solve this. I am trying to run an LCD display off of port a on a 16F873. As far as I know I have disabled the analog and enabled the digital IO on that port but the LCD refuses to initialise.
:=
:=Any suggestions?
:=
:=/*
:= ---------
:= +5--20-|Vdd |
:= +5---1-|Mclr |
:= Gnd---8-|Vss |
:= Gnd--19-|Vss |
:= 4MHz--10-|Xtal |
:= 4MHz---9-|Xtal |
:= | |
:= | 16F873 |
:= | |
:= | |
:= | |
:= | |
:= | |
:= | |
:= | |
:= | | ---------
:= | A0|-15--11-|D4 |
:= | A1|-16--12-|D5 |
:= | A2|-17--13-|D6 |
:= | A3|-18--14-|D7 |
:= | | | |-3--20K pot (contrast)
:= | A4|-14---6-|EN |
:= | A5|-13---4-|RS |
:= | | | |
:= | | +5-2-| |
:= | | Gnd-1-| |
:= | | Gnd-5-| |
:= | | | DISPLAY |
:= --------- ---------
:=
:=*/
:=
:=#include <16F873.h>
:=#include <jonsinc.h>
:=#fuses XT, NOPROTECT, NOPUT, NOWDT, NOBROWNOUT, NOLVP, NOCPD, NOWRT
:=
:=// LCD STUFF
:=#define LCD_D0 PIN_A0
:=#define LCD_D1 PIN_A1
:=#define LCD_D2 PIN_A2
:=#define LCD_D3 PIN_A3
:=#define LCD_EN PIN_A4
:=#define LCD_RS PIN_A5
:=#define CLEAR_DISP 0x01
:=#use delay ( clock=4000000 )
:=#use standard_io ( A )
:=
:=// These defines are specifically for a 4x16 line display.
:=#define LINE_16_1 0x00
:=#define LINE_16_2 0x40
:=#define LINE_16_3 0x10
:=#define LINE_16_4 0x50
:=// These defines are specifically for a 4x20 line display.
:=#define LINE_20_1 0x00
:=#define LINE_20_2 0x40
:=#define LINE_20_3 0x14
:=#define LINE_20_4 0x54
:=
:=// These are prototype statements.
:=void LCD_SetPosition ( UCHAR cX );
:=void LCD_PutChar ( UCHAR cX );
:=void LCD_PutCmd ( UCHAR cX );
:=void LCD_Init ( void );
:=void LCD_PulseEnable ( void );
:=void LCD_SetData ( unsigned int cX );
:=
:=
:=
:=
:=void main( void )
:= {
:=
:= LCD_Init (); // initializes display
:= LCD_PutCmd ( CLEAR_DISP ); // clears display
:= LCD_SetPosition ( LINE_16_1 ); // sets cursor at offset 0 in first line
:= printf ( LCD_PutChar, "Test" ); // displays "Test"
:= LCD_SetPosition ( LINE_16_2 + 5 ); // sets cursor at offset 5 in second line
:= printf ( LCD_PutChar, "Test" ); // displays "2nd test"
:= while ( TRUE ); // halts here
:= }
:=
:=
:=
:=
:=// These are the display subroutines.==============================
:=
:=
:=void LCD_Init ( void )
:= {
:= setup_adc(NO_ANALOGS); // make all of port a digital
:= LCD_SetData ( 0x00 );
:= delay_ms ( 200 ); // wait enough time after Vdd rise
:= output_low ( LCD_RS );
:= LCD_SetData ( 0x03 ); // init with specific nibbles to start 4-bit mode
:= LCD_PulseEnable();
:= LCD_PulseEnable();
:= LCD_PulseEnable();
:= LCD_SetData ( 0x02 ); // set 4-bit interface
:= LCD_PulseEnable(); // send dual nibbles hereafter, MSN first
:= LCD_PutCmd ( 0x2C ); // function set (all lines, 5x7 characters)
:= LCD_PutCmd ( 0x0C ); // display ON, cursor off, no blink
:= LCD_PutCmd ( 0x01 ); // clear display
:= LCD_PutCmd ( 0x06 ); // entry mode set, increment
:= }
:=
:=void LCD_SetPosition ( unsigned int cX )
:= {
:= // this subroutine works specifically for 4-bit Port A
:= LCD_SetData ( swap ( cX ) | 0x08 );
:= LCD_PulseEnable();
:= LCD_SetData ( swap ( cX ) );
:= LCD_PulseEnable();
:= }
:=
:=void LCD_PutChar ( unsigned int cX )
:= {
:= // this subroutine works specifically for 4-bit Port A
:= output_high ( LCD_RS );
:= LCD_SetData ( swap ( cX ) ); // send high nibble
:= LCD_PulseEnable();
:= LCD_SetData ( swap ( cX ) ); // send low nibble
:= LCD_PulseEnable();
:= output_low ( LCD_RS );
:= }
:=
:=void LCD_PutCmd ( unsigned int cX )
:= {
:= // this subroutine works specifically for 4-bit Port A
:= LCD_SetData ( swap ( cX ) ); // send high nibble
:= LCD_PulseEnable();
:= LCD_SetData ( swap ( cX ) ); // send low nibble
:= LCD_PulseEnable();
:= }
:=
:=void LCD_PulseEnable ( void )
:= {
:= output_high ( LCD_EN );
:= delay_us ( 10 );
:= output_low ( LCD_EN );
:= delay_ms ( 5 );
:= }
:=
:=void LCD_SetData ( unsigned int cX )
:= {
:= output_bit ( LCD_D0, cX & 0x01 );
:= output_bit ( LCD_D1, cX & 0x02 );
:= output_bit ( LCD_D2, cX & 0x04 );
:= output_bit ( LCD_D3, cX & 0x08 );
:= }
___________________________
This message was ported from CCS's old forum
Original Post ID: 11766 |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
Re: LCD on Analog Port |
Posted: Sun Feb 16, 2003 3:48 pm |
|
|
:=Not sure that resistors are required!! I have had this code working on port A of a 16F84 without pullup resistors and the port doesn't have any internally.
:=
Just put in the resistor.
<a href="http://www.winpicprog.co.uk/pic_tutorial_lcd_board.htm" TARGET="_blank">http://www.winpicprog.co.uk/pic_tutorial_lcd_board.htm</a>
<a href="http://www.piclist.com/techref/microchip/portpins.htm" TARGET="_blank">http://www.piclist.com/techref/microchip/portpins.htm</a>
___________________________
This message was ported from CCS's old forum
Original Post ID: 11769 |
|
|
Mark
Joined: 07 Sep 2003 Posts: 2838 Location: Atlanta, GA
|
Re: LCD on Analog Port |
Posted: Sun Feb 16, 2003 4:04 pm |
|
|
They are for pin A4 on the 16F873!
:=Not sure that resistors are required!! I have had this code working on port A of a 16F84 without pullup resistors and the port doesn't have any internally.
:=
:=Thanks
:=
:=
:=:=Hi,
:=:=Can anyone please solve this. I am trying to run an LCD display off of port a on a 16F873. As far as I know I have disabled the analog and enabled the digital IO on that port but the LCD refuses to initialise.
:=:=
:=:=Any suggestions?
:=:=
:=:=/*
:=:= ---------
:=:= +5--20-|Vdd |
:=:= +5---1-|Mclr |
:=:= Gnd---8-|Vss |
:=:= Gnd--19-|Vss |
:=:= 4MHz--10-|Xtal |
:=:= 4MHz---9-|Xtal |
:=:= | |
:=:= | 16F873 |
:=:= | |
:=:= | |
:=:= | |
:=:= | |
:=:= | |
:=:= | |
:=:= | |
:=:= | | ---------
:=:= | A0|-15--11-|D4 |
:=:= | A1|-16--12-|D5 |
:=:= | A2|-17--13-|D6 |
:=:= | A3|-18--14-|D7 |
:=:= | | | |-3--20K pot (contrast)
:=:= | A4|-14---6-|EN |
:=:= | A5|-13---4-|RS |
:=:= | | | |
:=:= | | +5-2-| |
:=:= | | Gnd-1-| |
:=:= | | Gnd-5-| |
:=:= | | | DISPLAY |
:=:= --------- ---------
:=:=
:=:=*/
:=:=
:=:=#include <16F873.h>
:=:=#include <jonsinc.h>
:=:=#fuses XT, NOPROTECT, NOPUT, NOWDT, NOBROWNOUT, NOLVP, NOCPD, NOWRT
:=:=
:=:=// LCD STUFF
:=:=#define LCD_D0 PIN_A0
:=:=#define LCD_D1 PIN_A1
:=:=#define LCD_D2 PIN_A2
:=:=#define LCD_D3 PIN_A3
:=:=#define LCD_EN PIN_A4
:=:=#define LCD_RS PIN_A5
:=:=#define CLEAR_DISP 0x01
:=:=#use delay ( clock=4000000 )
:=:=#use standard_io ( A )
:=:=
:=:=// These defines are specifically for a 4x16 line display.
:=:=#define LINE_16_1 0x00
:=:=#define LINE_16_2 0x40
:=:=#define LINE_16_3 0x10
:=:=#define LINE_16_4 0x50
:=:=// These defines are specifically for a 4x20 line display.
:=:=#define LINE_20_1 0x00
:=:=#define LINE_20_2 0x40
:=:=#define LINE_20_3 0x14
:=:=#define LINE_20_4 0x54
:=:=
:=:=// These are prototype statements.
:=:=void LCD_SetPosition ( UCHAR cX );
:=:=void LCD_PutChar ( UCHAR cX );
:=:=void LCD_PutCmd ( UCHAR cX );
:=:=void LCD_Init ( void );
:=:=void LCD_PulseEnable ( void );
:=:=void LCD_SetData ( unsigned int cX );
:=:=
:=:=
:=:=
:=:=
:=:=void main( void )
:=:= {
:=:=
:=:= LCD_Init (); // initializes display
:=:= LCD_PutCmd ( CLEAR_DISP ); // clears display
:=:= LCD_SetPosition ( LINE_16_1 ); // sets cursor at offset 0 in first line
:=:= printf ( LCD_PutChar, "Test" ); // displays "Test"
:=:= LCD_SetPosition ( LINE_16_2 + 5 ); // sets cursor at offset 5 in second line
:=:= printf ( LCD_PutChar, "Test" ); // displays "2nd test"
:=:= while ( TRUE ); // halts here
:=:= }
:=:=
:=:=
:=:=
:=:=
:=:=// These are the display subroutines.==============================
:=:=
:=:=
:=:=void LCD_Init ( void )
:=:= {
:=:= setup_adc(NO_ANALOGS); // make all of port a digital
:=:= LCD_SetData ( 0x00 );
:=:= delay_ms ( 200 ); // wait enough time after Vdd rise
:=:= output_low ( LCD_RS );
:=:= LCD_SetData ( 0x03 ); // init with specific nibbles to start 4-bit mode
:=:= LCD_PulseEnable();
:=:= LCD_PulseEnable();
:=:= LCD_PulseEnable();
:=:= LCD_SetData ( 0x02 ); // set 4-bit interface
:=:= LCD_PulseEnable(); // send dual nibbles hereafter, MSN first
:=:= LCD_PutCmd ( 0x2C ); // function set (all lines, 5x7 characters)
:=:= LCD_PutCmd ( 0x0C ); // display ON, cursor off, no blink
:=:= LCD_PutCmd ( 0x01 ); // clear display
:=:= LCD_PutCmd ( 0x06 ); // entry mode set, increment
:=:= }
:=:=
:=:=void LCD_SetPosition ( unsigned int cX )
:=:= {
:=:= // this subroutine works specifically for 4-bit Port A
:=:= LCD_SetData ( swap ( cX ) | 0x08 );
:=:= LCD_PulseEnable();
:=:= LCD_SetData ( swap ( cX ) );
:=:= LCD_PulseEnable();
:=:= }
:=:=
:=:=void LCD_PutChar ( unsigned int cX )
:=:= {
:=:= // this subroutine works specifically for 4-bit Port A
:=:= output_high ( LCD_RS );
:=:= LCD_SetData ( swap ( cX ) ); // send high nibble
:=:= LCD_PulseEnable();
:=:= LCD_SetData ( swap ( cX ) ); // send low nibble
:=:= LCD_PulseEnable();
:=:= output_low ( LCD_RS );
:=:= }
:=:=
:=:=void LCD_PutCmd ( unsigned int cX )
:=:= {
:=:= // this subroutine works specifically for 4-bit Port A
:=:= LCD_SetData ( swap ( cX ) ); // send high nibble
:=:= LCD_PulseEnable();
:=:= LCD_SetData ( swap ( cX ) ); // send low nibble
:=:= LCD_PulseEnable();
:=:= }
:=:=
:=:=void LCD_PulseEnable ( void )
:=:= {
:=:= output_high ( LCD_EN );
:=:= delay_us ( 10 );
:=:= output_low ( LCD_EN );
:=:= delay_ms ( 5 );
:=:= }
:=:=
:=:=void LCD_SetData ( unsigned int cX )
:=:= {
:=:= output_bit ( LCD_D0, cX & 0x01 );
:=:= output_bit ( LCD_D1, cX & 0x02 );
:=:= output_bit ( LCD_D2, cX & 0x04 );
:=:= output_bit ( LCD_D3, cX & 0x08 );
:=:= }
___________________________
This message was ported from CCS's old forum
Original Post ID: 11770 |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|