找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8731|回复: 2
收起左侧

单片机按键消抖动和防干扰的例子-汇编程序

[复制链接]
ID:70976 发表于 2014-12-27 17:26 | 显示全部楼层 |阅读模式
  1. ;===============================================================
  2. ;程序编写人:兰建文
  3. ;编写地点:51hei培训机构
  4. ;时间:2009年6月9日上午  星期二
  5. ;功能:本程序实现P0口的对2个数码管显示0到99,一个按键实现一次
  6. ;按键只递加1次,到99回到0,按着不动不影响数码管动态显示;任何时
  7. ;刻,任何一个按键,若按键时间超过3秒,循环显示0到9回到0,时间
  8. ;间隔1秒。若时间小于1秒,显示加1,低电平亮
  9. ;P2口实现对数码管的片选功能
  10. ;===============================================================
  11. ;=========================开始初始化============================
  12.            SHUCHU   EQU   P0           ;定义P0口为输出口
  13.      PIANXUAN EQU   P2           ;定义P2口为片选口
  14.         SHUZI    EQU   30H          ;设置处理数据存放地址
  15.      ANJIAN1  BIT   20H.0     ;设置按键标志位
  16.      ANJIAN2  BIT   20H.1     ;设置按键标志位        
  17.      BIT0     BIT   20H.2     ;设置中断定时器0标志位
  18.      CHANGAN BIT   20H.3     ;设置长按标志位
  19.      LIANAN   BIT   20H.4     ;设置连按标志位
  20.      XIAN1 BIT   20H.5
  21.      XIAN2    BIT   20H.6
  22.      BIT4     BIT   20H.7
  23.      MODE     EQU   01H
  24. ;========================程序开始==============================
  25.                     ORG   00H          ;程序开始
  26.                     LJMP  START        ;跳到START
  27.      ORG   0BH     ;中断定时器0入口地址
  28.      JMP   T0_1     ;跳到定时器0服务程序
  29.                     ORG   0030H        ;入口地址
  30. ;=========================主程序===============================        
  31.               START:MOV   SP,#70H  ;移开指针        
  32.         MOV   SHUZI,#00  ;数据初始化
  33.         MOV   DPTR,#TAB     ;查表初始化
  34.      CALL  INIT   ;开中断
  35.      CLR   ANJIAN1  ;按键标志位清0
  36.      CLR   ANJIAN2  ;按键标志位清0
  37.      CLR   CHANGAN  ;长按标志位清0
  38.      CLR   LIANAN
  39.      CLR   XIAN1
  40.      CLR   XIAN2
  41.      CLR   BIT4
  42.      SETB  BIT0   ;中断标志位置1
  43.      MOV   R0,#0
  44.      MOV   R1,#0
  45.      MOV   R2,#0
  46.      MOV   R3,#0
  47.         
  48.       MAIN:JNB   BIT0,MAIN    ;等待中断
  49.            CLR   BIT0     ;中断标志位清0
  50.    
  51.      JB    BIT4,VV
  52.      INC   R3
  53.      CJNE  R3,#50,XX
  54.      MOV   R3,#00
  55.      MOV   R2,#0
  56.         JMP   DD
  57.      XX:CJNE  R2,#3,VV
  58.      SETB  LIANAN
  59.      MOV   R2,#00
  60.    
  61.      DD:CLR   BIT4   
  62.      VV:JB   LIANAN,ZIJIAN
  63.         JB  CHANGAN,ZIJIA   ;长按标志位=1,循环显示0-9;若不为0显示键值加一  
  64.    
  65.         CALL  JISUAN
  66.                     CALL  DISPLAY
  67.      JB    ANJIAN2,JJ                     
  68.    
  69.         JNB   ANJIAN1,PANDUAN1
  70.            JNB   P1.2,XIANSHI1   
  71.      MOV   R0,#00
  72.         CLR   ANJIAN1
  73.      CLR   XIAN1
  74.      CLR   ANJIAN2
  75.      CLR   XIAN2
  76.      JMP   MAIN
  77.      JJ:JNB   ANJIAN2,PANDUAN2
  78.      JNB   P1.3,XIANSHI2   
  79.     ; SETB  BIT4
  80.      INC   R2
  81.     ;  MOV   R3,#0
  82.      CLR   ANJIAN1
  83.      CLR   XIAN1
  84.      CLR   ANJIAN2
  85.      CLR   XIAN2
  86.      JMP   MAIN
  87.      PANDUAN1:JB    P1.3,YY
  88.               SETB  BIT4
  89.     ; INC   R2
  90.      MOV   R3,#0
  91.               SETB  ANJIAN2
  92.      ;JMP   MAIN
  93.         YY:JB    P1.2,MAIN     ;若按键抬起则返回MAIN,若没有抬起按键标志位清0
  94.            SETB  ANJIAN1
  95.            JMP   MAIN
  96.      PANDUAN2:JB    P1.2,ZZ
  97.               SETB  ANJIAN1
  98.      JMP   MAIN
  99.         ZZ:JB    P1.3,MAIN     ;若按键抬起则返回MAIN,若没有抬起按键标志位清0
  100.            SETB  ANJIAN2
  101.            JMP   MAIN
  102.      XIANSHI1:  
  103.         INC   R0
  104.         CJNE  R0,#150,L6    ;若R0=150,长按到达1秒,循环显示0-9;不相等,则显示键值加1
  105.      MOV   R0,#00
  106.      SETB  CHANGAN
  107.            L6:JB    XIAN1,MAIN
  108.               SETB  XIAN1   ;显示标志位清0
  109.      CALL  JIACHULI  ;加处理
  110.      JMP   MAIN
  111.      XIANSHI2:  
  112.      JB    XIAN2,OUT
  113.               SETB  XIAN2   ;显示标志位清0
  114.      CALL  JIANCHULI  ;加处理
  115.     OUT:JMP   MAIN
  116.         
  117.      ZIJIA:MOV   A,SHUZI
  118.            CALL  JIACHULI
  119.            CALL  JISUAN
  120.      CALL  DISPLAY
  121.      JMP   MAIN
  122.        ZIJIAN:MOV   A,SHUZI
  123.      CALL  JIANCHULI
  124.      CALL  JISUAN
  125.      CALL  DISPLAY
  126.      JMP   MAIN
  127. ;====================定时中断0服务子程序========================
  128. ;输入:无
  129. ;输出:无
  130. ;实现的功能:实现定时20MS,影响标志位T_BIT.
  131. ;===============================================================
  132.       T0_1:MOV    TL0,#0E0H     ;设置定时初值
  133.      MOV    TH0,#0B1H
  134.      SETB   BIT0       ;定时标志位清0
  135.      RETI
  136. ;========================中断设置子程序=========================
  137. ;输入:无
  138. ;输出:无
  139. ;实现的功能:初始化设置定时器,设置初值
  140. ;===============================================================
  141.                INIT:MOV    TMOD,#MODE  ;定时器0工作方式1
  142.             MOV    TL0,#0E0H
  143.      MOV    TH0,#0B1H
  144.      MOV    IE,#82H   ;开定时器中断0
  145.      SETB   TR0    ;开定时器0
  146.      RET
  147. ;========================计算子程序=============================
  148. ;输入:30H
  149. ;输出:"A和B"
  150. ;实现的功能:把30H的数据的十位和个位分离出来
  151. ;===============================================================
  152.              JISUAN:MOV   A,SHUZI
  153.            MOV   B,#10        ;除数放在B中
  154.         DIV   AB           ;商放在A中,余数放在B中
  155.         RET               
  156. ;========================显示子程序=============================
  157. ;输入:"A"
  158. ;输出:"P0口"
  159. ;实现的功能:把A的数输出到P0口显示,十位和个位分开显示
  160. ;===============================================================
  161.          DISPLAY:MOVC  A,@A+DPTR    ;查表
  162.        MOV   SHUCHU,A         ;显示十位
  163.        MOV   PIANXUAN,#04H    ;片选
  164.        CALL  DELAY
  165.        MOV   SHUCHU,#0FFH
  166.               MOV   A,B              
  167.        MOVC  A,@A+DPTR    ;查表
  168.          MOV   SHUCHU,A         ;显示个位
  169.        MOV   PIANXUAN,#05H    ;片选
  170.        CALL  DELAY
  171.        MOV   SHUCHU,#0FFH
  172.                  RET
  173. ;======================加处理子程序=============================
  174. ;输入:无
  175. ;输出:无
  176. ;实现的功能:把30H地址加1
  177. ;===============================================================
  178.          JIACHULI:
  179.              MOV   A,SHUZI
  180.              CJNE  A,#99,L7
  181.        MOV   SHUZI,#00
  182.        CLR   CHANGAN
  183.        JMP   L8
  184.     L7:INC   SHUZI
  185.     L8:RET  
  186. ;======================减处理子程序=============================
  187. ;输入:无
  188. ;输出:无
  189. ;实现的功能:把30H地址加1
  190. ;===============================================================
  191.         JIANCHULI:MOV    A,SHUZI
  192.              CJNE   A,#00,L9
  193.              MOV    SHUZI,#99
  194.        CLR    LIANAN
  195.        JMP    LL
  196.         L9:DEC    SHUZI
  197.        LL:RET
  198. ;========================延时程序===============================
  199. ;输入;无
  200. ;输出: 无
  201. ;实现的功能:延时一段时间
  202. ;===============================================================
  203.           DELAY:
  204.           MOV  R6,#3
  205.       LL1:MOV  R7,#250
  206.           DJNZ R7,$
  207.           DJNZ R6,LL1
  208.     RET
  209. ;=====================共阳查表数据==============================
  210.       TAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
  211. ;=======================程序结束================================
  212.     END
复制代码


回复

使用道具 举报

ID:72846 发表于 2015-1-28 11:47 | 显示全部楼层
放干扰。很不错
回复

使用道具 举报

ID:313328 发表于 2018-10-29 18:35 | 显示全部楼层
很不错,C语言?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表