; File: LCD_P1L.A51 Date: 07/17/92 ; ; /* (c) Copyright BLUE EARTH RESEARCH, MANKATO, MN 1992. */ ; /* All rights reserved. */ ; $ TITLE (4-BIT LCD INTERFACE TO PORT1) $ DEBUG XREF ERRORPRINT NOGEN $ DATE (07-17-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 Port1. Four lines are used ; for data, with two additional controls 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 is tied low (grounded). ; ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ $ EJECT ; ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ; ³ DEFINITIONS SPECIFIC TO THE SYSTEM WIRING ³ ; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ; THE FOLLOWING DEFINITIONS ASSUME THAT THE SYSTEM WIRING IS ; CONFIGURED WITH ALL CONNECTIONS TO PORT 1 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 ; 20 ³ ³ 1 ; RSÄÄÄÄÄÄÄÄÄÄÄ´ P1.4 GND ÃÄÄÄÄÄÄÄÄÄÄÄVss ; 7 ³ ³ 1 ; E ÄÄÄÄÄÄÄÄÄÄÄ´ P1.5 GND ÃÄÄÄÄÄÄÄÄÄÄÄR/W ; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ; The LCD control lines are wired to the controller as follows: ; Note: If the Micro-440's 2nd serial port is not being used, ; the following changes/additions may be made: ; R_W may optionally be used on P1.6 or P1.7. ; RS and Eclk may also be reassigned to P1.6 or P1.7. RS BIT P1.4 Eclk BIT P1.5 ; The following BASIC program can be used to demonstrate the ; functions of the LCD with this program: ; 10 T=100 : C=24 : CALL 7A00H : REM INITIALIZE LCD MODULE ; 30 CALL 7B1EH : 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 ; ÕÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͸ ; ³ TIMER0 INTERRUPT SERVICING ROUTINE ³ ; ÔÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ; Timer0Int: PUSH ACC ; 5 mS interrupt PUSH PSW PUSH DPH PUSH DPL MOV A,TL0 ; Reload Timer 0 for 5 mS ADD A,#LOW -4998 ; (Less 2uS to compensate MOV TL0,A ; for ADD & MOV latency.) MOV TH0,#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: MOV REG_SEL,#0D0H ; POINT TO DATA REGISTER CJNE A,#ESC,WRITE_DATA ; CONTROL CHARACTER? MOV REG_SEL,#0C0H ; OUTPUT TO COMMAND REGISTER 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 ANL A,#0FH ; GET RID OF LOWER HALF ORL A,REG_SEL ; SELECT COMMAND OR DATA MOV P1,A SETB Eclk CLR Eclk MOV A,TEMP_HOLD ; GET LOWER HALF ANL A,#0FH ; OUTPUT OTHER CHAR HALF ORL A,REG_SEL ; SELECT COMMAND OR DATA 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: ; 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. :107A0000E4F51CF51EC200C20190400B7402F0A305 :107A1000747BF0A37498F0C2957519FF51E07590CE :107A2000C3D295C29575190951E07590C351B975C6 :107A300090C351B97590C251B97428F51DC4540F43 :107A400044C0F590D295C295E51D540F44C0F59001 :107A500051B97408F51DC4540F44C0F590D295C2B5 :107A600095E51D540F44C0F59051B951C47406F505 :107A70001DC4540F44C0F590D295C295E51D540F16 :107A800044C0F59051B9740CF51DC4540F44C0F5B1 :107A900090D295C295E51D540F44C0F59051B9E5BB :107AA0008A247AF58A758CEC758911D28CD2A9D288 :107AB000AF22C28CC2A9C2AF22D295C295751A3C20 :107AC000D51AFD227401F51DC4540F44C0F590D29F :107AD00095C295E51D540F44C0F59051B975190A2A :107AE000751AFFD51AFDD519F722741CF51DC4545B :107AF0000F44C0F590D295C295E51D540F44C0F5D2 :107B00009051B9227418F51DC4540F44C0F590D299 :107B100095C295E51D540F44C0F59051B922907B54 :107B2000F28017907C078012907C24800D907C421C :107B30008008907C5D8003907C5DD20185821E3040 :107B40000012E0B41B3DA3E0C5827002158314C58A :107B500082B4012FC083C082904600851C820582BA :107B600085821DD082D083E0B422028005A3C08329 :107B7000C082904600851D82F0051DB422E5D2002A :107B8000C20122C083C082904600851C820582E02B :107B9000B422FA85821D80CBC0E0C0D0C083C082F1 :107BA000E58A247AF58A758CEC051820013B3000B3 :107BB00038904600051C851C82E0B42204C2008077 :107BC00028751BD0B41B09751BC0051C851C82E0E1 :107BD000F51DC4540F451BF590D295C295E51D5473 :107BE0000F451BF590D295C295D082D083D0D0D0CE :107BF000E032426C75652045617274681BC0526545 :107C0000736561726368221B0120204D6963726F86 :107C10002D3434301BC044656D6F6E7374726174A3 :107C2000696F6E221B0154686F6D6173204261633E :107C3000686D616E6E1BC050726F6772616D6D65AD :107C400072221B01202050757420594F55521BC0C1 :0D7C50004D657373616765204845524522FC :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. :106008005512000194204C4344204F4E20504F52CB :1060180054310D15000A54EA3130303A43EA32342B :106028003A8837413030480D0A001E8837423145DA :10603800480D1100289E52EA31A4333ABAE04329A8 :10604800EA300D100032923A9FBAE04329EE543AF2 :1060580095520D0A00468837423233480D110050D8 :106068009E52EA31A4333ABAE04329EA300D1000CF :106078005A923A9FBAE04329EE543A95520D1100CC :10608800649E52EA31A4333A8837414541480D1796 :106098000078BAE04329EA303A923A9FBAE04329B5 :1060A800EE543A95520D140096BAE04329EA303A74 :1060B800923A9FBAE04329EE540D1100A09E52EA8D :1060C80031A4333A8837423034480D1700B4BAE067 :1060D8004329EA303A923A9FBAE04329EE543A9576 :1060E800520D0900C8923A41EABE0D1100D29C41F6 :1060F800EA314648A38837423034480D1100DC9C09 :1061080041EA313448A38837414541480D0A00E641 :10611800A041EA3230480D1100F088374142324838 :0A6128003A8837414334480D010165 :00000001FF