历史上的今天
今天是:2025年02月05日(星期三)
2021年02月05日 | 51单片机按键电平读取程序
2021-02-05 来源:eefocus
按键电平的读取通常我们都是通过延时函数或者循环延时来降低抖动时间,来读取正确的按键电平。
示例:
#include "reg52.h"
sbit SysKey P0^0
sbit LED P0^1
#define SET 1
#define RESET 0
void Delay1ms(unsigned int ms)
{
unsigned char a,b,c;
while(ms--)
{
for(c=17;c>0;c--)
for(b=134;b>0;b--)
for(a=2;a>0;a--);
}
}
bit ReadKey(void)
{
if(SysKey == RESET)//有按键被按下
{
Delay1ms(10);//延时10ms
if(SysKey == RESET)// 再次判断按键被按下
return 1;
}
return 0;
}
int main(void)
{
SysKey = SET;//输出高电平
LED = 1;//关闭LED
while(1)
{
if(ReadKey == SET)//读取到按键被按下
LED = 0; //点亮LED小灯
Delay1ms(1000)//延时1S
LED = 1; //关闭LED小灯
}
}
以上程序对于简单试验还使用,但对于稍微复杂一点的程序就显得太浪费单片机资源了。单片机在读取到第一个按键下降沿的时候就开始延时10ms,单片机处于循环状态,不能处理其它事件造成资源浪费。
其实我们可以通过一个时间来扫描按键,当单片机读取到按键下降沿的时候,使用一个计数器来进行消抖操作。
示例:www.dgzj.com
#include
sbit SysKey P0^0
sbit LED P0^1
#define SET 1
#define RESET 0
unsigned int TIMTABLE[2] = {0};
void InitTimer0(void)
{
TMOD = 0x01;
TH0 = 0x0FC;
TL0 = 0x018;
EA = 1;
ET0 = 1;
TR0 = 1;
}
bit ReadKey(void)
{
static unsigned char KeyCnt = 0;//定义一个存储读取按键次数的静态变量
switch(KeyCnt)
{
case 0:
{
if(SysKey == RESET)//读取到当前按键被按下
KeyCnt = 1;
}
break;
case 1:
{
if(SysKey == RESET)//读取到当前按键被按下
{
KeyCnt = 2;
return 1;
}
}
break;
case 2:
{
if(SysKey == SET)//读取到当前按键被被释放
KeyCnt = 0;
}
break;
default:KeyCnt = 0;break;
}
return 0;
}
void main(void)
{
InitTimer0();
SysKey = SET;
LED = 1;//关闭LED灯
while(1)
{
if(TIMTABLE[0] >= 10)//10ms扫描时间到了
{
TIMTABLE[0] = 0;//必须清零
if(ReadKey == SET)//读到按键被按下
{
TIMTABLE[1] = 0;
LED = 0;//点亮LED
}
}
else if(TIMTABLE[1] >= 500)//500ms到了
{
TIMTABLE[1] = 0;
LED = 1;//关闭LED小灯
}
//添加其它代码,无软件延时
}
}
void Timer0Interrupt(void) interrupt 1 //1ms定时中断
{
unsigned char i = 0;
TH0 = 0x0FC;
TL0 = 0x018;
for(i=0;i
TIMTABLE++;
}
以上示例程序可以有效解决按键读取抖动,通过主函数每10ms扫描一次按键状态,读取到按键状态后跳出等待10ms判断按键是否被按下。可大大提高单片机资源使用效率。
附原理图:

上一篇:51单片机控制led灯闪烁程序
下一篇:51单片机时钟电路原理图解
史海拾趣
|
需求:MotoQ9h手机刷Windows Mobile 6.5 操作系统(.nb0文件),通过USB把手机模拟成网卡,获得独立IP,然后通过与PC机桥接成功后,利用platform 刷机 问题: PC机是Windows XP SP3在微软的fareast域内,但同时也加入到了Test OU network PC机 ...… 查看全部问答> |
|
相信这方面的理解困惑初学者很久了吧,给点意见!还是想高清中断控制串口通讯。。。接收中断控制串口通讯比如在串口调试软件上面发送一数据,stm32接受后产生中断,进而给该软件回复显示刚所接收到的数据!!这个过程是接收中断控制串口通讯对吧。 ...… 查看全部问答> |
|
一.实验目的 学习使用串口和USB 相互通信的方法 二.实验设备 计算机(window xp 系统) LM3S9B96 实验评估板 USB A 型公口转 Mini B 型5Pin 数据线2 条(即电脑连接MP3 等设备的数据线) 5VDC 电源 三.实验原理 本例程中评估板实际是充 ...… 查看全部问答> |
|
各位大侠 有谁用过Arduino 蓝牙串口? 本人想用 STM32F4 接蓝牙串口CP2012来传送数据。 原本已经可以用USART进行传送, 请问串口程序是否需要更改? [ 本帖最后由 lis 于 2013-2-22 02:54 编辑 ]… 查看全部问答> |
|
LCD AND TOUCH BOOSTERPACK进展(近照) 谢谢坛友们的支持,大家都很关心LCD AND TOUCH BOOSTERPACK的进度。 今天是周末,赶紧拍了照片传上来,这是我焊接出来的第一个BOOSTERPACK的照片,就是在下面这个帖子中的那个: LCD AND TOUCH BOOSTERPACK成功点亮(更新)https://bbs.eeworld.c ...… 查看全部问答> |
|
三星四核Cortex A9 Exynos 4412公开资料下载(无需签署NDA) 三星四核Cortex A9 Exynos 4412公开资料下载(无需签署NDA),这是公开部分,不是完整版,下载之前请慎重,三星网站应该可以下到这个。 [ 本帖最后由 gooogleman 于 2013-10-26 23:35 编辑 ]… 查看全部问答> |




