;----------------------------------------------------------------------------------------; ;THIS PROGRAM DISPLAYS THE SERIAL DATA RECEIVED AT THE 8051 SERIAL PORT ON A 16X2 LCD ; ;IF YOU WANT TO LEARN MORE ABOUT LCDs TRY THE FOLLOWING LINKS: ; ; http://www.geocities.com/kool_projects/lcd1.pdf ; ;and ; ; http://www.geocities.com/kool_projects/lcd2.pdf ; ; ;----------------------------------------------------------------------------------------; ;This code is written by Mubashar Yasin(Islamabad,Pakistan).It is freely distributable ; ;however please distribute it with my name and if you add this code to your website or ; ;some other publication then mention about me along with this code.I have tested this ; ;code to work properly even then there is no guarantee or warranty and i cannot be held ; ;responsible for any damage or loss due to this code.If you have any querries about this ; ;code please contact me at: ; ; ; ; kool_projects@yahoo.com ; ; mubasharpk09@hotmail.com ; ; ; ;or visit my website: ; ; ; ; http://www.geocities.com/kool_projects ; ;----------------------------------------------------------------------------------------; EN EQU P3.5 RW EQU P3.6 RS EQU P3.7 DAT EQU P1 ORG 0000H LJMP MAIN ORG 0023H LJMP SERIAL_ISR ;;;;;;;;;;;;;;;; SERIAL_ISR: ;;;;;;;;;;;;;;;; JB TI,EXIT0 MOV A,SBUF CLR RI LCALL WRITE_CHAR LJMP EXIT1 EXIT0: CLR TI EXIT1: RETI ;;;;;;;;;;;;;;;;; INIT_LCD: ;;;;;;;;;;;;;;;;; CLR RS MOV DAT,#38h ;8-BIT DATA LINE, 5X8 DOT CHARACTER FONT SETB EN CLR EN LCALL WAIT_LCD CLR RS MOV DAT,#0Ch ;TURN ON (LCD + CURSOR)//0EH TO TURN ON CURSOR SETB EN CLR EN LCALL WAIT_LCD CLR RS MOV DAT,#07h ;???06,SHIFT THE CURSOR ONE POSITION RIGHT WHEN A CHAR. IS WRITTEN SETB EN CLR EN LCALL WAIT_LCD /* MOV DAT,#18h ;SHIFT THE DISPLAY ONE POSITION LEFT WHEN A CHAR. IS WRITTEN SETB EN CLR EN LCALL WAIT_LCD*/ RET ;;;;;;;;;;;;;;;;; WAIT_LCD: ;;;;;;;;;;;;;;;;; WAIT: CLR RS ;It's a command SETB RW ;It's a read command MOV DAT,#0xFF ;Set all pins to FF initially CLR EN ;Clock out command to LCD SETB EN ;Status out JB P1.7,WAIT ;If bit 7 high, LCD still busy CLR EN ;Finish the command CLR RW ;Turn off RW for future commands RET ;;;;;;;;;;;;;;;;; CLEAR_LCD: ;;;;;;;;;;;;;;;;; CLR RS MOV DAT,#01h SETB EN CLR EN LCALL WAIT_LCD RET ;;;;;;;;;;;;;;;;; WRITE_CHAR: ;;;;;;;;;;;;;;;;; SETB RS MOV DAT,A SETB EN CLR EN LCALL WAIT_LCD RET ;;;;;;;;;;;;;;;;; SELECT_CURPOS: ;CURSOR POSITION ;;;;;;;;;;;;;;;;; PUSH ACC CLR RS MOV A,B ADD A,#080H MOV DAT,A ;PLACE CURSOR ON REQUIRED POSITION SETB EN CLR EN LCALL WAIT_LCD POP ACC RET ;;;;;;;;;;;;;;;; SERIAL_INIT: ;;;;;;;;;;;;;;;; MOV SCON,#52H ;8-BIT UART,REN MOV TMOD,#20H ;8-BIT AUTO RELOAD MODE MOV TH1,#-3 ;9600 BPS AUTO RELOAD VALUE SETB EA ;GLOBAL INTERRUPT ENABLE SETB ES ;SERIAL INTERRUPT ENABLE SETB PS ;HIGH PRIORITY FOR SERIAL INTERRUPTS SETB TR1 ;START TIMER RET ;;;;;;;;;;;;;;;;; MAIN: ;;;;;;;;;;;;;;;;; MOV R0,#0H LCALL INIT_LCD LCALL CLEAR_LCD LCALL SERIAL_INIT JMP $ END