; File: LCD_P1-3.A51 Date: 10/23/92 ; ; /* (c) Copyright BLUE EARTH RESEARCH, MANKATO, MN 1992. */ ; /* All rights reserved. */ ; $ TITLE (4-BIT LCD INTERFACE USING P1 & P3) $ DEBUG XREF ERRORPRINT $ NOGEN $ DATE (10-23-92) $ PW(96) PL(60) ; ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ» ; º º ; º LCD MODULE SOFTWARE DRIVER ROUTINE º ; º º ; ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ ; ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸ ; ³ Written By: Thomas Bachmann ³ ; ³ Blue Earth Research, Mankato, MN 56001 ³ ; ÔÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ; ; This program implements a 4-bit interface to a LCD module ; using a total of 6 I/O lines on P1 & P3. Four lines are used ; for data, with two additional Port3 lines for "Register ; Select" and "E". The Register Select line is used to specify ; whether data is currently being written to the Command or ; Data register. The E signal is used to clock the data to the ; LCD module. A third control line, R/W, is not used in this ; application. Since data will only be written to the LCD, ; the R/W line should be tied low (grounded). ; ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ $ EJECT ; ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ; ³ DEFINITIONS SPECIFIC TO THE SYSTEM WIRING ³ ; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ; THE FOLLOWING DEFINITIONS ASSUME THAT THE SYSTEM WIRING IS ; CONFIGURED WITH ALL CONNECTIONS TO PORT1 & PORT3 AS FOLLOWS: ; SIGNAL CONTROLLER SIGNAL ; -------- ------------ -------- ; 22 ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ; DB4ÄÄÄÄÄÄÄÄÄÄÄ´ P1.0 ³ ; 9 ³ ³ ; DB5ÄÄÄÄÄÄÄÄÄÄÄ´ P1.1 ³ ; 21 ³ ³ +5V ÄÄÄÄÄVcc ; DB6ÄÄÄÄÄÄÄÄÄÄÄ´ P1.2 ³ ; 8 ³ ³ 1 ; DB7ÄÄÄÄÄÄÄÄÄÄÄ´ P1.3 GND ÃÄÄÄÄÄÄÄÄÄÄÄVee ; 17 ³ ³ 1 ; RSÄÄÄÄÄÄÄÄÄÄÄ´ P3.4 GND ÃÄÄÄÄÄÄÄÄÄÄÄVss ; 4 ³ ³ 1 ; E ÄÄÄÄÄÄÄÄÄÄÄ´ P3.5 GND ÃÄÄÄÄÄÄÄÄÄÄÄR/W ; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ; The LCD control lines are wired to the controller as follows: RS BIT P3.4 Eclk BIT P3.5 ; Note that both of these signals can be reassigned to any ; of the available Port 3 signals (P3.2, P3.3, P3.4, P3.5) ; simply by changing the above definitions. ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ $ EJECT ; The following BASIC program can be used to demonstrate the ; functions of the LCD with this program: ; 1 REM SAMPLE LCD DRIVER ; 10 T=100 : C=24 : CALL 7A00H : REM INITIALIZE LCD MODULE ; 30 CALL 7B0EH : REM PRINT SIGN-ON MESSAGE ; 40 FOR R = 1 TO 3 : DBY(C)=0 : REM SET UP CLOCK ; 50 DO : WHILE DBY(C) AND CLEAR_DISPLAY MOVX A,@DPTR ; GET FIRST BYTE CJNE A,#ESC,FIND_END ; NOT A ZERO INC DPTR ; POINT TO INSTRUCTION BYTE MOVX A,@DPTR XCH A,DPL ; DECREMENT THE DPTR JNZ DECDP DEC DPH DECDP: DEC A XCH A,DPL CJNE A,#CLEAR_DISPLAY,FIND_END $ EJECT LOAD_IT: PUSH DPH PUSH DPL MOV DPTR,#LCD_BUFFER MOV DPL,LCD_POINTER INC DPL MOV TEMP_HOLD,DPL ; SAVE THE LCD BUFFER POINTER NEXT_CHAR: POP DPL POP DPH MOVX A,@DPTR ; GET NEXT CHAR TO SEND CJNE A,#'"',MORE_CHARS SJMP ONE_MORE MORE_CHARS: INC DPTR ; SET UP FOR NEXT CHARACTER PUSH DPH PUSH DPL ONE_MORE: MOV DPTR,#LCD_BUFFER MOV DPL,TEMP_HOLD MOVX @DPTR,A INC TEMP_HOLD CJNE A,#'"',NEXT_CHAR SETB LCD_DATA ; CHARS READY FOR LCD CLR DOING_LCD RET FIND_END: ; FIND THE LAST CHARACTER IN THE OUTPUT BUFFER PUSH DPH PUSH DPL MOV DPTR,#LCD_BUFFER MOV DPL,LCD_POINTER ; LOAD THE CURRENT POINTER GET_END_CHAR: INC DPL MOVX A,@DPTR CJNE A,#'"',GET_END_CHAR ; FOUND THE END OF THE OUTPUT BUFFER MOV TEMP_HOLD,DPL ; SAVE THE LCD BUFFER POINTER SJMP NEXT_CHAR $ EJECT ; ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸ ; ³ TIMER1 INTERRUPT SERVICING ROUTINE ³ ; ÔÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ; Timer1Int: PUSH ACC ; 5 mS interrupt PUSH PSW PUSH DPH PUSH DPL MOV A,TL1 ; Reload Timer 1 for 5 mS ADD A,#LOW -4998 ; (Less 2uS to compensate MOV TL1,A ; for ADD & MOV latency.) MOV TH1,#HIGH -4998 INC Clock ; UPDATE TIMER FOR BASIC ; ---------------------- LCD UPDATE --------------------------- DO_LCD: JB DOING_LCD,TIME1 ; Wait until next loop JNB LCD_DATA,TIME1 ; Check for LCD Chars MOV DPTR,#LCD_BUFFER ; POINT TO BUFFER INC LCD_POINTER ; POINT TO NEXT CHARACTER MOV DPL,LCD_POINTER MOVX A,@DPTR ; GET IT CJNE A,#'"',VALID_CHAR ; DONE YET? CLR LCD_DATA ; NO MORE CHARACTERS NOW SJMP TIME1 VALID_CHAR: SETB RS ; POINT TO DATA REGISTER CJNE A,#ESC,WRITE_DATA ; CONTROL CHARACTER? CLR RS INC LCD_POINTER MOV DPL,LCD_POINTER MOVX A,@DPTR ; GET IT WRITE_DATA: MOV TEMP_HOLD,A ; SAVE IT $ EJECT ; ------------------ OUTPUT CHARACTER HALF -------------------- SWAP A ORL A,#0F0H ; OUTPUT 1's ON UPPER HALF MOV P1,A SETB Eclk CLR Eclk MOV A,TEMP_HOLD ; GET LOWER HALF ORL A,#0F0H ; OUTPUT OTHER CHAR HALF MOV P1,A SETB Eclk CLR Eclk TIME1: ;* Any other function that needs to be executed every *; ;* 5 mS should be programmed here. *; AllDone: POP DPL ; Tail end of 5 mS interrupt POP DPH POP PSW POP ACC RETI $ EJECT ; ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸ ; ³ CHARACTER STRING DEFINITIONS ³ ; ÔÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ; MSG1: DB 'Blue Earth' DB ESC,LINE2_0,'Research"' MSG2: DB ESC,CLEAR_DISPLAY,' Micro-440' DB ESC,LINE2_0,'Demonstration"' MSG3: DB ESC,CLEAR_DISPLAY,'Thomas Bachmann' DB ESC,LINE2_0,'Programmer"' MSG4: DB ESC,CLEAR_DISPLAY,' Put YOUR' DB ESC,LINE2_0,'Message HERE"' MSG5: ; Any number of messages may be placed here for MSG6: ; displaying on the LCD. Note that commands MSG7: ; are preceeded by an ESC, and each message MSG8: ; must end with a quote character ("). MSG9: LastMSG: ; ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ ; END OF PROGRAM END ; Following is the HEX file derived from the assembled source ; file. This can be used for directly loading the program via ; MONITOR-51 and almost any terminal program. :107A0000E4F51AC200C20190401B7402F0A3747B1B :107A1000F0A37485F0C2B57519FF51D47590F3D2F7 :107A2000B5C2B575190951D47590F351AF7590F37E :107A300051AF7590F251AFC2B47428F51BC444F035 :107A4000F590D2B5C2B5E51B44F0F59051AFC2B484 :107A50007408F51BC444F0F590D2B5C2B5E51B44DB :107A6000F0F59051AF51BAC2B47406F51BC444F09E :107A7000F590D2B5C2B5E51B44F0F59051AFC2B454 :107A8000740CF51BC444F0F590D2B5C2B5E51B44A7 :107A9000F0F59051AFE58B247AF58B758DEC7589F7 :107AA00011D28ED2ABD2AF22C28EC2ABC2AF22D223 :107AB000B5C2B575183CD518FD22C2B47401F51BCA :107AC000C444F0F590D2B5C2B5E51B44F0F5905131 :107AD000AF75190A7518FFD518FDD519F722C2B46C :107AE000741CF51BC444F0F590D2B5C2B5E51B4437 :107AF000F0F59051AF22C2B47418F51BC444F0F5F0 :107B000090D2B5C2B5E51B44F0F59051AF22907B01 :107B1000D98017907BEE8012907C0B800D907C2991 :107B20008008907C448003907C44D201300012E0B5 :107B3000B41B3DA3E0C5827002158314C582B40155 :107B40002FC083C082905000851A82058285821BD7 :107B5000D082D083E0B422028005A3C083C082908B :107B60005000851B82F0051BB422E5D200C2012221 :107B7000C083C082905000851A820582E0B422FA48 :107B800085821B80CBC0E0C0D0C083C082E58B243F :107B90007AF58B758DEC0518200135300032905048 :107BA00000051A851A82E0B42204C2008022D2B4F1 :107BB000B41B08C2B4051A851A82E0F51BC444F050 :107BC000F590D2B5C2B5E51B44F0F590D2B5C2B57B :107BD000D082D083D0D0D0E032426C756520456130 :107BE0007274681BC05265736561726368221B0101 :107BF00020204D6963726F2D3434301BC044656D95 :107C00006F6E7374726174696F6E221B0154686FBA :107C10006D617320426163686D616E6E1BC050724E :107C20006F6772616D6D6572221B01202050757443 :107C300020594F55521BC04D6573736167652048CD :047C40004552452242 :00000001FF ; Following is the HEX file derived from loading the BASIC ; program to the controller's ROMsim Memory. Note that the ; REM statements have been removed from the program lines. :1060080055170001942053414D504C45204C4344B2 :10601800204452495645520D15000A54EA31303091 :106028003A43EA32343A8837413030480D0A001E84 :106038008837423045480D1100289E52EA31A43372 :106048003ABAE04329EA300D100032923A9FBAE09A :106058004329EE543A95520D0A00468837423133A7 :10606800480D1100509E52EA31A4333ABAE0432950 :10607800EA300D10005A923A9FBAE04329EE543A9A :1060880095520D1100649E52EA31A4333A88374183 :106098004445480D170078BAE04329EA303A923A65 :1060A8009FBAE04329EE543A95520D140096BAE08F :1060B8004329EA303A923A9FBAE04329EE540D1147 :1060C80000A09E52EA31A4333A8837414636480D3B :1060D8001700B4BAE04329EA303A923A9FBAE0434B :1060E80029EE543A95520D0900C8923A41EABE0D7C :1060F8001100D29C41EA314648A3883741463648C8 :106108000D1100DC9C41EA313448A38837414445ED :10611800480D0A00E6A041EA3230480D1100F08827 :0F61280037414138483A8837414241480D01011B :00000001FF