📄 ds1302-dsy.asm
字号:
;8位数码管显示
;P0 为段码口、P2 为位码口
;晶振 12M
;时钟芯片:DS1302
;************** DS1302 端口位定义 **************
SCLK BIT P1.0 ; 时钟控制总线
IO_DATA BIT P1.1 ; 数据传送总线
RST BIT P1.2 ; 复位总线
LED BIT P2.0
K3 EQU P3.2 ;调整、移位
K1 EQU P3.3 ;加一、显示日期
K2 EQU P3.4 ;减一、显示闹钟
BEEP EQU P2.7 ;蜂鸣器
T_CONU EQU 22H ;中断计数
TIME_L EQU 23H ;定时初值
TIME_H EQU 24H
TIME_DATA EQU 50H ;显示时间单元首地址
DATE_DATA EQU 60H ;显示日期单元首地址
DS_DATA EQU 58H ;显示定时时间单元首地址
;------------------------------------------------
ORG 0000H
JMP MAIN
ORG 000BH
LJMP INT_T0
ORG 0100H
;------------------------------------------------
MAIN:
MOV TMOD,#01H ;T0,方式1
MOV TIME_L,#00H ;50MS定时值
MOV TIME_H,#4CH
MOV T_CONU,#00H ;中断次数
MOV IE,#82H ;EA=1,ET0=1
SETB TR0
MOV A,#00H
MOV R0,#40H ;从40H单元开始
MOV R1,#40H ;清64个单元
M_CLEAR: MOV @R0,A
INC R0
DJNZ R1,M_CLEAR
CLR BEEP
LCALL PROSET ;DS1302初始化
MAIN1: LCALL GET_TIME ;从DS1302读数据程序
LCALL CHULI ;实时时间数据处理
MOV R0,#TIME_DATA ;显示时、分、秒
LCALL DISP
MOV R0,#TIME_DATA
LCALL TIME_DISPLAY
LCALL SET_KEY ;键功能程序
JB K1,MAIN1
CALL BEEP_BL
MAIN2: CLR TR0
CLR LED
LCALL CHULI ;日期数据处理
MOV R0,#DATE_DATA
LCALL DISP ;显示年、月、日
MOV R0,#DATE_DATA
LCALL TIME_DISPLAY
JB K1,MAIN2
CALL BEEP_BL
SETB TR0
JMP MAIN1
;--------------------------------------------
;中断服务子程序
;500MS对闪动标记取反一次
;--------------------------------------------
INT_T0:
PUSH ACC
PUSH PSW
MOV TL0,TIME_L
MOV TH0,TIME_H
INC T_CONU
MOV A,T_CONU
CJNE A,#0AH,INT_END
MOV T_CONU,#00H
CPL LED
INT_END:
POP PSW
POP ACC
RETI
;--------------------------------------------
;DS1302 初始化子程序
; (R0)=数据 (R1)=地址
;--------------------------------------------
PROSET:
CLR RST ;DS1302复位
CLR SCLK
NOP
NOP
SETB RST
MOV R1,#80H ;写秒寄存器
MOV R0,#00H ;启动振荡器
LCALL WRITE
MOV R1,#82H ;写分寄存器
MOV R0,#53H
LCALL WRITE
MOV R1,#84H ;写时寄存器
MOV R0,#22H
LCALL WRITE
MOV R1,#90H ;写充电寄存器
MOV R0,#0ABH
LCALL WRITE
RET
;===============================================
;读时间、日期数据子程序
;存放单元 40H - 46H
;===============================================
GET_TIME:
MOV R1,#81H ;读秒
LCALL READ
MOV 40H,R0
MOV R1,#83H ;读分
LCALL READ
MOV 41H,R0
MOV R1,#85H ;读时
LCALL READ
MOV 42H,R0
MOV R1,#87H ;读出日期
LCALL READ
MOV 43H,R0
MOV R1,#89H ;读出月份
LCALL READ
MOV 44H,R0
MOV R1,#8BH ;读出星期
LCALL READ
MOV 46H,R0
MOV R1,#8DH ;读出年
LCALL READ
MOV 45H,R0
RET
;================================================
;写 DS1302 子程序 R0=数据,R1=地址
;================================================
WRITE:
CLR SCLK
NOP
NOP
SETB RST
NOP
MOV A,R1
MOV R2,#08H
WRI_01:
RRC A ;传输地址到DS1302
NOP
NOP
CLR SCLK
NOP
NOP
MOV IO_DATA,C
NOP
NOP
SETB SCLK
NOP
NOP
DJNZ R2,WRI_01
CLR SCLK
NOP
NOP
MOV A,R0
MOV R2,#08H
WRI_02:
RRC A ;传输数据到DS1302
NOP
CLR SCLK
NOP
NOP
MOV IO_DATA,C
NOP
NOP
SETB SCLK
NOP
NOP
DJNZ R2,WRI_02
CLR SCLK
NOP
NOP
CLR RST
NOP
NOP
RET
;=================================================
;读 DS1302 子程序
;=================================================
READ:
CLR SCLK
NOP
NOP
SETB RST
NOP
NOP
MOV A,R1 ;取地址
MOV R2,#08H ;字节数
READ_01:
RRC A
NOP ;先传输地址到DS1302
MOV IO_DATA,C
NOP
NOP
SETB SCLK
NOP
NOP
CLR SCLK
NOP
NOP
DJNZ R2,READ_01
NOP
NOP
SETB IO_DATA
CLR A
CLR C
MOV R2,#08H
READ_02:
CLR SCLK
NOP
NOP
MOV C,IO_DATA
NOP
NOP
RRC A ;再从DS1302接收数据
NOP
NOP
SETB SCLK
NOP
NOP
DJNZ R2,READ_02
MOV R0,A
CLR RST
RET
;==============================================
;实时时间、日期数据处理子程序
;==============================================
CHULI:
MOV A,40H ;处理秒数据
ANL A,#0FH
MOV 50H,A
MOV 70H,A
MOV A,40H
ANL A,#11110000B
SWAP A
MOV 51H,A
MOV 71H,A
;---------------------------------------------
MOV A,41H ;处理分数据
ANL A,#0FH
MOV 52H,A
MOV 72H,A
MOV A,41H
ANL A,#11110000B
SWAP A
MOV 53H,A
MOV 73H,A
;---------------------------------------------
MOV A,42H ;处理时数据
ANL A,#0FH
MOV 54H,A
MOV 74H,A
MOV A,42H
ANL A,#11110000B
SWAP A
MOV 75H,A
JNZ Z1 ;十位灭零
MOV A,#0AH
Z1:MOV 55H,A
;----------------------------------------------
MOV A,43H ;处理日数据
ANL A,#0FH
MOV 60H,A
MOV 76H,A
MOV A,43H
ANL A,#11110000B
SWAP A
MOV 61H,A
MOV 77H,A
;---------------------------------------------
MOV A,44H ;处理月数据
ANL A,#0FH
MOV 62H,A
MOV 78H,A
MOV A,44H
ANL A,#11110000B
SWAP A
MOV 63H,A
MOV 79H,A
;---------------------------------------------
MOV A,45H ;处理年数据
ANL A,#0FH
MOV 64H,A
MOV 7AH,A
MOV A,45H
ANL A,#11110000B
SWAP A
MOV 65H,A
MOV 7BH,A
;----------------------------------------------
MOV A,46H ;处理周数据
MOV 66H,A
MOV 7CH,A
RET
;=============================================
;实时时间、日期查表取数子程序
;=============================================
DISP: MOV R3,#06H
DISP1: MOV A,@R0
MOV DPTR,#TAB_NU
MOVC A,@A+DPTR
MOV @R0,A
INC R0
DJNZ R3,DISP1
RET
;====================================================
;时间、日期显示子程序
;====================================================
TIME_DISPLAY:
MOV P0,@R0 ;显示秒个位
CLR P2.1
INC R0
CALL DELAY
SETB P2.1
MOV P0,@R0 ;显示秒十位
CLR P2.2
INC R0
CALL DELAY
SETB P2.2
MOV P0,@R0 ;显示分个位
CLR P2.3
INC R0
CALL DELAY
SETB P2.3
MOV P0,@R0 ;显示分十位
CLR P2.4
INC R0
CALL DELAY
SETB P2.4
MOV P0,@R0 ;显示时个位
CLR P2.5
INC R0
CALL DELAY
SETB P2.5
MOV P0,@R0 ;显示时个位
CLR P2.6
CALL DELAY
SETB P2.6
DELAY:
MOV R4,#0AH
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -