独立式键盘的编程方法 按键的去抖动原理和基本方法

独立式键盘的编程方法

按键的去抖动原理和基本方法

A
P3.2  开始 按此键则灯开始流动(由左向右)
B
P3.3  停止 按此键则停止流动 所有灯为灭
C
P3.4  向左 按此键则灯反向流动 由右向左 
D P3.5  向右 按此键则灯正向流动 由左向右 
实验程序如下
 
UpDown  EQU  00H  ;            上下行标志
StartEnd  EQU  01H;            起动及停止标志
LampCode  EQU  21H;            存放流动的数据代码
ORG  0000H        ;
AJMP  MAIN        ;
ORG  30H          ;
MAIN:MOV  SP,#5FH ;
  MOV  P1,#0FFH     ;
  CLR  UpDown       ;启动时处于向上的状态
  CLR  StartEnd     ;启动时处于停止状态
  MOV  LampCode,#0FEH;单灯流动的代码
  LOOP:ACALL  KEY    ;调用键盘程序
  JNB  F0,LNEXT      ;如果无键按下
则继续
  ACALL  KEYPROC     ;否则调用键盘处理程序
  LNEXT:ACALL  LAMP  ;调用灯显示程序
  AJMP  LOOP         ;反复循环
主程序到此结束
DELAY:MOV  R7,#100   ;
  D1:MOV  R6,#100    ;
  DJNZ  R6,$         ;
  DJNZ  R7,D1        ;
  RET                ;延时程序
键盘处理中调用
KEYPROC:MOV  A,B     ;从 B 寄存器中获取键值
  JB  ACC.2,KeyStart ;分析键的代码
某位被按下 则该位为”1” 在键盘程序中已取反 
   JB  ACC.3,KeyOver  ;
  JB  ACC.4,KeyUp    ;
  JB  ACC.5,KeyDown  ;
  AJMP  KEY_RET      ;
KeyStart:SETB  StartEnd ;第一个键按下后的处理
  AJMP  KEY_RET       ;

  KeyOver:CLR  StartEnd;第二个键按下后的处理
  AJMP  KEY_RET       ;
  KeyUp:SETB  UpDown  ;第三个键按下后的处理
  AJMP  KEY_RET       ;
  KeyDown:CLR  UpDown ;第四个键按下后的处理
  KEY_RET:RET         ;
  KEY:CLR  F0         ;清 F0
表示无键按下
  ORL  P3,#01111000B  ;将 P3 口接有四个键的位置

  MOV  A,P3           ;取 P3 口的值
  ORL  A,#10000111B   ;将其余四位也置

  CPL  A              ;取反
  JZ  K_RET           ;如果为
0 则无键按下
  ACALL  DELAY        ;否则延时去键抖
  ORL  P3,#01111000B  ;
  MOV  A,P3           ;
  ORL  A,#10000111B   ;
  CPL  A              ;
  JZ  K_RET           ;
  MOV  B,A            ;确实有键按下
将键值存入 B 中
  SETB  F0            ;设置有键按下的标志
  K_RET:ORL  P3,#01111000B ;此处循环等待键的释放
  MOV  A,P3           ;
  ORL  A,#10000111B   ;
  CPL  A              ;
  JZ  K_RET1          ;直到读取的数据取反后为”0”说明键释放了
才从键盘处理程序返回
   AJMP  K_RET         ;
  K_RET1:RET          ;
 
D500mS:               ;流水灯的延迟时间
  PUSH  PSW           ;
  SETB  RS0           ;
  MOV  R7,#200        ;
  D51:MOV  R6,#250    ;
  D52:NOP
  NOP
  NOP
  NOP
  DJNZ  R6,D52    ;
  DJNZ  R7,D51    ;
  POP  PSW        ;
  RET             ;
 
LAMP:JB  StartEnd,LampStart ;如果 StartEnd=1
则启动
  MOV  P1,#0FFH   ;
  AJMP  LAMPRET   ;否则关闭所有显示
返回
  LampStart:JB  UpDown,LAMPUP ;如果 UpDown=1
则向上流动
  MOV  A,LAMPCODE  ;

 RL  A            ;实际就是左移位
  MOV  LAMPCODE,A  ;
  MOV  P1,A        ;
  LCALL  D500mS    ;
  AJMP  LAMPRET    ;
  LAMPUP:MOV  A,LAMPCODE ;
  RR  A            ;向下流动实际就是右移
  MOV  LAMPCODE,A  ;
  MOV  P1,A        ;
  LCALL  D500mS    ;
  LAMPRET:RET      ;
  END
 

posted @ 2012-05-23 15:18  梦中人...  阅读(3322)  评论(0编辑  收藏  举报