⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 djsdsq.asm

📁 学习单片机一个简单程序和硬件的开发
💻 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 + -