Mr Robert
Here is some code I used for a 4X40 display (the reason for E1 and E2). It may give you an idea how to send data to the LCD from the PC. I assume you have a program that can be written to send and receive data via the serial port in your PC.
Code:' PicBasic program to demonstrate operation of an LCD in 4-bit mode ' LCD DMC40457 W/backlight 16F876 ' LCD should be connected as follows: ' PIN--LCD PIC 4016 ' 4 DB4 PortB.4 ' 3 DB5 PortB.5 ' 2 DB6 PortB.6 ' 1 DB7 PortB.7 ' 11 RS PortB.0 ' E PortB.1 pin 8 & 11 ' 10 RW Ground ' 14 Vdd 5 volts ' 13 Vss Ground ' 12 Vo 10K potentiometer (or ground) ' DB0-3 No connect ' 9 E1 To enable logic ckt pin 9 ' 15 E2 as above pin 10 'Backlight controled via a NPN transistor with 1K resistor from porta.2 to base. ' E1 & E2 controlled via a bilaterial switch 4016 ' portc.4 pin 6 ' portc.5 pin 12 '********************************************************************************* DEFINE LOADER_UESD 1 'Enable bootloader DEFINE OSC 20 ' 20Mhz Xtl DEFINE HSER_RCSTA 90h 'Set up USART DEFINE HSER_TXSTA 24h DEFINE HSER_BAUD 9600 DEFINE LCD_DREG PORTB 'Set up LCD Data Portb DEFINE LCD_DBIT 4 ' bit 4 - 8 data bus DEFINE LCD_RSREG PORTB 'RS portb.0 DEFINE LCD_RSBIT 0 DEFINE LCD_EREG PORTB 'E portb.1 DEFINE LCD_EBIT 1 DEFINE LCD_BITS 4 '4 data bits DEFINE LCD_LINES 2 '2 lines DEFINE LCD_COMMANDUS 2000 DEFINE LCD_DATAUS 50 ADCON1 = 7 'Make porta all digital trisa = %00000000 'Make porta all outputs output portc.4 ' E1 to 4016 output portc.5 ' E2 to 4016 RCIF VAR PIR1.5 ' Alias RCIF (USART Receive Interrupt Flag) OERR VAR RCSTA.1 ' Alias OERR (USART Overrun Error Flag) CREN VAR RCSTA.4 ' Alias CREN (USART Continuous Receive Enable) buffer_size CON 32 ' Sets the size of the ring buffer buffer VAR BYTE[buffer_size] ' Array variable for holding received characters index_in VAR BYTE ' Pointer - next empty location in buffer index_out VAR BYTE ' Pointer - location of oldest character in buffer bufchar VAR BYTE ' Stores the character retrieved from the buffer bufchar1 VAR BYTE i VAR BYTE ' loop counter col VAR BYTE ' Stores location on LCD for text wrapping errflag VAR BYTE ' Holds error flags A VAR BYTE E1 VAR portc.4 'E1 control to 4016 E2 VAR portc.5 'E2 control to 4016 index_in = 0 'Initalize varialbles index_out = 0 i = 0 col = 1 low porta.2 'turn off backlight errflag = 0 ' Reset the error flag INTCON = %11000000 ' Enable interrupts On INTERRUPT GoTo serialin ' Declare interrupt handler routine PIE1 .5 = 1 ' Enable interrupt on USART high E1 ' Enable E1 High E2 ' Enable E2 Pause 500 ' Wait for LCD to startup START: GOSUB OPENING 'Staart lcd display indication Lcdout $fe, 1 'clear LCD low E2 ' Disable E2 turn off second half of display GOTO LOOP LOOP: display: ' dump the buffer to the LCD IF errflag Then error ' Handle error if needed If index_in = index_out Then Loop ' loop if nothing in buffer GoSub getbuf ' Get a character from buffer 'IF bufchar = 253 THEN CONT 'if control character is detected go to control LCDOut bufchar ' Send the character to LCD GoTo display ' Check for more characters in buffer ' Subroutines Disable ' Don't check for interrupts in this section getbuf: ' move the next character in buffer to bufchar index_out = (index_out + 1) ' Increment index_out pointer (0 to 63) If index_out > (buffer_size - 1) Then index_out = 0 ' Reset pointer if outside of buffer bufchar = buffer[index_out] ' Read buffer location IF bufchar = 253 THEN CONT 'if control character is detected go to control Return error: ' Display error message if buffer has overrun IF errflag.1 Then ' Determine the error LCDOut $FE,$c0,"Buffer Overrun" ' Display buffer error on line-2 Else LCDOut $FE,$c0,"USART Overrun" ' Display usart error on line-2 EndIf LCDOut $fe,2 ' Send the LCD cursor back to line-1 home For i = 2 To col ' Loop for each column beyond 1 LCDOut $fe,$14 ' Move the cursor right to the right column Next i errflag = 0 ' Reset the error flag CREN = 0 ' Disable continuous receive to clear overrun flag CREN = 1 ' Enable continuous receive GoTo display ' Carry on ' Interrupt handler serialin: ' Buffer the character received If OERR Then usart_error ' Check for USART errors index_in = (index_in + 1) ' Increment index_in pointer (0 to 63) If index_in > (buffer_size - 1) Then index_in = 0 'Reset pointer if outside of buffer If index_in = index_out Then buffer_error ' Check for buffer overrun HSerin [buffer[index_in]] ' Read USART and store character to next empty location If RCIF Then serialin ' Check for another character while we're here Resume ' Return to program buffer_error: errflag.1 = 1 ' Set the error flag for software ' Move pointer back to avoid corrupting the buffer. MIN insures that it ends up within the buffer. index_in = (index_in - 1) MIN (buffer_size - 1) HSerin [buffer[index_in]] ' Overwrite the last character stored (resets the interrupt flag) usart_error: errflag.0 = 1 ' Set the error flag for hardware Resume ' Return to program cont: index_out = (index_out + 1) ' Increment index_out pointer (0 to 63) If index_out > (buffer_size - 1) Then index_out = 0 ' Reset pointer if outside of buffer bufchar = buffer[index_out] ' Read buffer location if bufchar = "A" then E1_ ' enable 1st half of display if bufchar = "C" then E2_ 'enable 2nd half of display if bufchar = "B" then BL_On 'backlight on if bufchar = "F" then BL_Off 'backlight off goto display E1_: high E1 Low E2 PAUSE 50 Lcdout $fe, 2 goto display E2_ low E1 High E2 Pause 50 Lcdout $fe, 2 goto display BL_On: high porta.2 goto display BL_Off: low porta.2 goto display OPENING: FOR A = 1 TO 2 Lcdout $fe, 1 ' Clear LCD screen Lcdout "LCD" ' Display Hello Pause 500 ' Wait .5 second 'enable debug Lcdout $fe, 1 ' Clear LCD screen Lcdout $FE, $C0 Lcdout "ACTIVE" Pause 500 ' Wait .5 second 'enable debug NEXT A RETURN end




Bookmarks