Nguyên văn bởi DSP
Chương trình đơn giản hiển thị LCD, ĐK 4bit đây:
;************************************************* ************************************************** ***********************************************
; DIEU KHIEN HIEN THI LCD ;
; CHE DO 4 BIT ;
; Start: 19/09/09 ;
; Complete:19/09/09 ;
; AUTHOR: DN ;
; COMPANY: COMPANY ;
; VERSION:1.0 ;
; DESCRIPTION: ;
; PIC16F688,LCD LM032L ;
; PORTA: KHOI TAO LCD ;
; PORTB: XUAT DL ;
; HIEN THI: PICVIETNAM.COM ;
;************************************************* ************************************************** ***********************************************
TITLE DIEU KHIEN HIEN THI LCD - CHE DO4 BIT
PROCESSOR PIC16F688
INCLUDE <P16F688.INC>
INCLUDE <lm032l.h>
__CONFIG _CP_OFF & _CPD_OFF & _WDT_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT & _BOD_OFF & _FCMEN_OFF
RS EQU 0X00
RW EQU 0X01
E EQU 0X02
PA EQU PORTA
PC EQU PORTC
TEMP1 EQU 0x070
TC EQU TRISC
TA EQU TRISA
ORG 0000h
Goto MAIN
;************************************************* ************************************************** ************************************************
SEND_CMD
MOVWF CHAR ; Character to be sent is in W
CALL BUSY_CHECK ; Wait for LCD to be ready
SWAPF CHAR, W
ANDLW 0x0F ; Get upper nibble
MOVWF PC ; Send data to LCD
BCF PA, RW ; Set LCD to read
BCF PA, RS ; Set LCD to command mode
BSF PA, E ; toggle E for LCD
BCF PA, E
MOVF CHAR, W
ANDLW 0x0F ; Get lower nibble
MOVWF PC ; Send data to LCD
BSF PA, E ; toggle E for LCD
BCF PA, E
RETURN
BUSY_CHECK
bsf STATUS,RP0
bcf STATUS,RP1
MOVLW 0xFF ; Set PortC for input
MOVWF TC
bcf STATUS,RP0
bcf STATUS,RP1
BCF PA, RS ; Set LCD for Command mode
BSF PA, RW ; Setup to read busy flag
BSF PA, E ; Set E high
BCF PA, E ; Set E low
SWAPF PC, W ; Read upper nibble busy flag, DDRam address
ANDLW 0xF0 ; Mask out lower nibble
MOVWF TEMP ;
BSF PA, E ; Toggle E to get lower nibble
BCF PA, E
MOVF PC, W ; Read lower nibble busy flag, DDRam address
ANDLW 0x0F ; Mask out upper nibble
IORWF TEMP, F ; Combine nibbles
BTFSC TEMP, 7 ; Check busy flag, high = busy
GOTO BUSY_CHECK ; If busy, check again
BCF PA, RW
bsf STATUS,RP0
bcf STATUS,RP1
MOVLW 0xF0 ;
MOVWF TC ;
bcf STATUS,RP0
bcf STATUS,RP1
RETURN
SEND_CHAR
MOVWF CHAR ; Character to be sent is in W
CALL BUSY_CHECK ; Wait for LCD to be ready
SWAPF CHAR, W
ANDLW 0x0F ; Get upper nibble
MOVWF PC ; Send data to LCD
BCF PA, RW ; Set LCD to read
BSF PA, RS ; Set LCD to data mode
BSF PA, E ; toggle E for LCD
BCF PA, E
MOVF CHAR, W
ANDLW 0x0F ; Get lower nibble
MOVWF PC ; Send data to LCD
BSF PA, E ; toggle E for LCD
BCF PA, E
RETURN
;************************************************* ************************************************** *******
MAIN
;External ossilator
bcf STATUS,RP0 ; bank0
bcf STATUS,RP1
clrf PA
clrf PC ;Digital I/O
movlw 07h
movwf CMCON0
bsf STATUS,RP0 ;bank1
bcf STATUS,RP1
bcf OSCCON,SCS ;external osscilator mode bit select
clrf ANSEL
clrf TA
clrf TC
;
;KHOI TAO LCD
bcf STATUS,RP0 ; bank0
bcf STATUS,RP1
clrf PA
movlw 0x02
movwf PC
bsf PA,E
bcf PA,E
LCD_DELAY MOVLW 200h ;
MOVWF MSD ; Use MSD and LSD Registers to Initilize LCD
CLRF LSD ;
LOOP2 DECFSZ LSD, F ; Delay time = MSD * ((3 * 256) + 3) * Tcy
GOTO LOOP2 ;
DECFSZ MSD, F ;
END_LCD_DELAY
GOTO LOOP2
;che do 4 bit
movlw 0x02
movwf PC
bsf PA,E
bcf PA,E
;2dong,5*7 dots
movlw 0x08
movwf PC
bsf PA,E
bcf PA,E
MOVLW DISP_ON ;
CALL SEND_CMD ;
movlw 'D'
call SEND_CHAR
movlw 'i'
call SEND_CHAR
movlw 'e'
call SEND_CHAR
movlw 'n'
call SEND_CHAR
movlw ' '
call SEND_CHAR
movlw 'd'
call SEND_CHAR
movlw 'a'
call SEND_CHAR
movlw 'n'
call SEND_CHAR
movlw ':'
call SEND_CHAR
movlw B'11000000' ;Address DDRam first character, second line
call SEND_CMD
movlw 0 ;Table address of start of message
dispmsg
movwf TEMP1 ;TEMP1 holds start of message address
call Table
andlw 0FFh ;Check if at end of message (zero
btfsc STATUS,Z ;returned at end)
goto $;out
call SEND_CHAR ;Display character
movf TEMP1,w ;Point to next character
addlw 1
goto dispmsg
Table
addwf PCL, F
retlw 'P'
retlw 'I'
retlw 'C'
retlw 'V'
retlw 'I'
retlw 'E'
retlw 'T'
retlw 'N'
retlw 'A'
retlw 'M'
retlw '.'
retlw 'C'
retlw 'O'
retlw 'M'
Table_End
retlw 0
END
|