PDA

View Full Version : Làm chữ chạy trên LCD bằng 16f887???


billnee
27-07-2010, 11:50 PM
E mới học PIC. Cho em hỏi để định nghĩa hàm delete char (xóa kí tự) và hàm copy char (coppy kí tự) làm kiểu gì???.Em định dùng 2 hàm trên để làm chữ chạy cho LCD(5x10) dùng 16f887.Các tiềm bối giúp em.E viết bằng ngôn ngữ C??Help! Thanks!

em tìm đc code này trong diễn đàn
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

ko bít có dùng đc ko???