![]() |
|
Tài trợ cho PIC Vietnam |
Cơ bản về vi điều khiển và PIC Những bài hướng dẫn cơ bản nhất để làm quen với vi điều khiển PIC |
![]() |
|
Ðiều Chỉnh | Xếp Bài |
|
![]() |
#1 |
Đệ tử 1 túi
Tham gia ngày: Dec 2008
Bài gửi: 17
: |
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 |
![]() |
![]() |
![]() |
|
|