; File: LCD_P1.A51 Date: 03/05/92 ; ; /* (c) Copyright BLUE EARTH RESEARCH, MANKATO, MN 1992. */ ; /* All rights reserved. */ ; $ TITLE (4-BIT LCD INTERFACE TO PORT1) $ DEBUG XREF ERRORPRINT NOGEN $ DATE (03-05-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 ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ; RSÄÄÄÄÄÄÄÄÄÄÄ´ P1.0 ³ ; 9 ³ ³ ; E ÄÄÄÄÄÄÄÄÄÄÄ´ P1.1 ³ ; 20 ³ ³ +5V ÄÄÄÄÄVcc ; DB4ÄÄÄÄÄÄÄÄÄÄÄ´ P1.4 ³ ; 7 ³ ³ 1 ; DB5ÄÄÄÄÄÄÄÄÄÄÄ´ P1.5 GND ÃÄÄÄÄÄÄÄÄÄÄÄVee ; 19 ³ ³ 1 ; DB6ÄÄÄÄÄÄÄÄÄÄÄ´ P1.6 GND ÃÄÄÄÄÄÄÄÄÄÄÄVss ; 6 ³ ³ 1 ; DB7ÄÄÄÄÄÄÄÄÄÄÄ´ P1.7 GND ÃÄÄÄÄÄÄÄÄÄÄÄR/W ; ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ ; The LCD control lines are wired to the controller as follows: ; Note: R_W may optionally be used on P1.2 or P1.3. ; Eclk may also be reassigned (and wired) to P1.2 or P1.3. ; However, this is only true when wiring the LCD module ; directly to the Micro-440, as the Application Module's ; beeper will affect the P1.3 signal. RS BIT P1.0 Eclk BIT P1.1 ; 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 7B02H : 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,#1 ; POINT TO DATA REGISTER CJNE A,#ESC,WRITE_DATA ; CONTROL CHARACTER? MOV REG_SEL,#0 ; 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 -------------------- ANL A,#0F0H ; 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 SWAP A ANL A,#0F0H ; 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 :107A1000747BF0A3747CF0C2917519FF51CC759002 :107A200030D291C29175190951CC75903051A97518 :107A3000903051A975902851A97428F51D54F0F57E :107A400090D291C291E51DC454F0F59051A97408EB :107A5000F51D54F0F590D291C291E51DC454F0F596 :107A60009051A951B47406F51D54F0F590D291C20D :107A700091E51DC454F0F59051A9740CF51D54F016 :107A8000F590D291C291E51DC454F0F59051A9E54D :107A90008A247AF58A758CEC758911D28CD2A9D298 :107AA000AF22C28CC2A9C2AF22D291C291751A3C38 :107AB000D51AFD227401F51D54F0F590D291C291B2 :107AC000E51DC454F0F59051A975190A751AFFD532 :107AD0001AFDD519F722741CF51D54F0F590D291BA :107AE000C291E51DC454F0F59051A9227418F51DFA :107AF00054F0F590D291C291E51DC454F0F5905127 :107B0000A922907BD68017907BEB8012907C088016 :107B10000D907C268008907C268003907C26D201E4 :107B200085821E300012E0B41B3DA3E0C5827002C6 :107B3000158314C582B4012FC083C082904600858E :107B40001C82058285821DD082D083E0B42202800F :107B500005A3C083C082904600851D82F0051DB438 :107B600022E5D200C20122C083C082904600851C5B :107B7000820582E0B422FA85821D80CBC0E0C0D0AD :107B8000C083C082E58A247AF58A758CEC051820BA :107B9000013B300038904600051C851C82E0B42271 :107BA00004C2008028751B01B41B09751B00051C4D :107BB000851C82E0F51D54F0451BF590D291C291D1 :107BC000E51DC454F0451BF590D291C291D082D0EE :107BD00083D0D0D0E032426C756520456172746804 :107BE0001BC05265736561726368221B0120204DC2 :107BF0006963726F2D3434301BC044656D6F6E73D2 :107C000074726174696F6E221B0154686F6D6173C9 :107C100020426163686D616E6E1BC050726F677247 :067C2000616D6D6572222A :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. :106008005514000194204C434420494E54455246AF :10601800414345200D15000A54EA3130303A43EA2D :1060280032343A8837413030480D0A001E883742EA :106038003032480D1100289E52EA31A4333ABAE0B2 :106048004329EA300D100032923A9FBAE04329EE14 :10605800543A95520D0A00468837423037480D1198 :1060680000509E52EA31A4333ABAE04329EA300D8F :1060780010005A923A9FBAE04329EE543A95520DCD :106088001100649E52EA31A4333A883741443648B5 :106098000D170078BAE04329EA303A923A9FBAE0FD :1060A8004329EE543A95520D140096BAE04329EA72 :1060B800303A923A9FBAE04329EE540D1100A09E5F :1060C80052EA31A4333A8837414543480D1700B4A2 :1060D800BAE04329EA303A923A9FBAE04329EE54AB :1060E8003A95520D0900C8923A41EABE0D1100D204 :1060F8009C41EA314648A38837414543480D110081 :10610800DC9C41EA313448A38837414436480D0ABB :1061180000E6A041EA3230480D1100F088374141CD :0C61280032483A8837414234480D0101EA :00000001FF