quoted-printable Content-Disposition: attachment; filename=16f877 include "p16f877.inc" errorlevel 0, -302, -305 __CONFIG _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _HS_OSC & _WRT_ENABLE_ON & _LVP_ON & _DEBUG_OFF & _CPD_OFF ;------------------------------------------------ ; LCD constants LCD_DATAP EQU PORTD ; LCD DATA PORT LCD_CTRLP EQU PORTA ; LCD CONTROL PORT LCD_RS EQU .2 ; RA2 LCD_RW EQU .1 ; RA1 LCD_E EQU .0 ; RA0 LCD_BUSY EQU .7 ; RD7 LCD_DATA_TRIS EQU TRISD LCD_CTRL_TRIS EQU TRISA ;------------------------------------------------ ; memory for variables org 0x20 w_temp res 1 temp1 res 1 temp2 res 1 temp3 res 1 temp4 res 1 ;------------------------------------------------ org 000h goto main org 05h start main call lcd_init call lcd_reset call text1 call line2 call text2 goto $ ; end of main function ;------------------------------------------------ ;------------------------------------------------ lcd_init bsf STATUS, RP0 ; Select Bank1 clrf OPTION_REG ; Deactivate pull-up resistors clrf LCD_DATA_TRIS clrf LCD_CTRL_TRIS bsf ADCON1, PCFG1 ; Datasheet page 111 bsf ADCON1, PCFG2 bcf ADCON1, PCFG3 bcf STATUS, RP0 ; Select Bank0 clrf LCD_DATAP bcf LCD_CTRLP, LCD_E bcf LCD_CTRLP, LCD_RW bcf LCD_CTRLP, LCD_RS return ;------------------------------------------------ lcd_com movwf w_temp ; Copy w so lcd_wait doesn't go over call lcd_wait movf w_temp, w ; Restore w movwf LCD_DATAP ; send comand to data port bcf LCD_CTRLP, LCD_RS ; setup control signals bcf LCD_CTRLP, LCD_RW bsf LCD_CTRLP, LCD_E ; Enable high nop bcf LCD_CTRLP, LCD_E ; Enable low return ;------------------------------------------------ lcd_data movwf w_temp ; Copy w so lcd_wait doesn't go over call lcd_wait movf w_temp, w ; Restore w movwf LCD_DATAP ; send comand to data port bsf LCD_CTRLP, LCD_RS ; setup control signals bcf LCD_CTRLP, LCD_RW bsf LCD_CTRLP, LCD_E ; Enable high nop bcf LCD_CTRLP, LCD_E ; Enable low return ;------------------------------------------------ lcd_reset call Wait15ms ; wait 15ms clrf LCD_DATAP bcf LCD_CTRLP, LCD_RS bcf LCD_CTRLP, LCD_RW bcf LCD_CTRLP, LCD_E call Wait15ms movlw B'00110000' ; 8 bits mode movwf LCD_DATAP bsf LCD_CTRLP, LCD_E nop bcf LCD_CTRLP, LCD_E call Wait5ms movlw B'00110000' ; 8 bits mode movwf LCD_DATAP bsf LCD_CTRLP, LCD_E nop bcf LCD_CTRLP, LCD_E call Wait100us movlw B'00110000' ; 8 bits mode movwf LCD_DATAP bsf LCD_CTRLP, LCD_E nop bcf LCD_CTRLP, LCD_E call Wait5ms movlw B'00110000' ; 8 bits, 2 lines, font 5X8 movwf LCD_DATAP bsf LCD_CTRLP, LCD_E nop bcf LCD_CTRLP, LCD_E call Wait40us movlw B'00001000' ; .8 ; Display off, Blink off call lcd_com ; Cursor off movlw B'00000001' ; .1 ; Clear display, call lcd_com movlw B'00000110' ; .6 ; increment cursor, no scroll call lcd_com movlw B'00001100' ; .12 ; Display on, Cursor off call lcd_com ; Blink off return ;------------------------------------------------ text1 movlw 'H' call lcd_data movlw 'e' call lcd_data movlw 'l' call lcd_data movlw 'l' call lcd_data movlw 'o' call lcd_data movlw '!' call lcd_data movlw '!' call lcd_data return ;------------------------------------------------ text2 movlw ' ' call lcd_data movlw ' ' call lcd_data movlw ' ' call lcd_data movlw 'P' call lcd_data movlw 'I' call lcd_data movlw 'C' call lcd_data movlw '1' call lcd_data movlw '6' call lcd_data movlw 'F' call lcd_data movlw '8' call lcd_data movlw '7' call lcd_data movlw '7' call lcd_data return ;------------------------------------------------ line2 movlw B'10010000' ;beginnig of 3rd line call lcd_com return ;------------------------------------------------ lcd_wait bsf STATUS, RP0 ; Select Bank1 movlw B'11111111' movwf LCD_DATA_TRIS bcf STATUS, RP0 ; Select Bank0 lcd_wait_cont bcf LCD_CTRLP, LCD_RS bsf LCD_CTRLP, LCD_RW bsf LCD_CTRLP, LCD_E nop movf LCD_DATAP, w ; read busy flag from LCD bcf LCD_CTRLP, LCD_E movwf temp1 ; wait until busy flag is set btfsc temp1, LCD_BUSY ; to zero so last data/command is gone goto lcd_wait_cont