?? ds1302.asm
字號:
;此程序用于ds1302驅動,但不包括da1302的RAM存儲的驅動,程序中用到ch451用于時間的顯示
;ch451的驅動完全拷貝ch451的驅動程序
;在程序編寫的時候子程序調用了另一個子程序的時候,注意變量的傳遞。
;作者:王均彬,2008年10月23日
;******************************端口設定************************************
CH451_DCLK BIT P1.5 ;串行數據時鐘,上升沿激活
CH451_DIN BIT P1.6 ;串行數據輸出,接CH451的數據輸入
CH451_LOAD BIT P1.7 ;串行命令加載,上升沿激活
CH451_DOUT BIT P3.3 ;INT1,鍵盤中斷和鍵值數據輸入,接CH451的數據輸出
CH451_KEY DATA 30H ;存放鍵盤中斷中讀取的鍵值
CH451_SI EQU 00H ;有健標志位
T_CLK Bit P1.2 ;實時時鐘時鐘線引腳
T_IO Bit P1.1 ;實時時鐘數據線引腳
T_RST Bit P1.3 ;實時時鐘復位線引腳
SECOND EQU 50H ;秒寄存器
MINUTE EQU 51H ;分寄存器
HOUR EQU 52H ;時寄存器
DAY EQU 53H ;號寄存器
MONTH EQU 54H ;月寄存器
WEEK EQU 55H ;星期寄存器
YEAR EQU 56H ;年寄存器
;*******************************主程序*************************************
ORG 00H
AJMP MAIN
ORG 13H ;鍵盤中斷向量(外部中斷1)
AJMP CH451_INTER
ORG 30H
MAIN:SETB IT1 ;置外部信號為下降沿觸發
CLR IE1 ;清中斷標志
SETB EX1 ;允許鍵盤中斷
CLR EA ;關總中斷 (此程序不使用鍵盤,但使用ch451的數碼管顯示時間)
;$$$$$$$$$$$$$$$CH451的初始化$$$$$$$$$$
CLR CH451_SI
MOV CH451_KEY,#00H
SETB CH451_LOAD
SETB CH451_DCLK ;置為默認的高電平
SETB CH451_DIN
SETB CH451_DOUT
MOV B,#02H ;CH451內部復位
MOV A,#01H
CALL CH451_WRITE
MOV B,#05H ;CH451顯示設置
MOV A,#00H ;不譯碼方式,8位數據,最亮
CALL CH451_WRITE ;發出命令
MOV B,#04H ;設置系統參數命令
MOV A,#03H ;低頻時鐘,禁止看門狗,使能鍵盤功能,使能顯示驅動
CALL CH451_WRITE
;$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
MOV SECOND,#00H ;時間初始值的設定(注意此程序只為驗證ds1302的驅動程序)
MOV MINUTE,#25H
MOV HOUR,#11H
MOV DAY,#23H
MOV MONTH,#10H
MOV WEEK,#03H
MOV YEAR,#08H
LCALL SET1302 ;調用ds1302的設置程序
CLOCK: LCALL Get1302 ;讀取ds1302的時間(可用定時器定時顯示)
MOV P2,SECOND ;把秒數送p2口,用于顯示
MOV A,52H
ANL A,#0FH
MOV R7,#09H
ACALL CH451_WRITE_COUNT
MOV A,52H
ANL A,#10H
RR A
RR A
RR A
RR A
MOV R7,#08H ;取小時的十位并送去顯示
ACALL CH451_WRITE_COUNT
MOV A,51H
SWAP A ;取分鐘十位
ANL A,#0FH
MOV R7,#0BH
ACALL CH451_WRITE_COUNT
MOV A,51H
ANL A,#0FH ;取分鐘個位
MOV R7,#0CH
ACALL CH451_WRITE_COUNT
MOV A,50H
SWAP A
ANL A,#0FH ;取秒個位
MOV R7,#0EH
ACALL CH451_WRITE_COUNT
MOV A,50H
ANL A,#0FH ;取秒鐘個位
MOV R7,#0FH
ACALL CH451_WRITE_COUNT
AJMP CLOCK
;********************************向數碼管寫數據******************************************
;IN: R7,A
;OUT 無
;USE:A,B R7,DPTR,
;調用函數CH451_WRITE
CH451_WRITE_COUNT: MOV B,R7 ;加載字數據到DIG1對應的數據寄存器
MOV DPTR,#TAB1
MOVC A,@A+DPTR
ACALL CH451_WRITE
RET
;******************************CH451寫入數據************************************************
;IN:A,B 待寫的12位數據, 低8位在A中, 高4位在B中
;OUT:無
; USE: A, B, R7
CH451_WRITE: CLR EX1 ;禁止鍵盤中斷
CLR CH451_LOAD ;串行數據加載線清零
MOV R7,#08H ;r7為計數器,表示8個bit
CH451_WRITE_8: RRC A ;低位在前,高位在后
CLR CH451_DCLK ;清時鐘線
MOV CH451_DIN,C ;送出一位數據
SETB CH451_DCLK ;產生時鐘上升沿通知CH451輸入位數據
DJNZ R7,CH451_WRITE_8 ;位數據未完繼續
MOV A,B ;把高4為送入a
MOV R7,#04H ;4位數據
CH451_WRITE_4: RRC A ;低位在前,高位在后
CLR CH451_DCLK ;清時鐘
MOV CH451_DIN,C ;送出一位數據
SETB CH451_DCLK ;產生時鐘上升沿通知CH451輸入位數據
DJNZ R7,CH451_WRITE_4 ;位數據未完繼續
SETB CH451_LOAD ;產生加載上升沿通知CH451處理命令數據
SETB EX1 ;允許鍵盤中斷
RET
;******************************CH451鍵值讀出**************************************
; IN:無
; OUT:CH451_KEY,CH451_SIN
; USE: A, R7
CH451_READ: CLR EX1 ;禁止鍵盤中斷
CLR CH451_LOAD ;串行數據加載線清
MOV A,#07H ;讀取鍵值命令的高4位0111B 低8為任意值
MOV R7,#04H ;忽略12位命令的低8位
CH451_READ_4: RRC A ;低位在前,高位在后
CLR CH451_DCLK ;清時鐘線
MOV CH451_DIN,C ;送出一位數據
SETB CH451_DCLK ;產生時鐘上升沿鎖通知CH451輸入位數據
DJNZ R7,CH451_READ_4 ;位數據未完繼續
SETB CH451_LOAD ;產生加載上升沿通知CH451處理命令數據
CLR A ;先清除鍵值單元以便移位
MOV R7,#07H ;讀入7位鍵值
CH451_READ_7: MOV C,CH451_DOUT ;讀入一位數據
CLR CH451_DCLK ;產生時鐘下升沿通知CH451輸出下一位
RLC A ;數據移入ACC,高位在前,低位在后
SETB CH451_DCLK
DJNZ R7,CH451_READ_7 ;位數據未完繼續
MOV CH451_KEY,A
SETB CH451_SI
CLR IE1 ;清中斷標志,讀操作過程中有低電平脈沖
SETB EX1 ;允許鍵盤中斷
RET
;***************************** 鍵盤中斷子程序**********************************
; IN:無
; OUT:CH451_KEY,CH451_SIN
;調用函數:CH451_READ
CH451_INTER: PUSH PSW ;現場保護
PUSH ACC
ACALL CH451_READ ;調用讀鍵值程序
POP ACC ;恢復現場
POP PSW
RETI ;中斷返回
;**************************************設置1302*******************************************
;IN:無
;功 能:設置DS1302 初始時間,并啟動計時。
;調 用:RTInputByte
;OUT:無
;USE:b,a,r0,r7,r1
SET1302:CLR T_RST
CLR T_CLK
SETB T_RST
MOV B, #8EH ;控制寄存器地址
ACALL DS1302_InputByte ;調用寫入程序
MOV B, #00H ;寫操作前WP=0,允許寫入寄存器
ACALL DS1302_InputByte ;向DS1302寫命令
SETB T_CLK
CLR T_RST
MOV R0, #Second
MOV R7, #7H ;秒 分 時 日 月 星期 年
MOV R1, #80H ;秒寫地址
S13021: CLR T_CLK
SETB T_RST
MOV B, R1 ;寫秒 分 時 日 月 星期 年 地址
ACALL DS1302_InputByte
MOV A, @R0 ;寫秒數據
MOV B, A
ACALL DS1302_InputByte
INC R0
INC R1 ;地址調整
INC R1
SETB T_CLK
CLR T_RST
DJNZ R7, S13021
CLR T_RST
CLR T_CLK
SETB T_RST
MOV B, #91H ;充電控制寄存器
ACALL DS1302_InputByte
MOV B, #0A4H ;沒有電阻,一個二極管充電
ACALL DS1302_InputByte
CLR T_RST
CLR T_CLK
SETB T_RST
MOV B, #8EH ;控制寄存器
ACALL DS1302_InputByte
MOV B, #80H ;控制寄存器,WP=1,寫保護
ACALL DS1302_InputByte
SETB T_CLK
CLR T_RST
RET
;***********************寫1302一字節***********************************
;IN:B
;OUT:無
;USE:r6,a,b
DS1302_InputByte: MOV R6, #8H
MOV A, B
Inbit1: RRC A ;低位在前
MOV T_IO, C ;把數據加到數據線上
SETB T_CLK ;上升沿輸入數據
CLR T_CLK
DJNZ R6, Inbit1
RET
;**********************讀1302一字節************************************
;IN:無
;OUT:A
;USE A R5
DS1302_OutputByte: MOV R5, #8H ;數據位數
Outbit1: MOV C, T_IO
RRC A ;低位在前
SETB T_CLK
CLR T_CLK
DJNZ R5, Outbit1
RET
;********************讀取DS1302**************************************
;功 能:從DS1302 讀時間
;調 用:RTInputByte,RTOutputByte
;入口參數:無
;出口參數:時間保存在:Second,Minute,Hour,Day,Month,Week.YearL
;USE:A B R0 R1 R7
GET1302: MOV R0, #Second
MOV R7, #7H
MOV R1, #81H ;秒地址
G13021: CLR T_RST
CLR T_CLK
SETB T_RST
MOV B, R1 ;秒 分 時 日 月 星期 年 地址
LCALL DS1302_InputByte
LCALL DS1302_OutputByte
MOV @R0, A ;把數據送入相應的存儲器
INC R0
INC R1 ;地址調整
INC R1
SETB T_CLK
CLR T_RST
DJNZ R7, G13021
RET
;*************************************************************************************************
TAB1:DB 00111111B,00000110B,01011011B,01001111B,01100110B,01101101B,01111101B,00000111B,01111111B,01101111B
TAB2:DB 01110111B,01111100B,01011000B,01011110B,01111001B,01110001B,01101111B,01110110B,00111000B,01110011B
;上為8段數碼管顯示的編碼0-F以及部分字符
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -