📄 djsdsq.asm
字号:
;CONSTANT DEFINE ;常数定义
CSP EQU 60H ;堆栈开始使用的位置.
CUPKEY EQU 01H ;按键键值
CDOWNKEY EQU 02H
CSETKEY EQU 04H
CSTARTKEY EQU 08H
CSTOPKEY EQU 10H
CCNTTIMES0 EQU 2 ;倒计时时间为2秒
CCNTTIMES1 EQU 5 ;............5.
CCNTTIMES2 EQU 15 ;............15.
CCNTTIMES3 EQU 20 ;............20.
CCNTTIMES4 EQU 30 ;............30.
CCNTTIMES5 EQU 45 ;............45.
CCNTTIMES6 EQU 50 ;............50.
CCNTTIMES7 EQU 60 ;............60.
CCNTSUM EQU 8-1 ;倒计时时间设定档次共有八档
CKEYCNTSUM EQU 3 ;扫描键盘确定键值次数为3,去除键盘抖动时间为30MS=3*10MS
C10MSCNT EQU 200 ;10MS计数用常数:200=10MS/50US
C1SCNT EQU 100 ;1S计数用常数:100=1S/10MS
CFLAGALARM EQU 01H ;定时时间到了,蜂鸣器发出蜂鸣声标志位
CFLAGKEY EQU 02H ;10MS时间到了,扫描键盘标志位
CFLAGCNSTART EQU 03H ;倒计时开始标志位
CFLAGCNSET EQU 07H ;倒计时时间设定标志位
CFKEYREL EQU 04H ;等待按键释放标志位
CFADIGIT EQU 05H ;显示数码管个位数标志位
CF1STIME EQU 06H ;1S时间到了标志位
;=======================================
;VARIABLE DEFINE ;变量定义
VFLAG EQU 20H ;标志位存放内存位置
VADIGIT EQU 30H ;数码管个位数存放内存位置
VBDIGIT EQU 31H ;数码管十位数存放内存位置
VCNT1 EQU 33H ;8.字型LED显示数值存放内存位置
VCNT2 EQU 34H ;10MS计数用(值每变化1为50US),存放内存位置
VCNT3 EQU 35H ;1S计数用(值每变化1为10MS),存放内存位置
VCNTTIMES EQU 36H ;倒计时时间设定档次(八档)存放内存位置
VKEYCODE EQU 37H ;键值保存放内存位置
VCNTKEY EQU 38H ;扫描键盘计数放内存位置
;VALARMDL EQU 3AH ;蜂鸣声延时1S计数内存位置
;=======================================
;FUNC: 程序开始.
;=======================================
ORG 0000H
AJMP MAININITIAL
ORG 000BH
LJMP TIMER0INTERRUPT
ORG 0050H
;=======================================
;FUNC: 定时器T0中断服务程序.
;=======================================
TIMER0INTERRUPT:
DJNZ VCNT2,TIMER0INTOUT ;10MS时间到了?
SETB VFLAG.CFLAGKEY ;10MS时间到了,设置扫描键盘标志位
MOV VCNT2,#C10MSCNT ;10MS时间到了,重新装载计数变量VCNT2
JNB VFLAG.CFLAGCNSTART,TIMER0INTOUT ;倒计时还没开始?
DJNZ VCNT3,TIMER0INTOUT ;1S时间到了?
MOV VCNT3,#C1SCNT ;1S时间到了,重新装载计数变量VCNT3
SETB VFLAG.CF1STIME ;设置1S时间到了标志位
JB VFLAG.CFLAGALARM,TIMER0INTOUT ;蜂鸣器正在发出蜂鸣声?
DJNZ VCNT1,TIMER0INTOUT ;倒计时时间完成?
SETB VFLAG.CFLAGALARM ;定时时间到了,设置蜂鸣器发出蜂鸣声标志位
CLR VFLAG.CFLAGCNSTART ;清倒计时开始标志位为0.
TIMER0INTOUT:
RETI ;中断返回
ORG 0630H
;=======================================
;FUNC: 程序初始化.
;=======================================
MAININITIAL: ;初始化特殊寄存器及变量
MOV SP,#CSP ;指定堆栈开始使用的位置.
MOV VFLAG,#0 ;清除标志位变量
MOV VCNT2,#C10MSCNT ;装载计数变量VCNT2初值
MOV VCNT3,#C1SCNT ;装载计数变量VCNT3初值
MOV VCNTTIMES,#CCNTSUM ;装载倒计时时间档次初值为7
MOV VCNT1,#CCNTTIMES7 ;装载倒计时时间初值为60
MOV VCNTKEY,#0
MOV VKEYCODE,#0
MOV TMOD,#02H ;设置T0工作方式2
MOV TH0,#0D2H ;设置计数初值,用于延时50US : (256-X)/11.0592*12=50US==>X=210(0D2H)
MOV TL0,#0D2H ;使用11.0592M晶振.
SETB EA ;开中断
SETB ET0 ;允许TIMER0中断
; CLR TR0 ;停止定时
SETB TR0 ;启动定时
MOV P0,#0FFH ;关闭所有LED灯
SATRTWORK:
ACALL DISPLAY ;8.字型LED显示倒计时时间.
ACALL ALARM ;发出蜂鸣声.
JNB VFLAG.CFLAGKEY,SATRTWORK ;10MS时间到了?
CLR VFLAG.CFLAGKEY ;清扫描键盘标志位
ACALL SCANKEYIO ;扫描键盘
ANL A,#0FFH
MOV R0,A
JZ NOTGETKEY ;键盘无按键按下?
XRL A,VKEYCODE ;键盘有按键
JNZ NOTGETKEY ;键盘有按键按下,键值与上次的相同吗?
JB VFLAG.CFKEYREL,SATRTWORK ;正在等待按键释放?
MOV VKEYCODE,R0 ;键值与上次的相同,保存键值
INC VCNTKEY ;增加(键值与上次的相同的)计数器
MOV R1,VCNTKEY
CJNE R1,#CKEYCNTSUM,SATRTWORK ;去抖动,键值已经三次相同吗?
ACALL PROCESSKEY ;获得有效按键,按键处理.
SETB VFLAG.CFKEYREL ;设置等待按键释放标志位为1.
AJMP SATRTWORK
NOTGETKEY:
MOV VKEYCODE,R0
MOV VCNTKEY,#0
CLR VFLAG.CFKEYREL ;清等待按键释放标志位为0.
AJMP SATRTWORK
;=======================================
;FUNC: 按键处理
;INPUT: VKEYCODE
;=======================================
PROCESSKEY:
JB VFLAG.CFLAGALARM,CLOSEALARM ;蜂鸣器正在发出蜂鸣声?
JB VFLAG.CFLAGCNSTART,COUNTING ;倒计时进行中?
JB VFLAG.CFLAGCNSET,SETTING ;倒计时时间设定中?
MOV A,VKEYCODE ;非上述三种状态下按键处理.
CJNE A,#CSETKEY,NEXTKEYD1 ;是时间设定键吗?
CLR VFLAG.CFLAGCNSTART ;清倒计时开始标志位为0.
SETB VFLAG.CFLAGCNSET ;置倒计时时间设定标志位为1.
MOV VCNTTIMES,#CCNTSUM ;装载倒计时时间档次初值为7
MOV VCNT1,#CCNTTIMES7 ;装载倒计时时间初值为60
AJMP PROCESSKEYOUT
NEXTKEYD1:
CJNE A,#CSTARTKEY,NEXTKEYD2 ;是倒计时开始键吗?
CLR VFLAG.CFLAGCNSET ;清倒计时时间设定标志位为0.
SETB VFLAG.CFLAGCNSTART ;置倒计时开始标志位为1.
NEXTKEYD2:
AJMP PROCESSKEYOUT
SETTING: ;倒计时时间设定中按键处理
MOV A,VKEYCODE
CJNE A,#CUPKEY,NEXTKEYS1 ;是倒计时时间设定档次增加键(共有八档)吗?
MOV A,VCNTTIMES
CJNE A,#CCNTSUM,NOMAX ;倒计时时间档次不为7(最大值)吗?
MOV VCNTTIMES,#0 ;倒计时时间档次为0(最小值).
AJMP GETCNTTIMESDATA
NOMAX:
INC VCNTTIMES ;倒计时时间档次增加一.
AJMP GETCNTTIMESDATA
NEXTKEYS1:
CJNE A,#CDOWNKEY,NEXTKEYS2 ;是倒计时时间设定档次减少键(共有八档)吗?
MOV A,VCNTTIMES
CJNE A,#0,NOMIN ;倒计时时间档次不为0(最小值)吗?
MOV VCNTTIMES,#CCNTSUM ;倒计时时间档次为7(最大值).
AJMP GETCNTTIMESDATA
NOMIN:
DEC VCNTTIMES ;倒计时时间档次减少一.
GETCNTTIMESDATA: ;获得该倒计时时间档次的倒计时时间。
MOV A,VCNTTIMES
MOV DPTR,#CNTTIMETAB
MOVC A,@A+DPTR ;查表获得该倒计时时间档次的倒计时时间。
MOV VCNT1,A
AJMP PROCESSKEYOUT
NEXTKEYS2:
CJNE A,#CSTARTKEY,NEXTKEYS3 ;是倒计时开始键吗?
CLR VFLAG.CFLAGCNSET ;清倒计时时间设定标志位为0.
SETB VFLAG.CFLAGCNSTART ;置倒计时开始标志位为1.
NEXTKEYS3:
AJMP PROCESSKEYOUT
COUNTING: ;倒计时进行中按键处理
MOV A,VKEYCODE
CJNE A,#CSTOPKEY,NEXTKEYC1 ;是倒计时停止键吗?
CLR VFLAG.CFLAGCNSTART ;清倒计时开始标志位为0.
NEXTKEYC1:
AJMP PROCESSKEYOUT
CLOSEALARM: ;蜂鸣器正在发出蜂鸣声按键处理
CLR VFLAG.CFLAGALARM ;清蜂鸣器发出蜂鸣声标志位为0.
SETB P3.7 ;
MOV VCNTTIMES,#CCNTSUM ;装载倒计时时间档次初值为7
MOV VCNT1,#CCNTTIMES7 ;装载倒计时时间初值为60
PROCESSKEYOUT:
RET
CNTTIMETAB: ;可以选择的倒计时时间表
DB CCNTTIMES0,CCNTTIMES1,CCNTTIMES2,CCNTTIMES3,CCNTTIMES4,CCNTTIMES5,CCNTTIMES6,CCNTTIMES7
;=======================================
;FUNC: 获得P2口的输入状态
;OUTPUT: A
;=======================================
SCANKEYIO:
MOV P2,#0FFH ;将P2口各位置1
MOV A,P2
ANL A,#1FH
XRL A,#1FH
RET
;=======================================
;FUNC: 判断倒计时时间是否到了,到了就发出蜂鸣声。
;INPUT: VFLAG.CFLAGALARM,VFLAG.CF1STIME,
;=======================================
ALARM:
JNB VFLAG.CFLAGALARM,ALARMOUT ;蜂鸣器不发出蜂鸣声?
JNB VFLAG.CF1STIME,ALARMOUT ;延时1S时间还没到了?
CLR VFLAG.CF1STIME ;清除1S时间到了标志位
CPL P3.7 ;输出1KHZ方波
ALARMOUT:
RET
;=======================================
;FUNC: 8.字型LED显示子程序
;INPUT: VCNT1,VFLAG.CFADIGIT,
;=======================================
DISPLAY:
JB VFLAG.CFADIGIT,DISPADIDIT ;现在显示数码管个位数?
MOV A,VCNT1 ;将TEMP中的十六进制数转换成10进制
MOV B,#10 ;10进制/10=10进制
DIV AB ;A除以B,商在A,余数在B.
MOV VBDIGIT,A ;十位在A
MOV VADIGIT,B ;个位在B
MOV DPTR,#DIGITTAB ;指定查表启始地址
SETB P3.2 ;关闭个位显示
MOV A,VBDIGIT ;取十位数
MOVC A,@A+DPTR ;查十位数的7段代码
MOV P1,A ;送出十位的7段代码
CLR P3.3 ;开十位显示
CPL VFLAG.CFADIGIT ;设置标志位为下一次显示个位数
AJMP DISPLAYOUT
DISPADIDIT: ;显示个位数
MOV DPTR,#DIGITTAB ;指定查表启始地址
SETB P3.3 ;关闭十位显示
MOV A,VADIGIT ;取个位数
MOVC A,@A+DPTR ;查个位数的7段代码
MOV P1,A ;送出个位的7段代码
CLR P3.2 ;开个位显示
CPL VFLAG.CFADIGIT ;设置标志位为下一次显示十位数
DISPLAYOUT:
RET
;=======================================
DIGITTAB: ;实验板上的7段数码管0~9数字的共阳显示代码
DB 0C0H ;0
DB 0F9H ;1
DB 0A4H ;2
DB 0B0H ;3
DB 099H ;4
DB 092H ;5
DB 082H ;6
DB 0F8H ;7
DB 080H ;8
DB 090H ;9
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -