?? ds12c887.asm
字號:
;-------------------------------------------------------------------------------
;DS12C877+LCD1602
;MCU PIC16F877A
;PORT RA0-RA3 TO CONNECT DS12C887
;INTEL BUS
;-------------------------------------------------------------------------------
;DS12C887
;RA0--CS;RA1--AS(ALE);RA2--R/W(WR);RA3--DS(RD)
;RC0~RC7 TO CONNECT DS12887'S AD0~AD7
;-------------------------------------------------------------------------------
;LCD 1602
;RB1--RS,RB2--RW,RB3--E
;D0~D7 CONNECT MCU RD0~RD7
;--------------------------------------------------------------------------------
LIST P=16F877A
INCLUDE"P16F877A.INC"
#DEFINE L_E PORTB,3 ;LCD片選信號腳定義在RB.3腳
#DEFINE L_RW PORTB,2 ;LCD讀/寫信號腳定義在RB.2腳
#DEFINE L_RS PORTB,1 ;LCD寄存器選擇信號腳定義在RB.1腳
#DEFINE T_CS PORTA,0
#DEFINE T_AS PORTA,1
#DEFINE T_RW PORTA,2
#DEFINE T_DS PORTA,3
#DEFINE DAT PORTD
T_ADDR EQU 22H
T_DATA EQU 23H
COUNT EQU 24H
TEMP EQU 25H
TEMP1 EQU 26H
TEMP2 EQU 27H
SOUH EQU 28H
SOUL EQU 29H
SOU EQU 2AH
SEN_H EQU 30H
SEN_L EQU 31H
MIN_H EQU 32H
MIN_L EQU 33H
HOUR_H EQU 34H
HOUR_L EQU 35H
WEEK_H EQU 36H
WEEK_L EQU 37H
DAY_H EQU 38H
DAY_L EQU 39H
MON_H EQU 3AH
MON_L EQU 3BH
YEAR_H EQU 3CH
YEAR_L EQU 3DH
;------------------------------------------------------------------------------------------
ORG 0000H
NOP ;放置一條ICD必需的空操作指令
GOTO MAIN
ORG 00004H
MAIN CALL INIT_LCD
CALL RTC_INIT
GONO CALL READRTC
CALL DISPLAY
GOTO GONO
;---------------------------------------------------------------------------------------------
INIT_LCD BSF STATUS,RP0 ;選擇體1
MOVLW B'11110001'
MOVWF TRISB ;PORTB的B1-3定義為輸出,其余為輸入
CLRF TRISD ;PORTD端口定義為輸出
BCF STATUS,RP0 ;SELECT BANK 0
CALL DELAY5MS ;調用延時,剛上電LCD復位不一定有PIC快
CALL DELAY5MS
CALL DELAY5MS
MOVLW 38H
CALL FCOM_WR
MOVLW 38H
CALL FCOM_WR
MOVLW 38H
CALL FCOM_WR
MOVLW 38H
CALL COMM_WR ;顯示模式設置:16*2顯示,5*7點陣,8位數碼接口
MOVLW 08H
CALL COMM_WR ;顯示關閉,不顯示光標
MOVLW 01H
CALL COMM_WR ;顯示清屏
MOVLW 06H
CALL COMM_WR ;顯示光標移動設置(右移),整屏顯示不移動
MOVLW 0CH
CALL COMM_WR ;顯示開及光標設置,不顯示光標
RETURN
;***************************LCD顯示子程序************************
;LCD模塊初始化,由廠家提供的資料顯示,其初始化過程為:
DISPLAY MOVLW 0CAH
CALL COMM_WR
MOVFW SEN_H ;顯示秒十位
CALL DATA_WR
MOVLW 0CBH
CALL COMM_WR
MOVFW SEN_L ;顯示秒個位
CALL DATA_WR
MOVLW 0C7H
CALL COMM_WR
MOVFW MIN_H ;顯示分十位
CALL DATA_WR
MOVLW 0C8H
CALL COMM_WR
MOVFW MIN_L ;顯示分個位
CALL DATA_WR
MOVLW 0C4H
CALL COMM_WR
MOVFW HOUR_H ;顯示時十位
CALL DATA_WR
MOVLW 0C5H
CALL COMM_WR
MOVFW HOUR_L ;顯示時個位
CALL DATA_WR
MOVLW 8AH
CALL COMM_WR
MOVFW DAY_H ;顯示秒十位
CALL DATA_WR
MOVLW 8BH
CALL COMM_WR
MOVFW DAY_L ;顯示秒個位
CALL DATA_WR
MOVLW 87H
CALL COMM_WR
MOVFW MON_H ;顯示分十位
CALL DATA_WR
MOVLW 88H
CALL COMM_WR
MOVFW MON_L ;顯示分個位
CALL DATA_WR
MOVLW 84H
CALL COMM_WR
MOVFW YEAR_H ;顯示時十位
CALL DATA_WR
MOVLW 85H
CALL COMM_WR
MOVFW YEAR_L ;顯示時個位
CALL DATA_WR
RETURN
;*****************************寫命令子程序***********************
FCOM_WR MOVWF DAT ;把命令字送數據口
BCF L_RS
BCF L_RW
BCF L_E
NOP
BSF L_E
RETURN
COMM_WR MOVWF DAT ;把命令字送數據口
BCF L_RS
BCF L_RW
BCF L_E
NOP
BSF L_E
CALL LCDBUSY
RETURN
;*************************寫數據子程序***************************
DATA_WR MOVWF DAT
BSF L_RS
BCF L_RW
BCF L_E
NOP
BSF L_E
CALL LCDBUSY
RETURN
;**************************判總線忙子程序************************
LCDBUSY BSF STATUS,RP0
MOVLW 080H
MOVWF TRISD ;數據口最高位置為輸入口
BCF STATUS,RP0
BCF L_RS
BSF L_RW
BSF L_E
NOP
BSF L_E
BTFSC DAT,7 ;是否忙
GOTO LCDBUSY ;是,繼續(xù)判斷
BSF STATUS,RP0
MOVLW 00H
MOVWF TRISD ;否,數據最高位恢復為輸出狀態(tài)
BCF STATUS,RP0
RETURN
;---------------------------------
; 實時時鐘芯片
; DS12C887
; 通信子程序
;---------------------------------
T_WRITE CLRF PORTC
BSF T_DS
BSF T_RW
BSF T_AS
BCF T_CS
MOVF T_ADDR,0
MOVWF PORTC
BCF T_AS
BCF T_RW
MOVF T_DATA,0
MOVWF PORTC
BSF T_RW
BSF T_CS
BSF T_AS
RETURN
;------------------------------
T_READ CLRF PORTC
BSF T_DS
BSF T_RW
BSF T_AS
BCF T_CS
MOVF T_ADDR,W
MOVWF PORTC
BCF T_AS
BCF T_DS
CLRF PORTC
CALL LCDBUSY
BSF STATUS,RP0
MOVLW B'11111111'
MOVWF TRISC
BCF STATUS,RP0
MOVF PORTC,0
MOVWF T_DATA
BSF T_DS
BSF T_CS
BSF T_AS
BSF STATUS,RP0
MOVLW 00H
MOVWF TRISC
BCF STATUS,RP0
CLRF PORTC
RETURN
;--------------------------
; 實際用法
;--------------------------
; 實時時鐘設置
;-----------------------------
RTC_INIT BSF STATUS,RP0 ;選擇體1
MOVLW B'11110000'
MOVWF TRISA ;PORTB的B1-3定義為輸出,其余為輸入
CLRF TRISC ;PORTD端口定義為輸出
MOVLW 00H
MOVWF OPTION_REG ;分頻比1:4,定時器,內部時鐘源
MOVLW B'00000110'
MOVWF ADCON1 ;關閉所有A/D口
MOVLW B'00000000'
MOVWF INTCON ;關閉所
NOP
BCF STATUS,RP0
CLRF PORTA
CLRF PORTC
CALL DELAY5MS
MOVLW 0AH
MOVWF T_ADDR
MOVLW B'00101111'
MOVWF T_DATA
CALL T_WRITE
MOVLW 0BH
MOVWF T_ADDR
MOVLW B'00000010'
MOVWF T_DATA
CALL T_WRITE
RETURN
;----------------------------
; 讀時間信息(年,月,日,秒等)
;----------------------------
READRTC MOVLW 00H
MOVWF T_ADDR
CALL T_READ
MOVF T_DATA,0
MOVWF SOU
CALL BCD2ASC
MOVF SOUH,0
MOVWF SEN_H
MOVF SOUL,0
MOVWF SEN_L
MOVLW 02H
MOVWF T_ADDR
CALL T_READ
MOVF T_DATA,0
MOVWF SOU
CALL BCD2ASC
MOVF SOUH,0
MOVWF MIN_H
MOVF SOUL,0
MOVWF MIN_L
MOVLW 04H
MOVWF T_ADDR
CALL T_READ
MOVF T_DATA,0
MOVWF SOU
CALL BCD2ASC
MOVF SOUH,0
MOVWF HOUR_H
MOVF SOUL,0
MOVWF HOUR_L
MOVLW 06H
MOVWF T_ADDR
CALL T_READ
MOVF T_DATA,0
MOVWF SOU
CALL BCD2ASC
MOVF SOUH,0
MOVWF WEEK_H
MOVF SOUL,0
MOVWF WEEK_L
MOVLW 07H
MOVWF T_ADDR
CALL T_READ
MOVF T_DATA,0
MOVWF SOU
CALL BCD2ASC
MOVF SOUH,0
MOVWF DAY_H
MOVF SOUL,0
MOVWF DAY_L
MOVLW 08H
MOVWF T_ADDR
CALL T_READ
MOVF T_DATA,0
MOVWF SOU
CALL BCD2ASC
MOVF SOUH,0
MOVWF MON_H
MOVF SOUL,0
MOVWF MON_L
MOVLW 09H
MOVWF T_ADDR
CALL T_READ
MOVF T_DATA,0
MOVWF SOU
CALL BCD2ASC
MOVF SOUH,0
MOVWF YEAR_H
MOVF SOUL,0
MOVWF YEAR_L
RETURN
;--------------------------------------------------------------
;入口參數:原二進制數在SOU中。
;BCD碼轉ASCII碼
;--------------------------------------------------------------
BCD2ASC MOVF SOU,0
ANDLW B'11110000'
MOVWF SOUH
SWAPF SOUH,1
MOVLW 030H
ADDWF SOUH,1
MOVF SOU,0
ANDLW B'00001111'
MOVWF SOUL
MOVLW 030H
ADDWF SOUL,1
RETURN ;整個子程序結束
;------------------------------------------------------------------------------------------
DELAY5MS movlw 1h ;將外層循環(huán)參數值FFH經過W
movwf 20h ;送入用作外循環(huán)變量的20H單元
loop0 movlw 0FFh ;將內層循環(huán)參數值FFH經過W
movwf 21h ;送入用作內循環(huán)變量的21H單元
loop1 decfsz 21h,1 ;變量21H內容遞減,若為0跳躍
goto loop1 ;跳轉到LP1處
decfsz 20h,1 ;變量20H內容遞減,若為0跳躍
goto loop0 ;跳躍到LP0處
return ;返回主程序
;------------------------------------------------------------------------------------------
END
;------------------------------------------------------------------------------------------
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -