📄 oo.asm
字号:
;*****************************************
;* 三路六个状态定时开关控制器 *
;*****************************************
;* S1----对时按钮;S2--对分按钮 *
;* S3--对秒按钮;S4--退出对时 *
;* S5--设定预设值按钮 *
;*****************************************
TS EQU 2DH ;* TS 为秒计数器(二进制,0~24)
TM EQU 2EH ;* TM 为分计数器(二进制,0~60)
TH EQU 2FH ;* TH 为时计数器(二进制,0~60)
K5 EQU 26H ;S5状态
KEYCODE EQU 29H ;*KEYCODE 为键盘值
TT0 EQU 2BH ;*与T0配合构成为秒脉冲发生器
CCB EQU 20H ;预设‘时间到’标志,为01H时表示时间到
OFF EQU 0FFH ;预设值复位标志
DPS0 EQU 11000000B ;秒个位选通
DPS1 EQU 11001000B ;秒十位选通
DPM0 EQU 11010000B ;分个位选通
DPM1 EQU 11011000B ;分十位选通
DPH0 EQU 11100000B ;时个位选通
DPH1 EQU 11101000B ;时十位选通
K1ON DATA 30H ;*第一个开启时间 30H
K1OFF DATA 33H ;*第一个关闭时间 33H
K2ON DATA 36H ;*第二个开启时间 36H
K2OFF DATA 39H ;*第二个关闭时间 39H
K3ON DATA 3CH ;*第三个开启时间 3CH
K3OFF DATA 3FH ;*第三个关闭时间 3FH
ORG 0000H
AJMP MAIN
ORG 000BH ;定时器0(T0)中断入口
SJMP I_T0
ORG 001BH ;定时器1(T1)中断入口
I_T1: AJMP MAIN1
RETI
;********* 定时器0中断服务 **************
ORG 0060H ;定时器T0中断服务程序
I_T0: PUSH ACC
PUSH PSW
MOV TH0,#0DCH ;0.01s时间,常数因子DC00H
MOV R3,TT0
DJNZ R3,I_T01 ;中断次数<100(每次中断0.01S),转出.
MOV R3,#100 ;中断次数=100次,重新下一个计数.
MOV A,TS ;秒计数器加1
ADD A,#01H
MOV TS,A
SUBB A,#60 ;秒计数器>59? Y,秒计数器=00
JC I_T01
MOV TS,#00H
MOV A,TM ;分计数器加1
ADD A,#01H
MOV TM,A
SUBB A,#60 ;分计数器>59? Y,分计数器=00
JC I_T01
MOV TM,#00H
MOV A,TH ;时计数器加1
ADD A,#01H
MOV TH,A
SUBB A,#24 ;时计数器>23? Y,时计数器=00
JC I_T01
MOV TH,#00H
I_T01: MOV TT0,R3
POP PSW
POP ACC
NOP
NOP
RETI
;************ 主程序 ********************
ORG 00F0H
MAIN: MOV P0,#0FFH ;主程序,初始化
MOV P1,#0FFH
MOV P2,#0FFH
MOV P3,#0F8H ;p3.0~p3.2置低电平,使三个控制口关闭
MOV SP,#50H ;初始化堆栈指针
MOV TMOD,#11H ;T0工作于16位定时器
MOV TT0,#100 ;中断次数,每次0.01s*100=1s
MOV TH0,#0DCH ;T0初值
MOV TL0,#00H
MOV TS,#00H ;时间赋初值
MOV TM,#00H
MOV TH,#00H
CLR EX0 ;外部中断0失效
CLR EX1 ;外部中断1失效
CLR ES ;串行口中断失效
SETB ET0 ;开T0
SETB TR0 ;激活T0
SETB EA ;开总中断
MOV K5,#00H ;S5键状态赋0
mov r5,#14H ;预设值全部赋FFH,数码管显示95.95.95
mov r1,#K1ON
kk: mov @r1,#OFF
INC R1
DJNZ r5,kk
MAIN1: MOV R6,#50H ;循环显示80次,消除按键抖动
DISP: MOV KEYCODE,#00H
MOV R1,#TS ;R1保存时间存储区的首地址
MOV A,K5 ;K5为S5的状态,在设定预设值时则为增量
ADD A,R1
MOV R1,A
NOP
NOP
ACALL DISPLY ;调用显示子程序
DJNZ R6,DISP
MOV A,K5 ;S5按下时不进行比较
JNZ PP2
NOP
NOP
ACALL COMP ;判断预设置是否与当前时间相等,
PP2: MOV DPTR,#KEY ;设置转移表增量
MOV A,KEYCODE ;读键盘值
JMP @A+DPTR ;按键值跳到相应处理程序
KEY: SJMP MAIN1
SJMP KEY1 ;设置小时值
SJMP KEY2 ;设置分钟值
SJMP KEY3 ;设置秒钟值
SJMP KEY4 ;退出设置
SJMP KEY5 ;设定预设置
KEY1: MOV A,K5 ;如果S5按下,则TR0不停止计数
JNZ KEY12 ;在设定预设置值时时钟不停止
CLR TR0
KEY12: MOV A,@R1
CLR C
INC A ;时计数器加1
MOV @R1,A
SUBB A,#24 ;24D
JC KEY11
MOV @R1,#00H
KEY11: SJMP MAIN1
NOP
KEY2: MOV A,K5 ;如果S5按下,则TR0不停止计数
JNZ KEY22
CLR TR0
KEY22: DEC R1
MOV A,@R1
CLR C
INC A ;分计数器加1
MOV @R1,A
SUBB A,#60 ;60D
JC KEY21
MOV @R1,#00H
KEY21: SJMP MAIN1
NOP
KEY3: MOV A,K5 ;如果S5按下,则TR0不停止计数
JNZ KEY32
CLR TR0 ;秒计数器加1
KEY32: DEC R1
DEC R1
MOV A,@R1
CLR C
INC A
MOV @R1,A
SUBB A,#60 ;60D
JC KEY31
MOV @R1,#00H
KEY31: SJMP MAIN1
NOP
KEY4: MOV K5,#00H ;退出时将K5清0
MOV TH0,#0DCH ;退出校时状态
MOV TL0,#00H
SETB TR0
SJMP MAIN1
KEY5: MOV A,K5 ;修改预设置
CLR C
SUBB A,#12H ;判断S5按钮是否越过设定区,如果越过则将K5清0并退出设定
JZ KEY51
MOV A,K5
ADD A,#03H
MOV K5,A
AJMP KEY52
KEY51: MOV K5,#00H
KEY52: LJMP MAIN1
;*********** 键盘和显示子程序 *************
ORG 0200H ;显示子程序
DISPLY: MOV A,@R1 ;秒计数器调入A
MOV B,#0AH
DIV AB ;秒计数值÷10(结果十位从A,个位存于B)
SWAP A
ORL A,#0FH ;显示秒的十位
MOV P1,A
MOV A,P3 ;输出位选信号,以下相同
ANL A,#0FH
ORL A,#DPS1
MOV P3,A
NOP
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -