单片机实验3LDE数码管动态显示与按键去抖程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1、MAIN.ASM
;====变量定义段====
CS0 BIT P2.0 ;个位位选
CS1 BIT P2.1 ;十位位选
CS2 BIT P2.2 ;百位位选
CS3 BIT P2.3 ;千位位选
CS4 BIT P2.4 ;LED灯位选
DSW EQU 30H ;位选计数
DSB0 EQU 31H ;显示缓冲单元个位
DSB1 EQU 32H ;显示缓冲单元十位
DSB2 EQU 33H ;显示缓冲单元百位
DSB3 EQU 34H ;显示缓冲单元千位
DSB4 EQU 20H ;显示缓冲单元指示灯状态
LD1 BIT DSB4.0 ;指示灯LD1控制位
LD2 BIT DSB4.1 ;指示灯LD2控制位
LD3 BIT DSB4.2 ;指示灯LD3控制位
LD4 BIT DSB4.3 ;指示灯LD4控制位
LD5 BIT DSB4.4 ;指示灯LD5控制位
LD6 BIT DSB4.5 ;指示灯LD6控制位
LD7 BIT DSB4.6 ;指示灯LD7控制位
LD8 BIT DSB4.7 ;指示灯LD8控制位
KEY EQU 21H ;键状态字
SW1 BIT KEY.6 ;SW1键
SW2 BIT KEY.7 ;SW2键
EKEY EQU 22H ;键前沿字
ESW1 BIT EKEY.6 ;SW1键前沿
ESW2 BIT EKEY.7 ;SW2键前沿
KTMR EQU 35H ;键去抖延时器
AJS1 EQU 40H ;每按一次SW1,(AJS2:AJS1)+1 AJS2 EQU 41H ;每按一次SW2,(AJS2:AJS1)-1 ;====常数定义段====
;==================
ORG 0000H
LJMP MAIN
ORG 0030H
MAIN: INCLUDE "INITIAL.INC"
MLOOP: LCALL DELAY ;延时5ms
LCALL RDKEY ;读键
LCALL DISP
JNB ESW1,M03 ;无SW1键转移
MOV R6,#00H
MOV R7,#01H
SJMP M05
M03: JB ESW2,M04 ;有SW2键转移
LJMP MLOOP
M04: MOV R6,#99H
MOV R7,#99H
M05: MOV A,AJS1 ;(AJS2:AJS1)十进制±1
ADD A,R7
DA A
MOV AJS1,A
MOV A,AJS2
ADDC A,R6
DA A
MOV AJS2,A
MOV A,AJS1 ;(AJS2:AJS1)送显示
ANL A,#0FH
MOV DSB0,A
MOV A,AJS1
SW AP A
ANL A,#0FH
MOV DSB1,A
MOV A,AJS2
ANL A,#0FH
MOV DSB2,A
MOV A,AJS2
SW AP A
ANL A,#0FH
MOV DSB3,A
LJMP MLOOP
;====延时子程序(2*R7+3)*R6+5=5ms====
DELAY: MOV R6,#0AH
DL01: MOV R7,#0F8H
DL02: DJNZ R7,DL02
DJNZ R6,DL01
RET
;====通用子程序段====
INCLUDE "RDKEY.ASM";添加读键状态及去抖处理子程序
INCLUDE "DISP.ASM" ;添加数码管动态扫描显示子程序
END
2、INITIAL.INC
MOV SP,#5FH
MOV R0,#20H
MOV R7,#60H
CLR A
M01: MOV @R0,A ;存储器20H-7FH清零
INC R0
DJNZ R7,M01
MOV DSB0,#03H
MOV DSB1,#01H
MOV DSB2,#01H
MOV DSB3,#07H
MOV R4,#0C8H
M02: LCALL DELAY
LCALL DISP ;显示"7113"1秒
DJNZ R4,M02
CLR A
MOV DSB0,A
MOV DSB1,A
MOV DSB2,A
MOV DSB3,A
END
3、RDKEY.ASM
;====读独立按键子程序(延时去抖)==== RDKEY: ORL P1,#0C0H ;先置1,后读口
MOV A,P1 ;读键
ANL A,#0C0H ;接独立键盘的位保留
XRL A,#0C0H ;求反转正逻辑
MOV R7,A ;新的键状态暂存R7
CJNE A,KEY,RDK0 ;键状态变化则转移
MOV KTMR,#05H ;去抖延时器加载初值
SJMP RDK1
RDK0: MOV A,KTMR ;过了延时时间?
JZ RDK1
DEC KTMR ;延时未结束
MOV R7,KEY ;放弃不稳定的键状态RDK1: MOV A,KEY ;键前沿提取
XRL A,R7
ANL A,R7
MOV EKEY,A
MOV KEY,R7 ;启用键的新状态
RET
END
4、DISP.ASM
;====5位数码管扫描子程序====
DISP: ORL P2,#1FH ;关闭数码显示器
MOV A,DSW ;根据扫描循环变量转移
ANL A,#07H
RL A
MOV DPTR,#DSTAB
JMP @A+DPTR
DSTAB: AJMP DIS0
AJMP DIS1
AJMP DIS2
AJMP DIS3
AJMP DIS4
AJMP DIS0
AJMP DIS0
AJMP DIS0
DIS0: MOV A,DSB0 ;扫描个位数码管