历史上的今天
今天是:2025年03月19日(星期三)
2021年03月19日 | 51单片机的状态机消抖代码
2021-03-19 来源:eefocus
#include
enum State {Init, Press, Free}; //定义按键状态的枚举类型
enum State Key_State; //按键状态
sbit Key1 = P2^4;
sbit Key2 = P2^5;
sbit Key3 = P2^6;
sbit Key4 = P2^7;
void Delay_ms(unsigned int x)
{
int i,j;
for(i=0; i<110; i++)
for(j=0; j
;
}
//===============================================================================
//函数名称:键盘扫描(状态机无延时消抖)
//说明:键盘接口对应: key1 = P2-4 key2 = P2-5 key3 = P2-6 key4 = P2-7
//参数:
//返回值:
//日期:2011-6-22
//修改:
//===============================================================================
void Keyscan(void)
{
switch (Key_State)
{
case Init : // 按键初始态
if((P2 | 0x0f) != 0xff)
{
Key_State = Press; // 键被按下,但需要确认是否是干扰
}
break;
case Press : // 按键确认态
if((P2 | 0x0f) != 0xff) //如有键按下则不是干扰,判断键值
{
//判断是哪一个按键被按下
if( (P2 | 0xef) != 0xff ) //第一个键被按下
{
P1 = 0xfe;
Delay_ms(500);
P1 = 0xff;
}
if( (P2 | 0xdf) != 0xff ) //第二个键被按下
{
P1 = 0xfd;
Delay_ms(500);
P1 = 0xff;
}
if( (P2 | 0xbf) != 0xff ) //第三个键被按下
{
P1 = 0xfb;
Delay_ms(500);
P1 = 0xff;
}
if( (P2 | 0x7f) != 0xff ) //第四个键被按下
{
P1 = 0xf7;
Delay_ms(500);
P1 = 0xff;
}
Key_State = Free; // 状态转换到键释放态
}
else
{
Key_State = Init; // 按键已抬起,属于干扰,转换到按键初始态
}
break;
case Free :
if((P2 | 0x0f) == 0xff) //判断按键是否释放
{
Key_State = Init; //如果按键释放,转换到按键初始态
}
break;
}
}
这是另外一种,其实都差不多,只不过比较直观而已。
void Keyscan(void)
{
switch (Key_State)
{
case Init : // 按键初始态
if((Key1 == 0) | (Key2 == 0) | (Key3 == 0) | (Key4 == 0))
{
Key_State = Press; // 键被按下,但需要确认是否是干扰
}
break;
case Press : // 按键确认态
if((Key1 == 0) | (Key2 == 0) | (Key3 == 0) | (Key4 == 0)) //如有键按下则不是干扰,判断键值
{
//判断是哪一个按键被按下
if(Key1 == 0) //第一个键被按下
{
P1 = 0xfe;
Delay_ms(500);
P1 = 0xff;
}
if((Key2 == 0)) //第二个键被按下
{
P1 = 0xfd;
Delay_ms(500);
P1 = 0xff;
}
if((Key3 == 0)) //第三个键被按下
{
P1 = 0xfb;
Delay_ms(500);
P1 = 0xff;
}
if((Key4 == 0)) //第四个键被按下
{
P1 = 0xf7;
Delay_ms(500);
P1 = 0xff;
}
Key_State = Free; // 状态转换到键释放态
}
else
{
Key_State = Init; // 按键已抬起,属于干扰,转换到按键初始态
}
break;
case Free :
if((Key1 == 1) & (Key2 == 1) & (Key3 == 1) & (Key4 == 1)) //判断按键是否释放
{
Key_State = Init; //如果按键释放,转换到按键初始态
}
break;
}
}
上一篇:变量定位或函数定位
史海拾趣
|
SM59D03(8+4,内置E2PROM,ISP) SM59D03工作特性: 工作电压:2.7V-3.6V(L);4.5V-5.5V(C) 8052内核 每12或者6时钟周期/1机器周期(12T/6T) 工作频率最高25MHz 8K片上FLASH程序空间+4K 额外4K空间可作为EEPROM和ISP使用 768字节片上 ...… 查看全部问答> |
|
摘要:理解电压调节器的物理特性对于设计符合EMI和EMC兼容性要求的电源系统至关重要。开关调节器(降压、升压、反激以及SEPIC拓扑结构)的物理特性对于元件选择、电磁设计以及PCB布局具有特殊的指导意义。漏感、ESR和ESL的寄生效应是优化电路性能的关 ...… 查看全部问答> |
|
我做了一个串口通信模块,但不知道是为什么,单片机刚开始工作的时候,串口传到PC机上的数据还是对的,但运行一段时间后,数据就不对了,比先前的大很多,大到几万,而前面正确的只在10以内,不知道是什么原因。请高手指点!下边是对串口的一些设置 ...… 查看全部问答> |
|
小弟最近在看串口代码,public\\common\\oak\\drivers\\serial\\serpddcm\\Cserpdd.cpp里关于电源管理的部分看得有点蒙,它直接用setDevicePowerState就可以管理电源了,为什么要在init里m_PowerHelperHandle = DDKPwr_Initialize(SetPowerStateSta ...… 查看全部问答> |
|
1. 有没有人愿意参与到我的打印机ARM项目中来。参与本项目可以获得以下提高: 1。 熟悉TI LM3S9B90 ARM 的硬件和软件 设计,熟悉其驱动库的使用 ...… 查看全部问答> |
|
基于多DSP的无人机飞行控制软件设计摘要:结合正在参与的某型同定翼飞机控制系统的设计,分析在多CPU飞控机上飞行控制软件的设计,飞行控制计算机是以3块DSP2812作为控制单元,一 块主CPU两块从CPU,两块从CPU各自分担一部分工作,减轻了主CPU的负担,相 ...… 查看全部问答> |
|
如题,现在突然想学学汇编语言了,感觉还是很有必要的,不一定太深入,至少应该要比较了解一下吧,汇编本身比较复杂,自己琢磨可能效率不高,所以来此求助,不知道有没有谁出教程,用汇编语言教单片机的?希望大家共享一下相关视频或者非视频教程, ...… 查看全部问答> |
|
我马上就要毕业了,但是回想起几年上学走过的经历,本来带着美好的憧景走进了学校,但是现感觉这几年过的好麻木。游戏几乎占了1/2的生活时间。现在看着身边的同学都找到了工作了,而我却是一脸的芒然,想着当时从山沟沟里走出来时,父母送我时千叮 ...… 查看全部问答> |




