专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

按键实现加减运算及连续按键检测

作者:佚名   来源:本站原创   点击数:  更新时间:2009年10月29日   【字体:

*
注意:如果无法在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里编译,请删除每一行的所有前导空白,
 

关闭窗口

相关文章