4.4.第十个实验--按键的完整检测

来源:互联网 发布:分析家软件 编辑:程序博客网 时间:2024/06/06 00:10

实验目的:完成一次完整的按键检测,解决上篇文章中的问题

预备知识:
(1)按键事件就是按键操作过程中的不同状态切换一次
(2)一个完整的案件事件包括,按下事件(电平由高变低)、弹起事件(电平由低变高)。
(3)一般认为发生了一次完整的按键才算是用户操作了一次按键,

实验过程分析:
第零步:设置初始值flag==0
第一步:当按键io引脚电平有变化,确认被按下
第二步:消抖之后再次检测该按键的电平,确认按键被按下
第三步:这里检测flag==0,让数码管显示增加1
第四步:当数码管显示过一次之后设置flag==1
第五步:检测到按键电平变高(被弹起),整个案件事件完成,重置flag==0

实验代码:

#include<reg51.h>sbit key1 = P1^0;unsigned char dnum = 0;      //标记数码管显示的标记数int dm[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc7,0xa1,0x86,0x8e};    //独立数码管的段码表unsigned char flag = 0;     //设置flag表示按键弹起还是按下的状态void add_display(void);void delay10ms(void);void delay(void);void main(void){    while(1)    {        if(key1==0)     //第一次低电平        {                   delay10ms();            if(key1 == 0)    //消抖之后还是低电平            {                   if(flag == 0)                  //flag初始值是0,也就是当上面两次确保了按键被按下之后显示增加1                {                    add_display(); //数码管增加1                    flag = 1;      //当按键被按下,并且显示加1之后,设置flag ==1,确保下次只有确保按键被弹起之后,再次被按下且设置为0之后才能再次进入这里                }            }           }        else        {            if(key1==1)       //按键被弹起(整个按键事件完成),该按键IO引脚变为高电平            {                if(flag== 1)  //按键被弹起,且flag是上次按键被按下,数码管显过后设置的flag==1                {                    flag = 0;  //完整的按键事件完成,重置flag==0,默认为初始值                }            }        }        delay();    }}/**************独立数码管显示***********************/void add_play(void){    dnum += 1;    P0 = dm[dnum];}/*************延时函数(时间未知)*******************************/void delay(void){    unsigned char i = 0,j = 0;    for(i=0;i<200;i++)        for(j=0;j<200;j++);}/***********延时10ms********************************/void delay10ms(void){    unsigned char a,b,c;    for(c=5;c>0;c--)        for(b=4;b>0;b--)            for(a=248;a>0;a--);}
0 0