Hi everybody, sau một thời gian vật lộn với con 16f88 cuối cùng mình cũng thành công với bản đầu tay, nay muốn chia sẻ cho tất cả mọi người
Đây là chương trình hiển thị LCD dung 16f88, trong chương trình có sử dụng kỹ thuật bảng , dung thạch anh 4M , dung 4 chân data ( trong đó D7=>D4 của LCD nối với Port7=>Port4 của F88) và các chân EN, RS, RW của LCD được nối với port2,1,0 của F88). Các bạn có thể tham khảo kiến thức cơ bản của LCD ở
http://www.dientuvietnam.net/board/s...1&page=1&pp=10
PHP Code:
;**********************************************************************
; *
; Filename: LCD.asm *
; Date: 25-9-2005 *
; File Version: V1_1 *
; *
; Author: MAFD_47A *
; Company: BACHKHOA *
; *
; *
;**********************************************************************
; *
; Files required: Convert 8051 Assembler to PIC *
; Chi dung Rom de hien thi ra ngoai *
; Ky thuat bang *
; *
;**********************************************************************
; *
; Notes: EN noi voi chan 2 PORTA *
; RS noi voi chan 1 PORTA *
; RW noi voi chan 0 PORTA *
; Data noi tu 7,6,5,4 voi D7,D6,D5,D4 cua LCD *
; *
;**********************************************************************
list p=16f88 ; list directive to define processor
#include <p16F88.inc> ; processor specific variable definitions
errorlevel -302 ; suppress message 302 from list file & _WRT_ENABLE_OFF
__CONFIG _CONFIG1, _CP_OFF & _CCP1_RB0 & _DEBUG_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_OFF & _PWRTE_ON & _WDT_OFF & _HS_OSC
__CONFIG _CONFIG2, _IESO_OFF & _FCMEN_OFF
;***** VARIABLE DEFINITIONS
w_temp EQU 0x71 ; variable used for context saving
status_temp EQU 0x72 ; variable used for context saving
pclath_temp EQU 0x73 ; variable used for context saving
ACC EQU 0x74
RO EQU 0x78
R1 EQU 0x79
R2 EQU 0x7A
R3 EQU 0x7B
R4 EQU 0x7C
R5 EQU 0x7D
R6 EQU 0x7E
R7 EQU 0x7F
EN EQU H'0002'
RS EQU H'0001'
RW EQU H'0000'
P7 EQU H'0007'
;**********************************************************************
ORG 0x000 ; processor reset vector
goto main ; go to beginning of program
ORG 0x004 ; interrupt vector location
movwf w_temp ; save off current W register contents
movf STATUS,w ; move STATUS register into W register
movwf status_temp ; save off contents of STATUS register
movf PCLATH,W ; move PCLATH register into W register
movwf pclath_temp ; save off contents of PCLATH register
; isr code can go here or be located as a call subroutine elsewhere
movf pclath_temp,w ; retrieve copy of PCLATH register
movwf PCLATH ; restore pre-isr PCLATH register contents
movf status_temp,w ; retrieve copy of STATUS register
movwf STATUS ; restore pre-isr STATUS register contents
swapf w_temp,f
swapf w_temp,w ; restore pre-isr W register contents
retfie ; return from interrupt
main
BANKSEL ANSEL
MOVLW 0x00
MOVWF ANSEL
CALL INIT_LCD
CALL CLEAR_LCD
MOVLW 0x00
MOVWF R1
AGAIN1 MOVF R1,W
CALL TABLE
ADDLW 0x00
BTFSC STATUS,Z
GOTO NEXT
CALL WRITE_TEXT
INCF R1,F
GOTO AGAIN1
NEXT
MOVLW 0x02
CALL GOTOLINE2
MOVLW 0x00
MOVWF R1
AGAIN2 MOVF R1,W
CALL THUY
ADDLW 0x00
BTFSC STATUS,Z
GOTO NEXT1
CALL WRITE_TEXT
INCF R1,F
GOTO AGAIN2
NEXT1
GOTO $
TABLE ADDWF PCL,F
RETLW 'H'
RETLW 'E'
RETLW 'L'
RETLW 'L'
RETLW '0'
RETLW ' '
RETLW 'W'
RETLW 'O'
RETLW 'R'
RETLW 'L'
RETLW 'D'
RETLW 0x00
THUY ADDWF PCL,F
RETLW 'T'
RETLW 'H'
RETLW 'U'
RETLW 'Y'
RETLW 0x00
WRITE_2_NIBBLES
MOVWF ACC
BANKSEL TRISB
MOVLW B'00001111' ; Chon data lam dau ra
ANDWF TRISB,F
BANKSEL PORTB
MOVLW 0xF0
IORWF PORTB,F
MOVF ACC,W
IORLW 0x0F
ANDWF PORTB,F ; Dua 4 bit cao ra PortB
BSF PORTA,EN
NOP
BCF PORTA,EN
MOVLW 0xF0
IORWF PORTB,F
SWAPF ACC,W
IORLW 0x0F
ANDWF PORTB,F ; Dua 4 bit cao ra PortB
BSF PORTA,EN
NOP
BCF PORTA,EN
RETURN
INIT_LCD
CALL DELAY100
BANKSEL TRISA
MOVLW B'00000'
MOVWF TRISB
MOVWF TRISA
BANKSEL PORTA
BCF PORTA,RS
BCF PORTA,RW
BCF PORTA,EN
BSF PORTA,EN
MOVLW 0x28
MOVWF PORTB
BCF PORTA,EN
CALL DELAY5
MOVLW 0x28
CALL WRITE_2_NIBBLES ; Write A as two separate nibbles to LCD
CALL DELAY5
MOVLW 0x0E
CALL WRITE_2_NIBBLES
CALL DELAY5
MOVLW 0x06
CALL WRITE_2_NIBBLES
CALL DELAY5
RETURN
CLEAR_LCD
BCF PORTA,RS
MOVLW 0x01
CALL WRITE_2_NIBBLES
CALL DELAY5
RETURN
WRITE_TEXT
BSF PORTA,RS
CALL WRITE_2_NIBBLES
CALL DELAY5
RETURN
GOTOLINE1
BCF PORTA,RS
ADDLW 0x80
CALL WRITE_2_NIBBLES
CALL DELAY5
RETURN
GOTOLINE2
BCF PORTA,RS
ADDLW 0xC0
CALL WRITE_2_NIBBLES
CALL DELAY5
RETURN
DELAY255 movlw 0xff ;delay 255 mS
goto D0
DELAY100 movlw d'100' ;delay 100mS
goto D0
DELAY50 movlw d'50' ;delay 50mS
goto D0
DELAY20 movlw d'20' ;delay 20mS
goto D0
DELAY5 movlw 0x05 ;delay 5.000 ms (4 MHz clock)
D0 movwf R2
D1 movlw 0xC7 ;delay 1mS
movwf R3
movlw 0x01
movwf R4
Delay_0
decfsz R3, f
goto $+2
decfsz R4, f
goto Delay_0
decfsz R2 ,f
goto D1
retlw 0x00
; remaining code goes here
; initialize eeprom locations
ORG 0x2100
DE 0x00, 0x01, 0x02, 0x03
END ; directive 'end of program'
;
( em ko the nao dinh kem duoc file ?????? )
Rất mong chương trình này giúp đỡ được một phần nào cho các bạn
Nếu bạn nào thác mắc vấn đề về chương trình này thì hãy mở một luông mới để thảo luận về vấn đề này nhé
