光学  

   你现在的位置:JUNTRY>>主 页>>              今天是:

   

按键识别方法之一

 

1.  实验任务

每按下一次开关 SP1 ,计数值加 1 ,通过 AT89S51 单片机的 P1 端口的 P1.0 到 P1.3 显示出其的二进制计数值。

2. 电路原理图

图 4.8.1

3.  系统板上硬件连线

•  把“单片机系统”区域中的 P3.7/RD 端口连接到“独立式键盘”区域中的 SP1 端口上;

•  把“单片机系统”区域中的 P1.0 - P1.4 端口用 8 芯排线连接到“八路发光二极管指示模块”区域中的“ L1 - L8 ”端口上;要求, P1.0 连接到 L1 , P1.1 连接到 L2 , P1.2 连接到 L3 , P1.3 连接到 L4 上。

4.  程序设计方法

•  其实,作为一个按键从没有按下到按下以及释放是一个完整的过程,也就是说,当我们按下一个按键时,总希望某个命令只执行一次,而在按键按下的 过程中,不要有干扰进来,因为,在按下的过程中,一旦有干扰过来,可能造成误触发过程,这并不是我们所想要的。因此在按键按下的时候,要把我们手上的干扰信号以及按键的机械接触等干扰信号给滤除掉,一般情况下,我们可以采用电容来滤除掉这些干扰信号,但实际上,会增加硬件成本及硬件电路的体积,这是我们不希望,总得有个办法解决这个问题,因此我们可以采用软件滤波的方法去除这些干扰信号,一般情况下,一个按键按下的时候,总是在按下的时刻存在着一定的干扰信号,按下之后就基本上进入了稳定的状态。具体的一个按键从按下到释放的全过程的信号图如图所示:

 
   图 4.8.2

从图中可以看出,我们在程序设计时,从按键被识别按下之后,延时 5ms 以上,从而避开了干扰信号区域,我们再来检测一次,看按键是否真得已经按下,若真得已经按下,这时肯定输出为低电平,若这时检测到的是高电平,证明刚才是由于干扰信号引起的误触发, CPU 就认为是误触发信号而舍弃这次的按键识别过程。从而提高了系统的可靠性。

由于要求每按下一次,命令被执行一次,直到下一次再按下的时候,再执行一次命令,因此从按键被识别出来之后,我们就可以执行这次的命令,所以要有一个等待按键释放的过程,显然释放的过程,就是使其恢复成高电平状态。

   
图 4.8.3


• 对于按键识别的指令,我们依然选择如下指令 JB BIT , REL 指令是用来检测 BIT 是否为高电平,若 BIT = 1 ,则程序转向 REL 处执行程序,否则就继续向下执行程序。或者是  JNB BIT , REL 指令是用来检测 BIT 是否为低电平,若 BIT = 0 ,则程序转向 REL 处执行程序,否则就继续向下执行程序。

•  但对程序设计过程中按键识别过程的框图如图所示:                

5. 程序框图

图 4.8.4

6.  汇编源程序

ORG 0

START: MOV R1,#00H ; 初始化 R7 为 0 ,表示从 0 开始计数

MOV A,R1 ;

CPL A ; 取反指令

MOV P1,A ; 送出 P1 端口由发光二极管显示

REL: JNB P3.7,REL ; 判断 SP1 是否按下

LCALL DELAY10MS ; 若按下,则延时 10ms 左右

JNB P3.7,REL ; 再判断 SP1 是否真得按下

INC R7 ; 若真得按下,则进行按键处理,使

MOV A,R7 ; 计数内容加 1 ,并送出 P1 端口由

CPL A ; 发光二极管显示

MOV P1,A ;

JNB P3.7,$ ; 等待 SP1 释放

SJMP REL ; 继续对 K1 按键扫描

DELAY10MS: MOV R6,#20 ; 延时 10ms 子程序

L1: MOV R7,#248

DJNZ R7,$

DJNZ R6,L1

RET

END

7. C语言源程序

#include <AT89X51.H>

unsigned char count;

void delay10ms(void)

{

unsigned char i,j;

for(i=20;i>0;i--)

for(j=248;j>0;j--);

}

void main(void)

{

while(1)

{

if(P3_7==0)

{

delay10ms();

if(P3_7==0)

{

count++;

if(count==16)

{

count=0;

}

P1=~count;

while(P3_7==0);

}

}

}

}

 

  · AT89S51单片机试验以及教程 01 闪烁灯

 · AT89S51单片机试验以及教程 02 模拟开关灯

 · AT89S51单片机试验以及教程 03 多路开关状态指示

  · AT89S51单片机试验以及教程 04 广告灯的左移右移

 · AT89S51单片机试验以及教程 05 广告灯(利用取表方式)

  · AT89S51单片机试验以及教程 06 报警产生器

 · AT89S51单片机试验以及教程 07 I/O并行口直接驱动LED显示

 · AT89S51单片机试验以及教程 08 按键识别方法之一

 · AT89S51单片机试验以及教程 09 一键多功能按键识别技术

 · AT89S51单片机试验以及教程 10 00-99计数器

 · AT89S51单片机试验以及教程 11 00-59秒计时器(利用软件延时)

 · AT89S51单片机试验以及教程 12 可预置可逆4位计数器

 · AT89S51单片机试验以及教程 13 动态数码显示技术

  · AT89S51单片机试验以及教程 14 4×4矩阵式键盘识别技术

  · AT89S51单片机试验以及教程 15 定时计数器T0作定时应用技术(一)

  · AT89S51单片机试验以及教程 16 定时计数器T0作定时应用技术(二)

 · AT89S51单片机试验以及教程 17 99秒马表设计

  · AT89S51单片机试验以及教程 18 “嘀、嘀、……”报警声

 · AT89S51单片机试验以及教程 19 “叮咚”门铃

 · AT89S51单片机试验以及教程 20 数字钟

 · AT89S51单片机试验以及教程 21 拉幕式数码显示技术

 · AT89S51单片机试验以及教程 22 电子琴

 · AT89S51单片机试验以及教程 23 模拟计算器数字输入及显示

  · AT89S51单片机试验以及教程 24 8X8 LED点阵显示技术

 · AT89S51单片机试验以及教程 25 点阵式LED“0-9”数字显示技术

 · AT89S51单片机试验以及教程 26 点阵式LED简单图形显示技术

 · AT89S51单片机试验以及教程 27 ADC0809A/D 转换器基本应用技术

 · AT89S51单片机试验以及教程 28 数字电压表

 · AT89S51单片机试验以及教程 29 两点间温度控制

 · AT89S51单片机试验以及教程 30 四位数数字温度计

 · AT89S51单片机试验以及教程 31 6位数显频率计数器

 · AT89S51单片机试验以及教程 32 电子密码锁设计

 · AT89S51单片机试验以及教程 33 4×4键盘及8位数码管显示构成的电子密码锁

 · AT89S51单片机试验以及教程 34 有存储器功能的数字温度计-DS1624技术应用

 · AT89S51单片机试验以及教程 35 DS18B20数字温度计使用

 

 

以上部分内容转载于网上,如有涉及到版权问题,请即通知本人删除

copyright© 2004-2005 all rights reserved www.JUNTRY(.IK8).com

juntry@126.com