历史上的今天
返回首页

历史上的今天

今天是: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;

}

}


推荐阅读

史海拾趣

Digital公司的发展小趣事

DIALIGHT公司一直专注于工业LED照明领域的发展。他们深入了解工业空间照明的需求和挑战,设计了一系列专为工业应用而定制的LED照明产品。这些产品不仅易于安装和维护,而且能在恶劣的环境下持续使用。此外,DIALIGHT还提供集成系统解决方案,帮助客户降低能源成本、维护成本和碳足迹,同时提高设施的安全性和生产力。通过不断创新和优质服务,DIALIGHT在工业LED照明领域赢得了广泛的认可和信赖。

Firadec公司的发展小趣事

背景:进入21世纪后,Firadec公司意识到全球化市场的重要性,开始实施全球化战略布局。

发展:公司首先在欧洲和亚洲设立了研发中心和销售网络,以便更好地贴近当地市场需求。随后,Firadec通过并购和合作等方式,进一步扩大了在全球范围内的市场份额和影响力。

影响:全球化战略的成功实施,使Firadec公司能够迅速响应全球市场的变化,抓住新的发展机遇。同时,公司也通过与国际知名企业的合作,不断提升自身的技术实力和市场竞争力。

台湾晶豪(ESMT)公司的发展小趣事

随着电子行业的不断发展,晶豪科技也积极应对市场变化。公司扩大代工厂的晶圆开工规模,以满足不断增长的客户需求。这一举措不仅使公司能够更灵活地应对市场波动,还为客户提供了更稳定的产品供应。同时,随着晶圆开工量的增加,公司的销售额也实现了稳步增长。

Emerson Embedded Power公司的发展小趣事

面对日益严峻的环境问题,Emerson Embedded Power积极响应,将环保理念融入产品设计和生产过程中。该公司致力于开发节能、低碳的电源产品,帮助客户降低能源消耗和碳排放。同时,公司还积极推广绿色制造理念,推动整个电子行业的可持续发展。

ETC公司的发展小趣事

在ETC领域,速通科技积极寻求与行业内其他企业的合作。公司与多家银行、保险公司等金融机构建立了合作关系,共同推广ETC系统的应用。此外,速通科技还积极参与行业标准的制定和修订工作,推动ETC行业的健康发展。通过与行业内其他企业的合作,速通科技实现了共赢发展,共同推动了ETC行业的进步。

Defense Logistics Agency公司的发展小趣事

面对日益复杂的军事需求和快速发展的技术环境,DLA积极推进技术创新和数字化转型。通过引入云计算、大数据、人工智能等先进技术,DLA实现了对全球供应链的实时监控和智能调度,大大提高了后勤保障的效率和准确性。同时,DLA还加强了对新型军事装备的研发和保障能力,确保美军在现代化战争中保持领先地位。

问答坊 | AI 解惑

50kHz调频光接收电路

50kHz调频光接收电路 作者:未知 文章来源:未知[code language=\"J#\"] [/code] …

查看全部问答>

新茂单片机DATASHEET中文资料

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的关键

摘要:理解电压调节器的物理特性对于设计符合EMI和EMC兼容性要求的电源系统至关重要。开关调节器(降压、升压、反激以及SEPIC拓扑结构)的物理特性对于元件选择、电磁设计以及PCB布局具有特殊的指导意义。漏感、ESR和ESL的寄生效应是优化电路性能的关 ...…

查看全部问答>

关于单片机与PC机的串口通信问题。请高手指点。急!

我做了一个串口通信模块,但不知道是为什么,单片机刚开始工作的时候,串口传到PC机上的数据还是对的,但运行一段时间后,数据就不对了,比先前的大很多,大到几万,而前面正确的只在10以内,不知道是什么原因。请高手指点!下边是对串口的一些设置 ...…

查看全部问答>

有用过DDKPwr_Initialize的吗?

小弟最近在看串口代码,public\\common\\oak\\drivers\\serial\\serpddcm\\Cserpdd.cpp里关于电源管理的部分看得有点蒙,它直接用setDevicePowerState就可以管理电源了,为什么要在init里m_PowerHelperHandle = DDKPwr_Initialize(SetPowerStateSta ...…

查看全部问答>

找喜欢流明的ARM芯片的人,和我一起做ARM项目的设计

1. 有没有人愿意参与到我的打印机ARM项目中来。参与本项目可以获得以下提高:          1。 熟悉TI LM3S9B90  ARM 的硬件和软件 设计,熟悉其驱动库的使用        ...…

查看全部问答>

【为C2000做贡献】基于多DSP的无人机飞行控制软件设计

基于多DSP的无人机飞行控制软件设计摘要:结合正在参与的某型同定翼飞机控制系统的设计,分析在多CPU飞控机上飞行控制软件的设计,飞行控制计算机是以3块DSP2812作为控制单元,一 块主CPU两块从CPU,两块从CPU各自分担一部分工作,减轻了主CPU的负担,相 ...…

查看全部问答>

有没有人出汇编语言版本的51单片机教程?

如题,现在突然想学学汇编语言了,感觉还是很有必要的,不一定太深入,至少应该要比较了解一下吧,汇编本身比较复杂,自己琢磨可能效率不高,所以来此求助,不知道有没有谁出教程,用汇编语言教单片机的?希望大家共享一下相关视频或者非视频教程, ...…

查看全部问答>

谁知道这是什么电容?

谁知道这是什么电容?201GA到底什么意思? …

查看全部问答>

想找个一起把51单片机学细的人

我马上就要毕业了,但是回想起几年上学走过的经历,本来带着美好的憧景走进了学校,但是现感觉这几年过的好麻木。游戏几乎占了1/2的生活时间。现在看着身边的同学都找到了工作了,而我却是一脸的芒然,想着当时从山沟沟里走出来时,父母送我时千叮 ...…

查看全部问答>