?? ds1302.a
字號:
/*時鐘程序,大家是否想到用定時器,對,也可用定時器的中斷來處理,這樣的程序我想不用我說了吧!
你們可自己發輝下,本程序采用外元件DS1302時鐘IC,使用此IC不增加系統資源,要時鐘時直接去讀取就可以了
本IC跟ADC0831一樣以串口方式傳送數據,不同的是協議,只要你讀懂它的串口協議,就可以用P口來模擬協議進行
,這樣更能使你對傳送數據協議的了解,在看本程序之前,先看看芯片的串口協議*/
SCL2 BIT P1.3; //SCL2定義為P1口的第3位腳,連接ADC0831SCL腳
SDA2 BIT P1.4; //SDA2定義為P1口的第4位腳,連接ADC0831SDA腳
CS2 BIT P1.6; //CS2定義為P1口的第4位腳,連接ADC0831CS腳
RST BIT P1.5;// DS1302片選,因這兩芯片采用同一數據腳(SDA,SCL),所以我們要定義它,將DS1302片選關掉,否則發生沖突
L_DISPLAY EQU 30H
L_TMPDATE1 EQU 38H ;秒
L_TMPDATE2 EQU 39H ;分
L_TMPDATE3 EQU 3AH ;時
L_TMPDATE4 EQU 3BH ;星期
L_TMPDATE5 EQU 3CH ;日
L_TMPDATE6 EQU 3DH ;月
L_TMPDATE7 EQU 3EH ;年
ORG 0100H
write_rtc_address: DB 80H,82H,84H,86H,88H,8aH,8cH
read_rtc_address: DB 81H,83H,85H,87H,89H,8bH,8dH
L_TIMER: DB 00H,59H,18H,01H,01H,01H,01H
TABLE: DB 3fH,06H,5bH,4fH,66H,6dH,7dH,07H,7fH,6fH,40H
/*共陰數碼管 0-9 - 表*/
ORG 0000H
LJMP MAIN
ORG 0200H
MAIN: MOV SP,#60H
CLR RST
LCALL SET_RTC ;先寫入初值
M0: LCALL READ_RTC ;循環讀取時間數據
MOV R0,#L_DISPLAY
MOV A,L_TMPDATE3 ;把時拆分為兩個數據,個時和十時
MOV B,#16
DIV AB
MOV @R0,A ;十時
INC R0
MOV @R0,B ;個時
INC R0
MOV @R0,#10 ;加"-"
INC R0
MOV A,L_TMPDATE2 ;同上
MOV B,#16
DIV AB
MOV @R0,A
INC R0
MOV @R0,B
INC R0
MOV @R0,#10
INC R0
MOV A,L_TMPDATE1
MOV B,#16
DIV AB
MOV @R0,A
INC R0
MOV @R0,B
MOV R0,#L_DISPLAY
MOV R7,#8
LCALL DISPLAY
SJMP M0
DISPLAY:MOV DPTR,#TABLE /*R0為地址,R7為個數*/
MOV P2,#0
ANL P1,#0F8H
L2: MOV A,@R0
MOVC A,@A+DPTR
MOV P2,A
LCALL DELAY
MOV P2,#0
INC P1
INC R0
DJNZ R7,L2
RET
DELAY: MOV R5,#20
D1: DJNZ R5,D1
RET
SET_RTC:MOV R6,#7 ;轉輸7個數據:秒、分、時、星期、日、月、年
MOV DPTR,#L_TIMER ;初始的7個數據從ROM中轉到我們定義的RAM中
MOV R0,#L_TMPDATE1
S0: CLR A
MOVC A,@A+DPTR
MOV @R0,A
INC R0
INC DPTR
DJNZ R6,S0
MOV R1,#8EH
MOV R2,#0
LCALL W1302 ;首先寫入地址8EH為0,即解鎖,否則寫入不了數據
MOV R0,#L_TMPDATE1 ;數據保存的地址
MOV DPTR,#write_rtc_address ;所寫數據的地址
MOV R6,#7 ;寫入7個數據:秒、分、時、星期、日、月、年
S1: MOV A,@R0
MOV R2,A
CLR A
MOVC A,@A+DPTR
MOV R1,A
LCALL W1302
INC DPTR
INC R0
DJNZ R6,S1
MOV R1,#8EH
MOV R2,#80H
LCALL W1302 ;;最后寫入地址8EH為80H,即加上鎖,不讓寫入不了數據
RET
READ_RTC:MOV R6,#7 ;讀出7個數據:秒、分、時、星期、日、月、年
MOV R0,#L_TMPDATE1 ;存入定義的RAM中
MOV DPTR,#read_rtc_address
RE0: CLR A
MOVC A,@A+DPTR
MOV R1,A
LCALL R1302
MOV @R0,A
INC DPTR
INC R0
DJNZ R6,RE0
RET
W1302B: MOV R7,#8 ;單字節寫,R1參數為所寫數據
MOV A,R1
W0: RRC A
MOV SDA2,C
NOP
SETB SCL2
NOP
CLR SCL2
DJNZ R7,W0
RET
W1302: CLR RST ;指定地址寫入數據,R1:地址,R2:數據
NOP
CLR SCL2
NOP
SETB RST
NOP
LCALL W1302B
MOV A,R2
MOV R1,A
LCALL W1302B
CLR RST
NOP
RET
R1302: MOV R2,#0 ;指定地址讀數據,R1:地址,A:返回的數據
CLR RST
NOP
CLR SCL2
NOP
SETB RST
NOP
LCALL W1302B
MOV R7,#8
CLR A
RR0: MOV C,SDA2 ;;單字節讀,讀出數據存入A傳出
RRC A
SETB SCL2
NOP
CLR SCL2
DJNZ R7,RR0
CLR RST
NOP
CLR SCL2
NOP
SETB SCL2
NOP
CLR SDA2
NOP
SETB SDA2
NOP
RET
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -