; --------------------------------------------------------- ; LCD driver 4bit bus version. ; develop test ; --------------------------------------------------------- ; programed by rerofumi ; --------------------------------------------------------- list p=16f684 include P16F684.INC ; ----- configuration __CONFIG _CP_OFF & _CPD_OFF & _WDT_OFF & _BOD_OFF & _PWRTE_OFF & _INTRC_OSC_NOCLKOUT & _FCMEN_OFF ; ----- define LCDCPORT EQU PORTA LCDPORT EQU PORTC LCD_RS EQU 0 LCD_RW EQU 1 LCD_E EQU 2 LCDHALFTMP EQU 020h LCDDISPTMP EQU 021h ; for test COUNT EQU 030h ; --------------------------------------------------------- ; vector address ; --------------------------------------------------------- ; ------------------------------ ; cold start ; ------------------------------ org 000h goto Main ; ------------------------------ ; interuppt ; ------------------------------ org 004h goto IntStart ; --------------------------------------------------------- ; interrupt ; --------------------------------------------------------- IntStart retfie ; --------------------------------------------------------- ; main routine ; --------------------------------------------------------- Main ; ------------------------------ ; initalize ; ------------------------------ ; -- RAM bank 1 bsf STATUS, RP0 ; clock setting movlw b'01111101' movwf OSCCON ; IO setting movlw 008h movwf TRISA clrf TRISC clrf ANSEL ; Timer0 bcf OPTION_REG, T0CS bcf OPTION_REG, PSA ; -- RAM bank 0 bcf STATUS, RP0 ; comparater off movlw 007h movwf CMCON0 ; port clear clrf PORTA clrf PORTC ; --- LCD initialize call LcdInit4bit bsf LCDCPORT, 4 ; printf check ; ------------------------------ ; LCD test ; ------------------------------ ; com clear movlw 01h call LcdCmdRequest ; curcor position movlw 00h call LcdCursor ; char write movlw 'H' call LcdPutChar movlw 'e' call LcdPutChar movlw 'l' call LcdPutChar movlw 'l' call LcdPutChar movlw 'o' call LcdPutChar movlw ' ' call LcdPutChar movlw 'W' call LcdPutChar movlw 'o' call LcdPutChar movlw 'r' call LcdPutChar movlw 'l' call LcdPutChar movlw 'd' call LcdPutChar movlw '!' call LcdPutChar clrf COUNT ; ------------------------------ ; Halt ; ------------------------------ MainHalt movlw 0f0h ; 19.2ms call LcdSubTm0Wait movlw 0f0h ; 19.2ms call LcdSubTm0Wait movlw 0f0h ; 19.2ms call LcdSubTm0Wait movlw 0f0h ; 19.2ms call LcdSubTm0Wait movlw 0f0h ; 19.2ms call LcdSubTm0Wait bcf LCDCPORT, 4 ; printf check movlw 0f0h ; 19.2ms call LcdSubTm0Wait movlw 0f0h ; 19.2ms call LcdSubTm0Wait movlw 0f0h ; 19.2ms call LcdSubTm0Wait movlw 0f0h ; 19.2ms call LcdSubTm0Wait movlw 0f0h ; 19.2ms call LcdSubTm0Wait bsf LCDCPORT, 4 ; printf check ; ;movlw 006h ;call LcdCursor ;movlw 001h ;addwf COUNT, f ;movf COUNT, w ;call LcdPutHex goto MainHalt ; --------------------------------------------------------- ; LCD control subroutine ; --------------------------------------------------------- ; -------------------------- ; --- LCD Initialize LcdInit4bit ; --- boot up wait movlw 0c0h ; 19.2ms call LcdSubTm0Wait ; --- 8 bit mode request (for stat) movlw 003h movwf LCDPORT bcf LCDCPORT, LCD_RS bcf LCDCPORT, LCD_RW bsf LCDCPORT, LCD_E nop bcf LCDCPORT, LCD_E movlw d'30' call LcdSubTm0Wait movlw 003h movwf LCDPORT bsf LCDCPORT, LCD_E nop bcf LCDCPORT, LCD_E movlw 001h call LcdSubTm0Wait movlw 003h movwf LCDPORT bsf LCDCPORT, LCD_E nop bcf LCDCPORT, LCD_E movlw 001h call LcdSubTm0Wait ; --- 4 bit mode request and initialize movlw 002h movwf LCDPORT bcf LCDCPORT, LCD_RS bcf LCDCPORT, LCD_RW bsf LCDCPORT, LCD_E nop bcf LCDCPORT, LCD_E movlw 010h call LcdSubTm0Wait ; setup movlw 02ch ; 2 line, 5x10 font call LcdCmdRequest movlw 008h ; display off (non cursor) call LcdCmdRequest movlw 00fh ; display on (with cursor nad blink) call LcdCmdRequest movlw 006h ; entry mode call LcdCmdRequest ; return ; -------------------------- ; --- Send Command to LCD ; w = send data (8bit) LcdCmdRequest ; -- RAM bank 0 bcf STATUS, RP0 ; 8bit store movwf LCDHALFTMP swapf LCDHALFTMP, w ; - higher 4bit andlw 00fh movwf LCDPORT ; RS=0 bcf LCDCPORT, LCD_RS ; R/W=0 command request bcf LCDCPORT, LCD_RW ; E = high bsf LCDCPORT, LCD_E nop ; E = low bcf LCDCPORT, LCD_E ; ; - lower 4bit movf LCDHALFTMP, w andlw 00fh movwf LCDPORT ; E = high bsf LCDCPORT, LCD_E nop ; E = low bcf LCDCPORT, LCD_E ; busy wait call LcdSubBusyWait return ; -------------------------- ; --- Send Data to LCD ; w = send data (8bit) LcdPutChar ; -- RAM bank 0 bcf STATUS, RP0 ; 8bit store movwf LCDHALFTMP swapf LCDHALFTMP, w ; - higher 4bit andlw 00fh movwf LCDPORT ; RS=1 bsf LCDCPORT, LCD_RS ; R/W=0 command request bcf LCDCPORT, LCD_RW ; E = high bsf LCDCPORT, LCD_E nop ; E = low bcf LCDCPORT, LCD_E ; ; - lower 4bit movf LCDHALFTMP, w andlw 00fh movwf LCDPORT ; E = high bsf LCDCPORT, LCD_E nop ; E = low bcf LCDCPORT, LCD_E ;movlw 000h ;movwf LCDCPORT ; busy wait call LcdSubBusyWait return ; -------------------------- ; --- Set cursor position on LCD ; w = position ; line1 00h - ; line2 40h - LcdCursor iorlw 080h goto LcdCmdRequest ; -------------------------- ; --- display hex number on LCD ; w = data (8bit) LcdPutHex movwf LCDDISPTMP swapf LCDDISPTMP, w call LcdSubGetHex call LcdPutChar movf LCDDISPTMP, w call LcdSubGetHex call LcdPutChar return ; --------------------------------------- ; LCD internal subroutine ; --------------------------------------- ; -------------------------- ; --- Busy check and wait LcdSubBusyWait clrf LCDHALFTMP ; PORT-C 0-4 is INPUT bsf STATUS, RP0 movlw 00fh movwf TRISC bcf STATUS, RP0 ; status read bcf LCDCPORT, LCD_RS ; RS = 0 bsf LCDCPORT, LCD_RW ; R/W = 1 (read) bsf LCDCPORT, LCD_E ; E = high nop nop movf LCDPORT, w ; read status high bcf LCDCPORT, LCD_E ; E = low andlw 00fh movwf LCDHALFTMP swapf LCDHALFTMP, f bsf LCDCPORT, LCD_E ; E = high nop nop movf LCDPORT, w ; read status low bcf LCDCPORT, LCD_E ; E = low ;andlw 00fh ;iorwf LCDHALFTMP, f ; busy check btfsc LCDHALFTMP, 7 goto LcdSubBusyWait ; ; PORT-C 0-4 is INPUT bsf STATUS, RP0 clrf TRISC bcf STATUS, RP0 bcf LCDCPORT, 1 ; R/W = 0 (write) ; return ; -------------------------- ; --- timer wait ; w = wait count (0.1ms) LcdSubTm0Wait bcf INTCON, T0IF sublw 0ffh movwf TMR0 tm0wait_loop btfss INTCON, T0IF goto tm0wait_loop bcf INTCON, T0IF return ; -------------------------- ; --- int to hex ascii ; w = data (4bit) ; warn! ; lookup table into same segment LcdSubGetHex andlw 00fh addwf PCL, f retlw a'0' retlw a'1' retlw a'2' retlw a'3' retlw a'4' retlw a'5' retlw a'6' retlw a'7' retlw a'8' retlw a'9' retlw a'A' retlw a'B' retlw a'C' retlw a'D' retlw a'E' retlw a'F' ; --- code end END