📄 keylcd.asm
字号:
;***************数码显示时钟程序
;RAM定义
;*************************
BIT_COUNT DATA 07FH
TIMER DATA 07EH
TIMER1 DATA 07DH
TEN DATA 07CH
TIMER3 DATA 07BH
TIMER4 DATA 07CH
DATA_IN DATA 020H
DATA_OUT DATA 021H
;**************************
;I/O口定义
;**************************
KEY BIT P3.3
DAT BIT P3.4
CLK BIT P3.5
FMQ BIT P2.0
;**************************
ORG 0000H
AJMP START
ORG 0003H
AJMP ZD0
ORG 000BH
AJMP ZDT0
ORG 0030H
START: MOV SP,#50H
CLR DAT
SETB KEY
CLR CLK
ACALL d100ms ;显示、DS12C887延时
ACALL d100ms
ACALL D100MS
MOV DATA_OUT,#10100100B ;发复位指令
ACALL SEND
CLR FMQ
SETB IT0 ;中断0用脉冲后沿触发
SETB EA
SETB EX0
MOV TMOD,#11H
SETB ET0
MOV TIMER3,#20 ;1S中断1次
MOV TH0,#3CH
MOV TL0,#0B0H ;50MS(12M)
SETB TR0
MAIN: JB KEY,$ ;检测是否有键按下
CLR EX0 ;有键按下时必须让中断关闭,不让数据改变
CLR ET0
MOV DATA_OUT,#00010101B ;有键按下,发送读键盘指令
ACALL SEND
ACALL RECEIVE
MOV A,DATA_IN
CJNE A,#10,MAIN2 ;不是设定键?
MOV 3AH,#11011111B ;装位闪烁数据
MOV 3BH,#0CDH ;装显示位
MOV R0,#40H ;按键值暂存首地址
MOV 45H,#0FFH ;便于判断是否按完6位
MAINA: MOV DATA_OUT,#10001000B ;位闪烁
ACALL SEND
MOV DATA_OUT,3AH ;第N位闪烁
ACALL SEND
JNB KEY,$ ;等待按键结束
JB KEY,$ ;检测是否有键按下
MOV DATA_OUT,#00010101B ;有键按下,发送读键盘指令
ACALL SEND
ACALL RECEIVE
MOV A,DATA_IN
MAINB: CJNE A,#12,MAINC ;按结束键
MOV A,45H
CJNE A,#0FFH,MAIND
JNB KEY,$
AJMP MAIN1
MAINC: MOV @R0,DATA_IN
mov data_out,3BH ;下载数据且按方式1译码(第6位)
ACALL send
mov data_out,data_in ;发送1位数字到HD7279
ACALL SEND
MOV A,3AH
RR A
MOV 3AH,A
DEC 3BH
INC R0
AJMP MAINA
MAIND: MOV A,44H ;将键盘值2字节合成1字节保存在以30H为首的RAM中
MOV B,#10
MUL AB
ADD A,45H
MOV 30H,A
MOV A,42H
MOV B,#10
MUL AB
ADD A,43H
MOV 31H,A
MOV A,40H
MOV B,#10
MUL AB
ADD A,41H
MOV 32H,A
JNB KEY,$ ;等待按键结束
NOP
NOP
ACALL WSJ
NOP
MAIN1: SETB EX0
SETB ET0
MOV DATA_OUT,#10100100B ;发复位指令
ACALL SEND
AJMP MAIN
MAIN2: CJNE A,#11,MAIN1 ;不是定闹去开中断
ACALL NZXS
MOV 3AH,#11011111B ;装位闪烁数据
MOV 3BH,#0CDH ;装显示位
MOV R0,#40H ;按键值暂存首地址
MOV 45H,#0FFH ;便于判断是否按完6位
DN1: MOV DATA_OUT,#10001000B ;位闪烁
ACALL SEND
MOV DATA_OUT,3AH ;第N位闪烁
ACALL SEND
JNB KEY,$ ;等待按键结束
JB KEY,$ ;检测是否有键按下
MOV DATA_OUT,#00010101B ;有键按下,发送读键盘指令
ACALL SEND
ACALL RECEIVE
MOV A,DATA_IN
DN2: CJNE A,#12,DN3 ;按结束键
MOV A,45H
CJNE A,#0FFH,DN4
JNB KEY,$
AJMP MAIN1
DN3: MOV @R0,DATA_IN
mov data_out,3BH ;下载数据且按方式1译码(第6位)
ACALL send
mov data_out,data_in ;发送1位数字到HD7279
ACALL SEND
MOV A,3AH
RR A
MOV 3AH,A
DEC 3BH
INC R0
AJMP DN1
DN4: MOV A,44H ;将键盘值2字节合成1字节保存在以33H为首的RAM中
MOV B,#10
MUL AB
ADD A,45H
MOV 33H,A
MOV A,42H
MOV B,#10
MUL AB
ADD A,43H
MOV 34H,A
MOV A,40H
MOV B,#10
MUL AB
ADD A,41H
MOV 35H,A
JNB KEY,$ ;等待按键结束
NOP
NOP
ACALL WNZ
NOP
AJMP MAIN1
WSJ: MOV R1,#0AH ;寄存器A地址
MOV A,#70H ;DV2~DV0=111,分频复位
MOVX @R1,A
INC R1 ;到寄存器B地址
MOV A,#8EH ;停止更新,允许更新中断,选10进制,24小时制
MOVX @R1,A
MOV R1,#00H ;秒单元地址
MOV A,30H
MOVX @R1,A
MOV R1,#02H ;分单元地址
MOV A,31H
MOVX @R1,A
MOV R1,#04H ;时单元地址
MOV A,32H
MOVX @R1,A
MOV R1,#07H ;日单元地址
MOV A,#20
MOVX @R1,A
INC R1 ;月单元地址
MOV A,#2 ;2月
MOVX @R1,A
INC R1 ;年单元后两位地址
MOV A,#2 ;2002年
MOVX @R1,A
MOV R1,#32H ;年单元前两位地址
MOV A,#20 ;2002年
MOVX @R1,A
WSJ1: MOV R1,#0AH ;寄存器A地址
MOV A,#2FH ;DV2~DV0=010 RS3~RS0=1111 决定输出频率500MS
MOVX @R1,A ;选周期中断为500Ms,允许方波输出,频率2Hz
MOV R1,#0BH ;到寄存器B地址
MOV A,#2EH ;每秒更新1次,允许方波输出,24小时制 每秒中断1次
MOVX @R1,A ;时钟开始运行
RET
;写闹钟
WNZ: MOV R1,#0AH ;寄存器A地址
MOV A,#70H ;DV2~DV0=111,分频复位
MOVX @R1,A
INC R1 ;到寄存器B地址
MOV A,#8EH ;停止更新,允许更新中断,选10进制,24小时制
MOVX @R1,A
MOV R1,#01H ;秒闹地址
MOV A,33H ;秒闹时间
MOVX @R1,A
MOV R1,#03H ;分闹地址
MOV A,34H ;分闹时间
MOVX @R1,A
MOV R1,#05H ;时闹地址
MOV A,35H ;时闹时间
MOVX @R1,A
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -