按键允许按键计数)(汇编版)
- 一、题目
- 二、代码
- 总结
- 系列文章——STC8H8K系列汇编51实战
一、题目
编程实现数码管显示SW17按钮按下的次数,要求SW18控制启动和停止,即单数次按下SW18前提下,开始记录SW17按下的次数,偶数次按下SW18按键,则将计数值清零,重新开始对SW17 按键次数计数。
二、代码
GPIO:
MOV P0M1, #0
MOV P0M0, #0
MOV P1M1, #0
MOV P1M0, #0
MOV P2M1, #0
MOV P2M0, #0
MOV P3M1, #0
MOV P3M0, #0
MOV P4M1, #0
MOV P4M0, #0
MOV P5M1, #0
MOV P5M0, #0
MOV P6M1, #0
MOV P6M0, #0
MOV P7M1, #0
MOV P7M0, #0
RET
P0M1 DATA 0x93 ; P0M1.n,P0M0.n =00--->Standard, 01--->push-pull
P0M0 DATA 0x94 ; =10--->pure input, 11--->open drain
P1M1 DATA 0x91 ; P1M1.n,P1M0.n =00--->Standard, 01--->push-pull
P1M0 DATA 0x92 ; =10--->pure input, 11--->open drain
P2M1 DATA 0x95 ; P2M1.n,P2M0.n =00--->Standard, 01--->push-pull
P2M0 DATA 0x96 ; =10--->pure input, 11--->open drain
P3M1 DATA 0xB1 ; P3M1.n,P3M0.n =00--->Standard, 01--->push-pull
P3M0 DATA 0xB2 ; =10--->pure input, 11--->open drain
P4M1 DATA 0xB3 ; P4M1.n,P4M0.n =00--->Standard, 01--->push-pull
P4M0 DATA 0xB4 ; =10--->pure input, 11--->open drain
P5M1 DATA 0xC9 ; P5M1.n,P5M0.n =00--->Standard, 01--->push-pull
P5M0 DATA 0xCA ; =10--->pure input, 11--->open drain
P6M1 DATA 0xCB ; P6M1.n,P6M0.n =00--->Standard, 01--->push-pull
P6M0 DATA 0xCC ; =10--->pure input, 11--->open drain
P7M1 DATA 0xE1
P7M0 DATA 0xE2
AUXR DATA 0x8E
P6 DATA 0xE8
P7 DATA 0xF8
ORG 0x00
LJMP MAIN
MAIN:
LCALL GPIO
MOV R1, #0 ;R1存放个位
MOV R2, #0 ;R2存放十位
MOV R7, #0 ;标志变量,为0时暂停,1时启动
MOV 50H,#0 ;50H存储个位数,初始值0
MOV 51H,#0 ;51H存储十位数,初始值0
MOV R0, #50H ;R0存入地址50H
LOOP:
LCALL NIXIE ;数码管显示
LCALL JUDGE18 ;按键检测函数
LCALL JUDGE17 ;按键检测函数
SJMP LOOP
JUDGE18:
JB P3.3, CONTINUE1 ;P32==1就停止
LOOP1:
LCALL NIXIE
JNB P3.3, LOOP1 ;while循环,松手执行后面的代码
MOV A, R7 ;将A(R7)作为开始暂停的标志变量,每按一次P32,A加1
INC A
CJNE A, #2, FLAG;A等于2就变为0暂停,等于1就启动
CLR A ;A等于2就A清0
FLAG:
MOV R7, A ;A将按键按完之后的标志变量值赋给R7
CONTINUE1:
RET
JUDGE17:
JB P3.2, CONTINUE2 ;P32==1且标志变量R7为0就不执行后面代码
CJNE R7, #1, CONTINUE2
LOOP2:
LCALL NIXIE
JNB P3.2, LOOP2 ;while循环,松手执行后面的代码
INC R1
CJNE R1, #10, CONTINUE2 ;个位为9十位进位,个位归0
MOV R1, #0
INC R2
CJNE R2, #10, CONTINUE2;十位为10十位归零
MOV R2, #0
CONTINUE2:
MOV 50H, R1
MOV 51H, R2
RET
NIXIE:
MOV R0, #50H ;个位的值移到R0
MOV P7, #0FEH ;第一个数码管点亮
MOV A, @R0 ;把个位值存到A
MOV DPTR, #NUM
MOVC A, @A+DPTR ;读取数字
MOV P6, A ;显示
LCALL DELAY1MS
MOV P6, #0FFH ;消影
MOV P7, #0FDH ;点亮第二个数码管
INC R0 ;十位的值移到R0
MOV A, @R0
MOV DPTR, #NUM
MOVC A, @A+DPTR
MOV P6, A
LCALL DELAY1MS
MOV P6, #0FFH
RET
NUM:
DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0BFH
DELAY1MS: ;延时1ms@24.000MHz
NOP
PUSH 30H
PUSH 31H
MOV 30H,#19
MOV 31H,#168
NEXT:
DJNZ 31H,NEXT
DJNZ 30H,NEXT
POP 31H
POP 30H
RET
$INCLUDE(gpio.inc)
END
总结
大晚上4点多刚写完作业,上传一下,欢迎各位交流。
非常感谢各位观看!!!
系列文章——STC8H8K系列汇编51实战
基于ESP8266与STC单片机的天气时钟(包括DS18B20、TFT、串口、外部中断、ESP8266、STC、API等)
STC8H8K系列汇编和C51实战——实现键控不同方式数码管动态显示(C51版与汇编版)
STC8H8K系列汇编和C51实战——开关控制定时器秒表(C51版)
STC8H8K系列汇编和C51实战——开关控制定时器秒表(汇编版)
STC8H8K系列汇编和C51实战——双中断控制定时器流水灯
STC8H8K系列汇编和C51实战——秒倒计时器(可自行设定初值)(51版)
STC8H8K系列汇编和C51实战——按键允许按键计数(51版)
STC8H8K系列汇编和C51实战——按键允许按键计数(汇编版)
STC8H8K系列汇编和C51实战——按键允许按键计数(定时器去抖动51版)
STC8H8K系列汇编和C51实战——按键允许按键计数(利用下降沿中断控制)
STC8H8K系列汇编和C51实战——计算机串口控制单片机LED