|

程序清單:
- ;DS1302 1602LCD顯示
- ;2016 04 26 E:\D[J\DS1302LCD\DS1302LCD.ASM
- H_ADJ BIT P2.0 ;時/年調(diào)整
- M_ADJ BIT P2.1 ;分/月調(diào)整
- S_ADJ BIT P2.2 ;秒/日調(diào)整
- DT_SET BIT P2.3 ;時間/日期選擇
- W_ADJ BIT P2.4 ;星期調(diào)整
- STR BIT P2.5 ;啟動走時
- T_RST BIT P3.2 ;實時時鐘復(fù)位線引腳
- T_CLK BIT P3.3 ;實時時鐘時鐘線引腳
- T_IO BIT P3.4 ;實時時鐘數(shù)據(jù)線引腳
- E BIT P3.5
- RW BIT P3.6
- RS BIT P3.7
- DL_BIT EQU 20H ;日低位
- DH_BIT EQU 21H ;日高位
- MOL_BIT EQU 22H ;月低位
- MOH_BIT EQU 23H ;月高位
- YL_BIT EQU 24H ;年低位
- YH_BIT EQU 25H ;年高位
- SL_BIT EQU 26H ;秒低位
- SH_BIT EQU 27H ;秒高位
- ML_BIT EQU 28H ;分低位
- MH_BIT EQU 29H ;分高位
- HL_BIT EQU 2AH ;時低位
- HH_BIT EQU 2BH ;時高位
- SEC EQU 30H
- MIN EQU 31H
- HOUR EQU 32H
- DAY EQU 33H
- MONTH EQU 34H
- WEEK EQU 35H
- YEAR EQU 36H
- DS1302_ADDR EQU 5EH
- DS1302_DATA EQU 5FH
- ORG 00H
- LJMP MAIN
- ORG 0BH
- AJMP T0INT
- ORG 30H
- MAIN:
- MOV SP,#60H
- MOV TMOD,#01H
- MOV TH0,#3CH
- MOV TL0,#0B0H
- MOV R0,#10
- SETB EA
- SETB ET0
- SETB TR0
- MOV R1,37H
- MOV YEAR,#11H ;上電預(yù)置日期、時間
- MOV WEEK,#00H ;周1 MON
- MOV MONTH,#04H ;2011 04 25 12:00:00
- MOV DAY,#25H
- MOV HOUR,#12H
- MOV MIN,#00H
- MOV SEC,#00H
- MAIN1:
- LCALL KEY
- JB F0,MAIN10 ;F0=1,開始走時。走時前寫,不讀。走時后讀,不寫。
- LCALL WR1302
- AJMP MAIN2
- MAIN10:
- LCALL RD1302
- MAIN2:
- MOV A,YEAR
- MOV B,#10H
- DIV AB
- MOV YL_BIT,B
- MOV YH_BIT,A
- MOV A,MONTH
- MOV B,#10H
- DIV AB
- MOV MOL_BIT,B
- MOV MOH_BIT,A
- MOV A,DAY
- MOV B,#10H
- DIV AB
- MOV DL_BIT,B
- MOV DH_BIT,A
- MOV A,HOUR
- MOV B,#10H
- DIV AB
- MOV HL_BIT,B
- MOV HH_BIT,A
- MOV A,MIN
- MOV B,#10H
- DIV AB
- MOV ML_BIT,B
- MOV MH_BIT,A
- MOV A,SEC
- MOV B,#10H
- DIV AB
- MOV SL_BIT,B
- MOV SH_BIT,A
- JNB 7CH,MAIN1 ;0.5S標(biāo)志
- CLR 7CH
- LCALL WEEKCOV ;星期數(shù)字轉(zhuǎn)換成英語縮寫3 字母
- LCALL DISP
- AJMP MAIN1
- KEY: ;按鍵子程序
- KEY_SET:
- JB DT_SET,KEY_H
- ACALL D10MS
- JNB DT_SET,$-2
- CPL 7FH
- JB F0,RT
- CPL P2.7 ;點亮日期設(shè)定
- AJMP RT
- KEY_H:
- JB H_ADJ,KEY_M
- ACALL D10MS
- JNB H_ADJ,$-2
- AJMP H_ADD
- KEY_M:
- JB M_ADJ,KEY_S
- ACALL D10MS
- JNB M_ADJ,$-2
- AJMP M_ADD
- KEY_S:
- JB S_ADJ,KEY_W
- ACALL D10MS
- JNB S_ADJ,$-2
- AJMP S_ADD
- KEY_W:
- JB W_ADJ,KEY_ST
- ACALL D10MS
- JNB W_ADJ,$-2
- AJMP W_ADD
- KEY_ST:
- JB STR,RT
- ACALL D10MS
- JNB STR,$-2
- AJMP K_STR
- RT:
- RET
- H_ADD:
- JB 7FH,Y_ADD ;7FH為日期/時間切換鍵標(biāo)志。1為年月日。
- MOV A,HOUR
- ADD A,#01H
- DA A
- CJNE A,#24H,H_ADD1
- MOV A,#0
- H_ADD1:
- MOV HOUR,A
- AJMP RT
- Y_ADD:
- MOV A,YEAR
- ADD A,#01H
- DA A
- CJNE A,#20H,Y_ADD1
- MOV A,#0
- Y_ADD1:
- MOV YEAR,A
- AJMP RT
- M_ADD:
- JB 7FH,MO_ADD
- MOV A,MIN
- ADD A,#01H
- DA A
- CJNE A,#60H,M_ADD1
- MOV A,#00H
- M_ADD1:
- MOV MIN,A
- AJMP RT
- MO_ADD:
- MOV A,MONTH
- ADD A,#01H
- DA A
- CJNE A,#13H,MO_ADD1
- MOV A,#1
- MO_ADD1:
- MOV MONTH,A
- AJMP RT
- S_ADD:
- JB 7FH,D_ADD
- MOV A,SEC
- ADD A,#01H
- DA A
- CJNE A,#60H,S_ADD1
- MOV A,#00H
- S_ADD1:
- MOV SEC,A
- AJMP RT
- D_ADD:
- MOV A,DAY
- ADD A,#01H
- DA A
- CJNE A,#32H,D_ADD1
- MOV A,#01H
- D_ADD1:
- MOV DAY,A
- AJMP RT
- W_ADD:
- MOV A,WEEK
- ADD A,#01H
- DA A
- CJNE A,#7H,W_ADD1
- MOV A,#0
- W_ADD1:
- MOV WEEK,A
- AJMP RT
- K_STR:
- MOV DS1302_ADDR,#80H ;開始振蕩
- MOV DS1302_DATA,SEC
- LCALL WRITE
- MOV DS1302_ADDR,#8EH ;禁止寫入1302
- MOV DS1302_DATA,#80H
- LCALL WRITE
- SETB F0
- CLR P2.7
- AJMP RT
- WR1302:
- MOV DS1302_ADDR,#8EH
- MOV DS1302_DATA,#00H ;允許寫1302
- LCALL WRITE
- MOV DS1302_ADDR,#80H
- MOV DS1302_DATA,#80H ;1302停止振蕩
- LCALL WRITE
- MOV DS1302_ADDR,#8CH ;年寫入1302
- MOV DS1302_DATA,YEAR
- LCALL WRITE
- MOV DS1302_ADDR,#8AH ;周寫入1302
- MOV DS1302_DATA,WEEK
- LCALL WRITE
- MOV DS1302_ADDR,#88H ;月寫入1302
- MOV DS1302_DATA,MONTH
- LCALL WRITE
- MOV DS1302_ADDR,#86H ;日寫入1302
- MOV DS1302_DATA,DAY
- LCALL WRITE
- MOV DS1302_ADDR,#84H ;時寫入1302
- MOV DS1302_DATA,HOUR
- LCALL WRITE
- MOV DS1302_ADDR,#82H ;分寫入1302
- MOV DS1302_DATA,MIN
- LCALL WRITE
- MOV DS1302_ADDR,#82H ;秒寫入1302
- MOV DS1302_DATA,MIN
- LCALL WRITE
- RET
- WRITE:
- CLR T_CLK
- NOP
- SETB T_RST
- NOP
- MOV A,DS1302_ADDR
- MOV R4,#8
- WRITE1:
- RRC A
- NOP
- NOP
- CLR T_CLK
- NOP
- NOP
- NOP
- MOV T_IO,C
- NOP
- NOP
- NOP
- SETB T_CLK
- NOP
- NOP
- DJNZ R4,WRITE1
- CLR T_CLK
- NOP
- MOV A,DS1302_DATA
- MOV R4,#8
- WRITE2:
- RRC A
- NOP
- CLR T_CLK
- NOP
- NOP
- MOV T_IO,C
- NOP
- NOP
- NOP
- SETB T_CLK
- NOP
- NOP
- DJNZ R4,WRITE2
- CLR T_RST
- RET
- RD1302:
- MOV DS1302_ADDR,#8DH ;年讀出
- LCALL READ
- MOV YEAR,DS1302_DATA
- MOV DS1302_ADDR,#8BH ;周讀出
- LCALL READ
- MOV WEEK,DS1302_DATA
- MOV DS1302_ADDR,#89H ;月讀出
- LCALL READ
- MOV MONTH,DS1302_DATA
- MOV DS1302_ADDR,#87H ;日讀出
- LCALL READ
- MOV DAY,DS1302_DATA
- MOV DS1302_ADDR,#85H ;時讀出
- LCALL READ
- MOV HOUR,DS1302_DATA
- MOV DS1302_ADDR,#83H ;分讀出
- LCALL READ
- MOV MIN,DS1302_DATA
- MOV DS1302_ADDR,#81H ;秒讀出
- LCALL READ
- MOV SEC,DS1302_DATA
- RET
-
- READ:
- CLR T_CLK
- NOP
- NOP
- SETB T_RST
- NOP
- MOV A,DS1302_ADDR
- MOV R4,#8
-
- READ1:
- RRC A
- MOV T_IO,C
- NOP
- NOP
- NOP
- SETB T_CLK
- NOP
- NOP
- NOP
- CLR T_CLK
- NOP
- NOP
- DJNZ R4,READ1
- MOV R4,#8
-
- READ2:
- CLR T_CLK
- NOP
- NOP
- NOP
- MOV C,T_IO
- NOP
- NOP
- NOP
- NOP
- NOP
- RRC A
- NOP
- NOP
- NOP
- NOP
- SETB T_CLK
- NOP
- DJNZ R4,READ2
- MOV DS1302_DATA,A
- CLR T_RST
- RET
-
- DISP:
- MOV A,#30H ;16進(jìn)制轉(zhuǎn)ASCII
- ORL YH_BIT, A
- ORL YL_BIT, A
- ORL MOH_BIT, A
- ORL MOL_BIT, A
- ORL DH_BIT, A
- ORL DL_BIT, A
- ;LCALL WEEKCOV
- ORL HH_BIT, A
- ORL HL_BIT, A
- ORL MH_BIT, A
- ORL ML_BIT, A
- ORL SH_BIT, A
- ORL SL_BIT, A
- LCALL INIT_1602
- MOV A, #10000000B ; LINE1
- LCALL WR_CMD
- MOV A,#"2"
- LCALL WR_DATA
- MOV A,#"0"
- LCALL WR_DATA
- MOV A, YH_BIT
- LCALL WR_DATA
- MOV A, YL_BIT
- LCALL WR_DATA
- MOV A,#" "
- LCALL WR_DATA
- MOV A,MOH_BIT
- LCALL WR_DATA
- MOV A,MOL_BIT
- LCALL WR_DATA
- MOV A,#" "
- LCALL WR_DATA
- MOV A,DH_BIT
- LCALL WR_DATA
- MOV A,DL_BIT
- LCALL WR_DATA
- MOV A,#" "
- LCALL WR_DATA
- MOV A,#" "
- LCALL WR_DATA
- LCALL WEEKDISP ;星期顯示英文縮寫3個字母
- MOV A, #11000000B ; LINE2
- LCALL WR_CMD
- MOV A,HH_BIT
- LCALL WR_DATA
- MOV A,HL_BIT
- LCALL WR_DATA
- MOV A,#":"
- LCALL WR_DATA
- MOV A,MH_BIT
- LCALL WR_DATA
- MOV A,ML_BIT
- LCALL WR_DATA
- MOV A,#":"
- LCALL WR_DATA
- MOV A,SH_BIT
- LCALL WR_DATA
- MOV A,SL_BIT
- LCALL WR_DATA
- RET
- WEEKCOV:
- MOV A,WEEK
- CJNE A,#0,W2
- MOV 37H,#"M"
- MOV 38H,#"O"
- MOV 39H,#"N"
- W2:
- MOV A,WEEK
- CJNE A,#1,W3
- MOV 37H,#"T"
- MOV 38H,#"U"
- MOV 39H,#"E" ;星期一 MON 星期二 TUE 星期三 WED 星期四 THU
- ;星期五 FRI 星期六 SAT 星期天 SUN
- W3:
- MOV A,WEEK
- CJNE A,#2,W4
- MOV 37H,#"W"
- MOV 38H,#"E"
- MOV 39H,#"D"
- W4:
- MOV A,WEEK
- CJNE A,#3,W5
- MOV 37H,#"T"
- MOV 38H,#"H"
- MOV 39H,#"U"
- W5:
- MOV A,WEEK
- CJNE A,#4,W6
- MOV 37H,#"F"
- MOV 38H,#"R"
- MOV 39H,#"I"
- W6:
- MOV A,WEEK
- CJNE A,#5,W7
- MOV 37H,#"S"
- MOV 38H,#"A"
- MOV 39H,#"T"
- W7:
- MOV A,WEEK
- CJNE A,#6,W8
- MOV 37H,#"S"
- MOV 38H,#"U"
- MOV 39H,#"N"
- W8:
- RET
- WEEKDISP:
- MOV A,37H
- LCALL WR_DATA
- MOV A,38H
- LCALL WR_DATA
- MOV A,39H
- LCALL WR_DATA
- RET
- INIT_1602:
- MOV A, #01H
- LCALL WR_CMD ;清屏
- MOV A, #38H
- LCALL WR_CMD ;8位數(shù)據(jù),16X2,5X7點陣
- MOV A, #0CH
- LCALL WR_CMD ;開顯示,關(guān)光標(biāo),不閃爍
- MOV A, #06H
- LCALL WR_CMD ;讀寫字符時地址+1,整屏不移動
- RET
- WR_CMD:
- MOV P1, A
- CLR RS ;寫入控制命令
- CLR RW
- CLR E
- LCALL BUSY
- SETB E
- RET
- WR_DATA:
- MOV P1, A
- SETB RS ;寫入數(shù)據(jù)
- CLR RW
- CLR E
- LCALL BUSY ;判斷液晶模塊是否忙?
- SETB E
- RET
- BUSY: ;查看LCD是否忙
- MOV P1,#0FFH
- CLR RS
- SETB RW
- CLR E
- NOP
- SETB E
- JB P1.7,BUSY ;如果P1.7為高電平表示忙就循環(huán)等待
- RET
- T0INT:
- MOV TH0,#3CH
- MOV TL0,#0B0H
- DJNZ R0,RTI
- MOV R0,#10
- setb 7CH
- RTI:
- RETI
- D1MS:
- MOV R7,#250
- LOOP0:
- NOP
- NOP
- DJNZ R7,LOOP0
- RET
- D10MS:
- MOV R4,#25
- MOV R3,#200
- DJNZ R3,$
- DJNZ R2,$-4
- RET
- END
復(fù)制代碼
|
|