LIST P=18F2550 #include ;Variable definitions CBLOCK 0x000 d1 d2 d3 scomm sdata TEMP TEMP2 ENDC init CLRF TRISB CLRF PORTB CLRF LATB MOVLW h'0E' ; Switch AN = OFF MOVWF ADCON1 ; MOVLW h'00' ; all PORTB = OUTPUT MOVWF TRISB #define DB4 PORTB, RB0 #define DB5 PORTB, RB1 #define DB6 PORTB, RB2 #define DB7 PORTB, RB3 #define RS PORTB, RB4 #define RW PORTB, RB5 #define E PORTB, RB6 main CALL lcd_init CALL delay_30ms MOVLW 'A' CALL lcd_senddata lcd_init CALL delay_30ms MOVLW b'00000011' MOVWF PORTB ;initialize display interface to 8bit (1) CALL lcd_enable CALL delay_30ms CALL lcd_enable ;initialize display interface to 8bit (2) CALL delay_30ms CALL lcd_enable ;initialize display interface to 8bit (3) CALL delay_30ms MOVLW b'00000010' MOVWF PORTB ;initialize display interface to 4bit CALL lcd_enable CALL delay_30ms MOVLW b'00001110' ;2 rows CALL lcd_sendcommand CALL delay_30ms MOVLW b'00001100' ;Display on CALL lcd_sendcommand CALL delay_30ms MOVLW b'00000110' ;Cursor right, no shift CALL lcd_sendcommand CALL delay_30ms MOVLW b'00000001' ;Clear display CALL lcd_sendcommand lcd_enable BSF E NOP NOP BCF E RETURN lcd_sendcommand BCF RS MOVWF scomm MOVLW b'11110000' ANDWF scomm, 0 MOVWF TEMP ;swap nibbles to fit on the I/O SWAPF TEMP, 1 MOVF PORTB, 0 ;read PORTB MOVWF TEMP2 MOVLW b'11110000' ANDWF TEMP2, 1 MOVF TEMP2, 0 ADDWF TEMP, 0 MOVWF PORTB CALL lcd_enable MOVLW b'00001111' ANDWF scomm, 0 ADDWF TEMP2, 0 MOVWF PORTB CALL lcd_enable CALL delay_100us RETURN lcd_senddata BSF RS MOVWF sdata MOVLW b'11110000' ANDWF sdata, 0 MOVWF TEMP SWAPF TEMP, 1 MOVF PORTB, 0 MOVWF TEMP2 MOVLW b'11110000' ANDWF TEMP2, 1 MOVF TEMP2, 0 ADDWF TEMP, 0 MOVWF PORTB CALL lcd_enable MOVLW b'00001111' ANDWF sdata, 0 ADDWF TEMP2, 0 MOVWF PORTB CALL lcd_enable CALL delay_100us RETURN ;---------------------------------------------------------------------------- ;|Delay subroutines ; ; ; ;---------------------------------------------------------------------------- delay_30ms ;89993 cycles movlw 0x5E movwf d1 movlw 0x47 movwf d2 delay_30ms_0 decfsz d1, f goto $+2 decfsz d2, f goto delay_30ms_0 ;3 cycles goto $+1 nop ;4 cycles (including call) return delay_100us ;295 cycles movlw 0xF2 movwf d1 delay_100us_0 decfsz d1, f goto delay_100us_0 ;1 cycle nop ;4 cycles (including call) return END