📄 keylcd.asm
字号:
AJMP WSJ1
;将秒、分、时、日、月、年(2字节)读出并存放在30H开始的N个单元中? RSJ: MOV R1,#0AH ;寄存器A地址
MOVX A,@R1
JB ACC.7,RSJ ;UIP=1 等待更新完毕
MOV R1,#00H ;秒地址单元
MOVX A,@R1 ;读秒数据
MOV 30H,A ;送入89C52RAM
MOV R1,#02H ;分单元地址
MOVX A,@R1 ;读分数据
MOV 31H,A ;送入89C52RAM
MOV R1,#04H ;时单元地址
MOVX A,@R1 ;读时数据
MOV 32H,A ;送入89C52RAM
MOV R1,#07H ;日单元地址
MOVX A,@R1 ;读日数据
MOV 33H,A ;送入89C52RAM
MOV R1,#08H ;月单元地址
MOVX A,@R1 ;读月数据
MOV 34H,A ;送入89C52RAM
MOV R1,#09H ;年单元地址
MOVX A,@R1 ;读年后两位数据
MOV 35H,A ;送入89C52RAM
MOV R1,#32H ;年单元地址
MOVX A,@R1 ;读年前两位数据
MOV 36H,A ;送入89C52RAM
RET
;将秒、分、时、日、月、年(2字节)读出并存放在33H开始的N个单元中? RNZ: MOV R1,#0AH ;寄存器A地址
MOVX A,@R1
JB ACC.7,RNZ ;UIP=1 等待更新完毕
MOV R1,#01H ;秒闹地址单元
MOVX A,@R1 ;读秒闹数据
MOV 33H,A ;送入89C52RAM
MOV R1,#03H ;分闹单元地址
MOVX A,@R1 ;读分闹数据
MOV 34H,A ;送入89C52RAM
MOV R1,#05H ;时闹单元地址
MOVX A,@R1 ;读时闹数据
MOV 35H,A ;送入89C52RAM
RET
;*******************************************
;发送1个字节到HD7279,高位在前
SEND: MOV BIT_COUNT,#8
ACALL LONG_DELAY
SEND_LOOP: MOV C,DATA_OUT.7 ;输出1位
MOV DAT,C
SETB CLK
MOV A,DATA_OUT
RL A
MOV DATA_OUT,A
ACALL SHORT_DELAY
CLR CLK
ACALL SHORT_DELAY
DJNZ BIT_COUNT,SEND_LOOP ;检测是否8位均发送完毕
CLR DAT
RET
;*********************************************
;从HD7279接收1个字节,高位在前
RECEIVE: MOV BIT_COUNT,#8 ;设定计数器=8
SETB DAT
ACALL LONG_DELAY
RECEIVE_LOOP:SETB CLK
ACALL SHORT_DELAY
MOV A,DATA_IN ;数据左移
RL A
MOV DATA_IN,A
MOV C,DAT ;读取1位数据
MOV DATA_IN.0,C
CLR CLK
ACALL SHORT_DELAY
DJNZ BIT_COUNT,RECEIVE_LOOP ;是否已接收8位数据
CLR DAT
RET
;延时子程序
LONG_DELAY: MOV TIMER,#25 ;设定延时为约50us
DJNZ TIMER,$
RET
SHORT_DELAY: MOV TIMER,#4 ;设定延时为约8us
DJNZ TIMER,$
RET
;*******************************************************
ZD0: MOV R7,#60 ;闹钟声音
ZD0A: SETB FMQ
ACALL D20MS
JNB KEY,ZD0B
CLR FMQ
ACALL D100MS
SETB FMQ
ACALL D20MS
JNB KEY,ZD0B
CLR FMQ
ACALL D100MS
JNB KEY,ZD0B
ACALL D100MS
JNB KEY,ZD0B
ACALL D100MS
JNB KEY,ZD0B
ACALL D100MS
ACALL XS
JNB KEY,ZD0B
DJNZ R7,ZD0A
ZD0B: CLR FMQ
RETI
ZDT0: DJNZ TIMER3,ZDT01
ACALL XS
MOV TIMER3,#20
ZDT01: MOV TH0,#3CH
MOV TL0,#0B0H ;50MS(12M)
RETI
XS: PUSH ACC
ACALL RSJ
MOV B,#10 ;10进制--BCD码转换
mov a,32H
div AB
mov ten,a
mov data_out,#10000101b ;下载数据且译码(第6位)
ACALL SEND
mov data_out,ten ;发送十位数字到HD7279
ACALL SEND
MOV DATA_OUT,#10000100B ;下载数据且译码(第5位)
ACALL send
mov data_out,b ;发送个位数字到HD7279
ACALL SEND
MOV B,#10 ;10进制--BCD码转换
mov a,31H
div AB
mov ten,a
mov data_out,#10000011b ;下载数据且译码(第4位)
ACALL SEND
mov data_out,ten ;发送十位数字到HD7279
ACALL SEND
MOV DATA_OUT,#10000010B ;下载数据且译码(第3位)
ACALL send
mov data_out,b ;发送个位数字到HD7279
ACALL SEND
MOV B,#10 ;10进制--BCD码转换
mov a,30H
div AB
mov ten,a
mov data_out,#10000001b ;下载数据且译码(第2位)
ACALL SEND
mov data_out,ten ;发送十位数字到HD7279
ACALL SEND
MOV DATA_OUT,#10000000B ;下载数据且译码(第1位)
ACALL send
mov data_out,b ;发送个位数字到HD7279
ACALL SEND
MOV R1,#0CH ;寄存器C地址
MOVX A,@R1
POP ACC
RET
NZXS: PUSH ACC
ACALL RNZ
MOV B,#10 ;10进制--BCD码转换
mov a,35H
div AB
mov ten,a
mov data_out,#10000101b ;下载数据且译码(第6位)
ACALL SEND
mov data_out,ten ;发送十位数字到HD7279
ACALL SEND
MOV DATA_OUT,#10000100B ;下载数据且译码(第5位)
ACALL send
mov data_out,b ;发送个位数字到HD7279
ACALL SEND
MOV B,#10 ;10进制--BCD码转换
mov a,34H
div AB
mov ten,a
mov data_out,#10000011b ;下载数据且译码(第4位)
ACALL SEND
mov data_out,ten ;发送十位数字到HD7279
ACALL SEND
MOV DATA_OUT,#10000010B ;下载数据且译码(第3位)
ACALL send
mov data_out,b ;发送个位数字到HD7279
ACALL SEND
MOV B,#10 ;10进制--BCD码转换
mov a,33H
div AB
mov ten,a
mov data_out,#10000001b ;下载数据且译码(第2位)
ACALL SEND
mov data_out,ten ;发送十位数字到HD7279
ACALL SEND
MOV DATA_OUT,#10000000B ;下载数据且译码(第1位)
ACALL send
mov data_out,b ;发送个位数字到HD7279
ACALL SEND
MOV R1,#0CH ;寄存器C地址
MOVX A,@R1
POP ACC
RET
;************************************************************
d100ms: MOV TIMER,#200
D100MS1:MOV TIMER1,#250
DJNZ TIMER1,$
DJNZ TIMER,D100MS1
RET
d20ms: MOV TIMER,#40
D20MS1: MOV TIMER1,#250
DJNZ TIMER1,$
DJNZ TIMER,D20MS1
RET
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -