按键实现加减运算及连续按键检测
*
注意:如果无法在keil里编译,请删除每一行的所有前导空白
程序效果:若按键0(即7EH)按下,则加1;若按键1(即7DH)按下,
则减1;若按键2(即7BH)按下,则快加,若按键3(77H)按下,则快减。
*/
ORG 0000H
LJMP START
ORG 0030H
START: MOV 30H,#00 //赋初值
MOV 31H,#00
MOV 32H,#01
LOOP1: MOV R2,#04 //循环四次
MOV R1,#0FEH //分别为:0FEH ?FDH ?FBH ?F7H
LOOP: MOV A,R1 //赋值,用于暂存A的值
MOV P0,A //赋初值
RL A //循环左移
XCH A,R1 //暂存A的值
MOV A,P0 //读?P0口的值
LCALL DELAY1 //延时
CJNE A,#7EH,LOP1 //判断是否有按键按下
LCALL ADD1 //有,则加1
LOP12: MOV A,P0 //以下语句是用于判断按键是否松开
LCALL DELAY1
CJNE A,#7EH,LOP1
LCALL DISPLAY
SJMP LOP12
LOP1: CJNE A,#7DH,LOP2
LCALL SUB1
LOP22: MOV A,P0
LCALL DELAY1
CJNE A,#7DH,LOP2
LCALL DISPLAY
SJMP LOP22
LOP2: CJNE A,#7BH,LOP3 //判断快加的按键按下
MOV R3,#10 //按下了,下面的语句用于减慢数值变化速度
LOP32: LCALL DISPLAY
LCALL DELAY
DJNZ R3,LOP32
LCALL ADD1
LOP3: CJNE A,#77H,LOP4
MOV R4,#10
LOP42: LCALL DISPLAY
LCALL DELAY
DJNZ R4,LOP42
LCALL SUB1
LOP4: DJNZ R2,LOOP
LCALL DISPLAY
LJMP LOOP1
//显示子程序
DISPLAY: MOV DPTR,#TAB //赋表首地址
MOV A,#0FFH
MOV P1,A //点亮最右边的数码管
XCH A,R0 //暂存A的值
MOV A,30H //显示个位数
MOVC A,@A+DPTR
MOV P2,A
LCALL DELAY1 //延时
DEC R0 //减1,用于点亮下一个数码管,准备下次显示
XCH A,R0
MOV P1,A
XCH A,R0
MOV A,31H
MOVC A,@A+DPTR
MOV P2,A
LCALL DELAY1
DEC R0
XCH A,R0
MOV P1,A
XCH A,R0
MOV A,32H
MOVC A,@A+DPTR
MOV P2,A
LCALL DELAY1
RET
//加子程序
ADD1: INC 30H //个位加1
MOV A,30H //把30H的值赋给A
CJNE A,#0AH,LAP //判断个位是否加为10
MOV 30H,#00 //是,则清零
INC 31H
MOV A,31H
CJNE A,#0AH,LAP
MOV 31H,#00
INC 32H
MOV A,32H
CJNE A,#0AH,LAP
MOV 32H,#00
LAP: NOP //空指令
RET //返回
//减子程序
SUB1: DEC 30H //个位减1
MOV A,30H //把30H的值赋给A
CJNE A,#0FFH,LSP //判断30H的值为0后是否在减1
MOV 30H,#09 //是,则给30H赋9
DEC 31H
MOV A,31H
CJNE A,#0FFH,LSP
MOV 31H,#09
DEC 32H
MOV A,32H
CJNE A,#0FFH,LSP
MOV 32H,#09
LSP: NOP
RET
//延时子程序,时间大约为2us*20*200=8ms
DELAY: MOV R6,#20
DEL2: MOV R5,#200
DEL3: DJNZ R5,DEL3
DJNZ R6,DEL2
RET
//延时子程序,时间约为:2us*5*250=2.5ms
DELAY1: MOV R6,#5
DEL4: MOV R5,#250
DEL5: DJNZ R5,DEL5
DJNZ R6,DEL4
RET
TAB: DB 3FH,06H,5BH,4FH,66H ;数码管显示的数值
DB 6DH,7DH,07H,7FH,6FH
END
注意:如果无法在keil里编译,请删除每一行的所有前导空白,
评论