NAME LCD_Display_Control PROG SEGMENT CODE STACK SEGMENT IDATA VAR SEGMENT DATA BITVAR SEGMENT BIT DB0 EQU P1.0 DB1 EQU P1.1 DB2 EQU P1.2 DB3 EQU P1.3 DB4 EQU P1.4 DB5 EQU P1.5 DB6 EQU P1.6 DB7 EQU P1.7 EN EQU P3.7 RS EQU P3.6 RW EQU P3.5 LCDDATA EQU P1 RSEG VAR count: DS 1 RSEG BITVAR last_line: DBIT 1 RSEG STACK DS 10H CSEG AT 0 USING 0 JMP START RSEG PROG ;hello world test program START: MOV SP,#STACK-1 ; initialize the stack MOV PSW,#00 ; start using register bank 0 LCALL INIT_LCD LCALL CLEAR_LCD LCALL HELLO_WORLD MAIN_LOOP: ORL PCON, #01 ; put processor to sleep ;return from interrupt here (red-eye), and go back to sleep JMP MAIN_LOOP ;checks the busy bit WAIT_LCD: SETB EN ;Start LCD command CLR RS ;It's a command SETB RW ;It's a read command MOV LCDDATA,#0FFh ;Set all pins to FF initially MOV A,LCDDATA ;Read the return value JB ACC.7,WAIT_LCD ;If bit 7 high, LCD still busy CLR EN ;Finish the command CLR RW ;Turn off RW for future commands RET ;initialize the LCD INIT_LCD: SETB EN CLR RS MOV LCDDATA,#38h CLR EN LCALL WAIT_LCD SETB EN CLR RS MOV LCDDATA,#0Eh CLR EN LCALL WAIT_LCD SETB EN CLR RS MOV LCDDATA,#06h ;trying to add scrolling, originally #06h CLR EN LCALL WAIT_LCD RET ;write a character out to the LCD WRITE_TEXT: SETB EN SETB RS MOV LCDDATA,A CLR EN LCALL WAIT_LCD RET ;clear the display CLEAR_LCD: SETB EN CLR RS MOV LCDDATA,#01h CLR EN LCALL WAIT_LCD RET LINE2: SETB EN CLR RS MOV LCDDATA,#0C0h CLR EN LCALL WAIT_LCD RET LINE1: SETB EN CLR RS MOV LCDDATA,#080h CLR EN LCALL WAIT_LCD RET RETURN_HOME: SETB EN CLR RS MOV LCDDATA,#02h CLR EN LCALL WAIT_LCD RET ;the initial string to appear when the power is turned on HELLO_WORLD: MOV A,#'R' LCALL WRITE_TEXT MOV A,#'o' LCALL WRITE_TEXT MOV A,#'b' LCALL WRITE_TEXT MOV A,#'o' LCALL WRITE_TEXT MOV A,#'t' LCALL WRITE_TEXT MOV A,#' ' LCALL WRITE_TEXT MOV A,#'M' LCALL WRITE_TEXT MOV A,#'a' LCALL WRITE_TEXT MOV A,#'n' LCALL WRITE_TEXT MOV A,#'i' LCALL WRITE_TEXT MOV A,#'a' LCALL WRITE_TEXT MOV A,#'!' LCALL WRITE_TEXT LCALL LINE2 MOV A,#'T' LCALL WRITE_TEXT MOV A,#'h' LCALL WRITE_TEXT MOV A,#'e' LCALL WRITE_TEXT MOV A,#' ' LCALL WRITE_TEXT MOV A,#'M' LCALL WRITE_TEXT MOV A,#'A' LCALL WRITE_TEXT MOV A,#'X' LCALL WRITE_TEXT MOV A,#'X' LCALL WRITE_TEXT MOV A,#' ' LCALL WRITE_TEXT MOV A,#'P' LCALL WRITE_TEXT MOV A,#'r' LCALL WRITE_TEXT MOV A,#'o' LCALL WRITE_TEXT MOV A,#'j' LCALL WRITE_TEXT MOV A,#'e' LCALL WRITE_TEXT MOV A,#'c' LCALL WRITE_TEXT MOV A,#'t' RET END