网站导航: 首页 > 设计参考 > 正文 文章搜索
一个按键的多次击键组合判别技巧汇编源代码
 
文章编号:
100719152012
文章分类: 单片机 51系列
点 击:
...
关 键 词: 按键,组合
文章来源:
作者:焕然
摘 要:

 
  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;  
  2. ;由于在学习用DS1302来做LED时钟时,发现开发板附的程序对按键操作 ;  
  3. ;很不灵活,后来在网上找到一篇《一个按键的多次击键组合判别技巧》;  
  4. ;网址为HTTP://BLOG.21IC.COM/USER1/349/ARCHIVES/2005/669.HTM感觉;  
  5. ;作者的点子不错,但本人不懂义隆单片机的汇编,在网上找不到相关  ;  
  6. ;C51汇编的参考程序,经学习摸索已改成C51汇编了,并已用XL400 单片;  
  7. ;机编程实验开发板,测试OK。现供大家参考。           ;  
  8. ;                         作者:焕然                           ;  
  9. ;                        QQ:171586392                          ;  
  10. ;                         2009.12.19                           ;          
  11. ;                    转载请说明来源,谢谢!                    ;  
  12. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;  
  13.  KEY EQU P1.0  
  14.  KEY_NUM EQU 20H  
  15.  LED1_6 EQU P2  
  16. ;---------------------------------------------------------------  
  17. ;以下主程序演示了不同组合按键时,分别控制P2.0-P2.5各端口的LED灯的亮灭。  
  18. ;单次短击=>P2.0/LED1  
  19. ;单次长击=>P2.1/LED2  
  20. ;短击+短击=>P2.2/LED3  
  21. ;短击+长击=>P2.3/LED4  
  22. ;长击+短击=>P2.4/LED5  
  23. ;长击+长击=>P2.5/LED6    
  24. ;------------------------------------------------------------   
  25.     ORG 0040H  
  26.     AJMP MAIN   
  27. MAIN:   
  28.     MOV P1,#0FFH  
  29.     MOV P2,#0FFH   ;初始化端口  
  30. LOOP:   
  31.     CALL SREAD_KEY   ;读单按键--子程序  
  32.     MOV R0,KEY_NUM     
  33.     CJNE R0,#00000010B,MAIN1 ;比较键值不等跳  
  34.     CPL LED1_6.0   ;取反P2.0  
  35. MAIN1:   
  36.     CJNE R0,#00000011B,MAIN2 ;比较键值不等跳  
  37.     CPL LED1_6.1   ;取反P2.1  
  38. MAIN2:   
  39.     CJNE R0,#00000100B,MAIN3 ;比较键值不等跳  
  40.     CPL LED1_6.2   ;取反P2.2  
  41. MAIN3:   
  42.     CJNE R0,#00000101B,MAIN4 ;比较键值不等跳  
  43.     CPL LED1_6.3   ;取反P2.3  
  44. MAIN4:   
  45.     CJNE R0,#00000110B,MAIN5 ;比较键值不等跳  
  46.     CPL LED1_6.4   ;取反P2.4  
  47. MAIN5:   
  48.     CJNE R0,#00000111B,MAIN_EXIT ;比较键值不等跳  
  49.     CPL LED1_6.5   ;取反P2.5  
  50. MAIN_EXIT:   
  51.     JMP LOOP   
  52. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;  
  53. ;读单按键--子程序  
  54. ;子程序执行后返回值KEY_NUM即键值  
  55. ;-----------------------------说明----------------------------  
  56. ;短击:键按下时间<500MS  
  57. ;长击:键按下时间>500MS  
  58. ;两次按键间隔时间<700MS  
  59. ;键值定义:  
  60. ;KEY_NUM="00000000":  无键按下  
  61. ;KEY_NUM="00000001":  无意义  
  62. ;KEY_NUM="00000010":  单次短击  
  63. ;KEY_NUM="00000011":  单次长击  
  64. ;KEY_NUM="00000100":  短击+短击  
  65. ;KEY_NUM="00000101":  短击+长击  
  66. ;KEY_NUM="00000110":  长击+短击  
  67. ;KEY_NUM="00000111":  长击+长击  
  68. ;KEY_NUM="00001000":  短击+短击+短击  
  69. ;KEY_NUM="00001001":  短击+短击+长击  
  70. ;KEY_NUM="00001011":  短击+长击+长击  
  71. ;KEY_NUM="00001111":  长击+长击+长击  
  72. ;以编码从左看起第一个1看作为分界线,左边为0、而右边的0和1表示为:  
  73. ;0短击1长击。  
  74. ;以上组合已足够用了!  
  75. ;*************************************************************  
  76. ; KEY EQU P1.0  
  77. ; KEY_NUM EQU 20H  
  78. ;*************************************************************  
  79. SREAD_KEY:   
  80.     MOV KEY_NUM,#00H ;键值清0  
  81.     JB KEY,SKEY_EXIT ;键未按下跳  
  82.     CALL DL10MS  ;延时去抖动  
  83.     JB KEY,SKEY_EXIT ;键未按下跳  
  84.     MOV KEY_NUM,#1  ;置键值为#00000001B  
  85. SKEY_A:   
  86.         MOV R0,#00H  ;清计数器  
  87.         CLR C   ;清CY  
  88. SKEY_B:   
  89.         CALL DL10MS   
  90.         INC R0  
  91.         MOV A,#50  
  92.         SUBB A,R0  
  93.         JC SKEY_C  ;当键按下>500MS跳  
  94.         JNB KEY,SKEY_B  ;键未释放跳  
  95.         CALL DL10MS  ;延时去抖动  
  96.         JNB KEY,SKEY_B  ;键未释放跳  
  97.         CLR C   ;CY置0  
  98.         JMP SKEY_D   
  99. SKEY_C:   
  100.         JNB KEY,$  ;键未释放停  
  101.         CALL DL10MS  ;延时去抖动  
  102.         JNB KEY,$  ;键未释放停  
  103.         SETB C   ;CY置1  
  104. SKEY_D:       
  105.         MOV A,KEY_NUM   
  106.         RLC A   ;键值左移一位,C->键值低位  
  107.         MOV KEY_NUM,A  
  108.         JB KEY_NUM.2,SKEY_EXIT ;判断按键检测是否完成,完成跳  
  109.         ;说明:KEY_NUM.1时只判断单次按键两种组合,KEY_NUM.2时可判断两次按键4种组合+单次按键的2种组合=6种,以此类推。  
  110.         MOV R0,#00H  ;清计数器  
  111.         CLR C   ;CY置0  
  112. SKEY_E:   
  113.         CALL DL10MS   
  114.         INC R0  
  115.         MOV A,#70  
  116.         SUBB A,R0  
  117.         JC SKEY_EXIT  ;当未按下>700MS跳出  
  118.         JB KEY,SKEY_E  ;键释放跳  
  119.         CALL DL10MS  ;延时去抖动  
  120.         JB KEY,SKEY_E  ;键释放跳  
  121.         JMP SKEY_A  ;当未按下<700MS再次检测  
  122. SKEY_EXIT:   
  123.         RET    
  124. ;************************************************************     
  125. ;延时10mS      
  126. ;************************************************************      
  127. DL10ms:   
  128.         MOV R5,#14H  ;20              ;10.262ms=20*511+2*20+1=20.261     
  129. TIME10MS_1:   
  130.         MOV R6,#0FFH  ;255    ;511us=255*2+1     
  131.         DJNZ R6,$       
  132.         DJNZ R5,TIME10MS_1       
  133.         RET       
  134. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;  
  135.         END    
  136.   

 

 
相关文章:

 
最新开源项目
 
 
  查看更多...  
 
本站相关产品   淘宝网店
 




 
  查看更多...  

 

本站程序由百合电子工作室开发和维护
Copyright @ baihe electric studio
渝ICP备09006681号-4