;LCD control test program INCLUDE"p16F84A.inc" list p=16F84A __CONFIG _HS_OSC & _WDT_OFF & _PWRTE_OFF & _CP_OFF Memory EQU 0x0C DX EQU Memory+0 ; "DX" File Register for LCD DXX EQU Memory+1 ; "DXX" File Register for LCD WORK1 EQU Memory+2 ; File Register for Cursor Position (1st line) TIME1 EQU Memory+3 TIME2 EQU Memory+4 mem1 equ Memory+5 CUR1 EQU Memory+6 ORG 0 GOTO START ORG 4 START ;------------Port Setting----------------------- BSF STATUS, RP0 ;selection of Bank1 MOVLW 0x00 MOVWF TRISA ;PORTA: output MOVLW B'00000111' MOVWF TRISB ;RB0-2: input, RB3-7: output BCF STATUS, RP0 ;selection of Bank0 ;----------------------------------------------- ;----------------------------------------------- CALL ini_lcd ;Initialization ;----------------------------------------------- movlw B'10000000' call SETMODE movlw 0x26 ;"&" call PUTCHAR movlw B'10001111' call SETMODE movlw 0x24 ; "$" call PUTCHAR ;------------------Main Routine----------------- LOOP1 BTFSS PORTB,0 ;If RB0 = 1 then skip next line CALL move1 ; else CALL MOV1 BTFSS PORTB,1 ;If RB1 = 1 then skip next line CALL move2 ; else CALL MOV2 BTFSS PORTB,2 ;If RB2 = 1 then skip next line CALL move3 ; else CALL MOV3 GOTO LOOP1 ;----------------------------------------------- ;---------------------- If RB0 = 0 then [ka-me-] ---------------- move1 movlw b'11001111' movwf CUR1 movlw 0x14 movwf mem1 move11 MOVF CUR1,0 ;Cursor position on the 1st line MOVWF WORK1 CALL SETMODE ;Cursor position setting routine MOVLW 0xb6 ;Chara Code -> Working Register CALL PUTCHAR ;Displaying "Chara" routine ;----- INCF WORK1,1 MOVF WORK1,0 CALL SETMODE MOVLW 0xb0 CALL PUTCHAR ;----- INCF WORK1,1 MOVF WORK1,0 CALL SETMODE MOVLW 0xd2 CALL PUTCHAR ;----- INCF WORK1,1 MOVF WORK1,0 CALL SETMODE MOVLW 0xb0 CALL PUTCHAR ;----- INCF WORK1,1 MOVF WORK1,0 CALL SETMODE MOVLW 0x20 CALL PUTCHAR movlw D'255' call wait_ms decf CUR1,1 movf CUR1,0 movwf WORK1 decfsz mem1,1 goto move11 return ;--------------------------------------------------------------- ;---------------------If RB1 = 0 then [ha-me-] ----------------- move2 movlw b'11001111' movwf CUR1 movlw 0x14 movwf mem1 move21 MOVF CUR1,0 ;Cursor position on the 1st line MOVWF WORK1 CALL SETMODE ;Cursor position setting routine MOVLW 0xca ;Chara Code -> Working Register CALL PUTCHAR ;Displaying "Chara" routine ;----- INCF WORK1,1 MOVF WORK1,0 CALL SETMODE MOVLW 0xb0 CALL PUTCHAR ;----- INCF WORK1,1 MOVF WORK1,0 CALL SETMODE MOVLW 0xd2 CALL PUTCHAR ;----- INCF WORK1,1 MOVF WORK1,0 CALL SETMODE MOVLW 0xb0 CALL PUTCHAR ;----- INCF WORK1,1 MOVF WORK1,0 CALL SETMODE MOVLW 0x20 CALL PUTCHAR movlw D'255' call wait_ms decf CUR1,1 movf CUR1,0 movwf WORK1 decfsz mem1,1 goto move21 return ;---------------------------------------------------------------------- ;------------------- If RB2 = 0 then [ha- ========) ] ---------------- move3 movlw b'11000000' movwf CUR1 movlw 0x14 movwf mem1 MOVF CUR1,0 ;Cursor position on the 1st line MOVWF WORK1 CALL SETMODE ;Cursor position setting routine MOVLW 0xca ;Chara Code -> Working Register CALL PUTCHAR ;Displaying "Chara" routine ;----- INCF WORK1,1 MOVF WORK1,0 CALL SETMODE MOVLW 0xb0 CALL PUTCHAR ;----- movlw b'10000010' call SETMODE movlw 0x7f call PUTCHAR movlw b'10000010' move31 movwf CUR1 movf CUR1,0 movwf WORK1 call SETMODE movlw 0x29 call PUTCHAR decF WORK1,1 MOVF WORK1,0 CALL SETMODE MOVLW 0x3d CALL PUTCHAR ;----- movlw D'255' call wait_ms incf CUR1,1 movf CUR1,0 movwf WORK1 decfsz mem1,1 goto move31 movlw b'10000011' call SETMODE movlw 0x20 call PUTCHAR movlw b'10000100' call SETMODE movlw 0x20 call PUTCHAR movlw b'10000101' call SETMODE movlw 0x20 call PUTCHAR movlw b'10000110' call SETMODE movlw 0x20 call PUTCHAR movlw b'10000111' call SETMODE movlw 0x20 call PUTCHAR movlw b'10001000' call SETMODE movlw 0x20 call PUTCHAR movlw b'10001001' call SETMODE movlw 0x20 call PUTCHAR movlw b'10001010' call SETMODE movlw 0x20 call PUTCHAR movlw b'10001011' call SETMODE movlw 0x20 call PUTCHAR movlw b'100001100' call SETMODE movlw 0x20 call PUTCHAR movlw b'10001101' call SETMODE movlw 0x20 call PUTCHAR movlw b'10001110' call SETMODE movlw 0x20 call PUTCHAR movlw b'10001111' call SETMODE movlw 0xf4 call PUTCHAR movlw b'11000000' call SETMODE movlw 0xce call PUTCHAR movlw b'11000001' call SETMODE movlw 0xde call PUTCHAR movlw b'11000010' call SETMODE movlw 0xdd call PUTCHAR movlw D'255' call wait_ms movlw D'255' call wait_ms movlw D'255' call wait_ms movlw b'11000000' call SETMODE movlw 0x20 call PUTCHAR movlw b'11000001' call SETMODE movlw 0x20 call PUTCHAR movlw b'11000010' call SETMODE movlw 0x20 call PUTCHAR movlw b'10000010' call SETMODE movlw 0x20 call PUTCHAR movlw B'10001111' call SETMODE movlw 0x24 call PUTCHAR return ;----------------------------------------------------- ;----------Cursor Pos. Setting Mode-------------------- SETMODE BCF PORTA,1 ;RS = 0 (LCD: Cursor position setting mode) MOVWF DXX CALL WR_LCD4 RETURN ;----Character Display Routine----------- PUTCHAR BSF PORTA,1 ;RS =1 (LCD: Character writing mode) MOVWF DXX CALL WR_LCD4 RETURN WR_LCD8 MOVF DX,0 ;LCD mode setting and character writing routine MOVWF PORTB NOP BSF PORTA,0 NOP BCF PORTA,0 MOVLW D'20' call wait_ms RETURN WR_LCD4 MOVF DXX,0 MOVWF DX CALL WR_LCD8 SWAPF DX,1 CALL WR_LCD8 RETURN ;--------Waiting time Routine-------------- wait_ms MOVWF TIME1 ; STEPM MOVLW 0xFF ; MOVWF TIME2 STEPM1 MOVLW 0xFF DECFSZ TIME2,1 GOTO STEPM1 DECFSZ TIME1,1 GOTO STEPM RETURN ;--------Initialization----------------- ini_lcd MOVLW D'255' call wait_ms MOVLW B'00000000' MOVWF PORTA MOVLW B'00110000' MOVWF DX CALL WR_LCD8 MOVLW D'255' call wait_ms MOVLW B'00110000' MOVWF DX CALL WR_LCD8 MOVLW D'255' call wait_ms MOVLW B'00110000' MOVWF DX CALL WR_LCD8 MOVLW B'00100000' MOVWF DX CALL WR_LCD8 MOVLW B'00101000' MOVWF DXX CALL WR_LCD4 MOVLW B'00000001' MOVWF DXX CALL WR_LCD4 MOVLW D'255' call wait_ms MOVLW B'00000110' MOVWF DXX CALL WR_LCD4 MOVLW B'00001110' MOVWF DXX CALL WR_LCD4 RETURN END