历史上的今天
返回首页

历史上的今天

今天是:2024年12月11日(星期三)

正在发生

2019年12月11日 | 非常完备的按键操作系统,单击、双击、N击,长按。可移植

2019-12-11 来源:elecfans

#define BaseTime 10        //时间基准10 ms ,如果设计的时基是5ms 则前面的10就用该变成5

#define number_init          0xfffffffd  // 初始化相关的utime(unsigned long)变量(如果是unsigned int 就应该是0xfffd),采用这个值的好处是,即使发生时钟计数器溢出,也不影响其他的程序


typedef unsigned long utime;  //这个类型是为了方便移植专门给时间相关变量使用

typedef unsigned long ulong;

typedef unsigned int uint;

typedef unsigned char uchar;


enum ButtonModel{noneClick=0,singalClick,doubleClick,repeatClick,longPress}; //doubleClick目前未定义完整动作 pressDownHold,按下保持

enum ButtonStaus{nonePress=1,pressDown,pressUp,pressDownHold};        /



struct button

{

    uchar outPutEn:1; //发送数据使能

    uchar lastButton:1; //按键上次变动后的状态 默认 1

    uchar init_leavel:1; //设置默认按键电平

        uchar longPressFlag:1;            //长按释放标志 默认0,一旦开始长按则置1

        uchar Gpio_level :3;

        uchar applyUseOpenMaxPwm:1;         //在关机状态下,若本按键按下启动了系统,则需要申请全局变量标明,禁止其他按键关闭被本按键打开的系统(自己打开自己负责关闭)


        uchar ticks;            //按键按下次数

    enum ButtonStaus lastButtonStaus;   //按键上个循环的状态

    enum ButtonStaus thisButtonStaus;   //按键本循环的状态

    enum ButtonModel lastButtonModel; //按键上个循环所处的模式

    enum ButtonModel thisButtonModel; //按键本循环应该所处的模式


    uint changeModelTime;  //10ms基准              //长按时间定义

    uint pressLongTime;    //10ms基准              //多击时间定义


    utime lastPressDownMoment;     //上次按键按下所处的时刻

    utime thisPressDownMoment; //本次按键按下所处的时刻

    uint tempTime;           //缓存按键两次按下之间的时长


    utime buttonConfir;     //按键防抖时长



    utime getTimer; //获取时钟精准时刻,用于设定按键扫描周期

    utime acquisitionMoment; //获取时钟精准时刻,用于记录相同按键状态持续时长


    uchar  (*read_gpio)(void); //获取按键状态方法

};

/*================================

outPutEn 是为后面接收按键是单击、多击长按函数准备的参数。比如按键扫描程序10ms运行一次,输出的是单击,如果没有outPutEn这个参数,后面的接收程序会在10ms内一直都接收的是单击指令,这样就会一直执行单击需要进行的操作,本来单击一次档位变化1,结果现在档位变化了n


applyUseOpenMaxPwm 是为多按键且按键操作有优先权做准备,,有优先权的操作不会被其他按键操作打断





===============================*/

struct button button1,button2,button3;


void Scan_key(struct button *Key,utime timer ,uint enOutTime ,uint noiseProofTime)

{

         enOutTime/=BaseTime;

     noiseProofTime/=BaseTime;

     if(number_init==Key->getTimer) //如果是第一次运行,则更新时间

     {

         Key->getTimer=timer;

     }


     else

     {

         if(timer-Key->getTimer>=enOutTime) //如果时间足够“定义的循环时间” ,则更新时间并允许运行

         {

            Key->getTimer=timer;

            Key->Gpio_level=Key->read_gpio();

            if(Key->Gpio_level>1);

                        else

            {

                         if(Key->lastButton^Key->Gpio_level)//按键有电平变化模块处理开始----------------------------------------------------------------------------//

             {

                                 if(number_init==Key->buttonConfir)

                                        Key->buttonConfir=timer;


                 if(timer-Key->buttonConfir>=noiseProofTime)//按键防抖,必须再确认状态

                 {

                     Key->lastButton=Key->Gpio_level;

                                         Key->acquisitionMoment=number_init;

                     Key->buttonConfir=number_init; //二次确认标志重置




                     if(Key->init_leavel^Key->Gpio_level)//本次按键状态改变后与定义的电平不一致模块处理开始

                     {

                         switch(Key->lastButtonStaus)

                         {

                         case nonePress: //上个循环是定义的初始电平

                         case pressUp:

                            {

                                if(number_init==Key->lastPressDownMoment)//是第一次记录按键按下时刻

                                {

                                    Key->thisPressDownMoment=Key->lastPressDownMoment=timer;

                                }

                                else //不第一次记录

                                {

                                    Key->thisPressDownMoment=timer;

                                    Key->tempTime+=Key->thisPressDownMoment-Key->lastPressDownMoment; //获取两次按键按下之间的时间间隔

                                    Key->lastPressDownMoment=Key->thisPressDownMoment;  //更新

                                }



                                Key->ticks++;



//不在此处增加pressLongTime判断的原因是,buftime0记录的是两次按键按下之间的时长,在两次按下之间必有弹起,一旦弹起,pressLongTime 就置零


                                switch(Key->ticks)

                                {

                                case 1:

                                    {

                                        if(Key->tempTime>=Key->changeModelTime)//ticks未初始化。

                                        {

                                            Key->ticks=0;

                                            Key->tempTime=0;


                                        }

                                                                                Key->thisButtonModel=singalClick;

                                        break;

                                    }

                                case 2:

                                    {

                                        if(Key->tempTimechangeModelTime)//ticks未初始化

                                        Key->thisButtonModel=doubleClick;

                                        else

                                        {

                                            Key->thisButtonModel=singalClick;

                                            Key->ticks=0;

推荐阅读

史海拾趣

Dow-Key Microwave Corporation公司的发展小趣事

为了实现公司的国际化发展战略,Dow-Key Microwave积极开展国际合作与交流。公司与全球知名的电子企业和研究机构建立了紧密的合作关系,共同开展技术研发和市场开拓活动。这些合作不仅提升了公司的技术水平和市场影响力,还为公司的国际化发展提供了有力支持。同时,公司还积极参与国际展览和论坛活动,展示公司的最新技术和产品成果,进一步提升了公司的国际知名度和品牌形象。

FTCAP Fischer & Tausche Capacitor Group公司的发展小趣事

为了保持市场竞争力,Dow-Key Microwave始终将创新作为公司发展的核心动力。公司不断推出新产品、新技术和新服务,以满足客户不断变化的需求。同时,公司还加强对员工的培训和激励,鼓励员工积极参与创新活动。这些措施的实施,使得Dow-Key Microwave在技术创新和产品升级方面取得了显著成效,进一步巩固了公司在行业中的领先地位。

Bel Fuse公司的发展小趣事

随着电子行业的快速发展,Bel Fuse意识到要保持竞争力,必须不断进行技术创新。因此,公司加大了研发投入,推出了一系列具有创新性的电子元件产品。这些产品不仅满足了客户的需求,还为公司带来了可观的市场份额。同时,Bel Fuse也开始积极寻求全球扩张的机会,通过设立海外分公司和建立销售网络,进一步提升了公司的全球影响力。

Epistar Corp公司的发展小趣事

近年来,随着OLED(有机发光二极管)技术的兴起,LED行业面临着巨大的挑战。Epistar敏锐地意识到了这一点,开始积极调整战略方向,加大在OLED技术领域的研发力度。同时,公司还通过优化产品结构、提高生产效率等措施降低成本、提升竞争力。这些努力使Epistar在OLED技术浪潮中保持了稳健的发展态势。

Compex Corporation公司的发展小趣事

近年来,电子行业面临着巨大的变革和挑战。新技术的不断涌现和市场的快速变化使得企业必须不断适应和创新。Compex Corporation也不例外。公司紧密关注行业动态和技术发展趋势,不断调整和优化产品结构和市场策略。同时,公司还加大了在人工智能、物联网等新兴领域的研究力度,以期在未来市场中占据先机。通过持续创新和适应变化,Compex Corporation在电子行业中保持了领先地位,并为未来的发展奠定了坚实基础。

请注意,以上故事是基于假设和可能的情况构建的,并非Compex Corporation的实际发展历史。如果需要更具体和准确的信息,建议查阅相关公司的官方资料或行业报告。

Fujisoku Corporation公司的发展小趣事

在电子行业的早期,一家名为“未来电子”的公司(虚构名称,代指类似Fujisoku Corporation的企业)通过自主研发,成功突破了半导体材料的瓶颈,开发出了一种新型的高效能硅基材料。这一创新不仅大幅提升了芯片的性能和稳定性,还降低了生产成本,使“未来电子”迅速在半导体市场崭露头角。公司凭借这一技术优势,不断推出具有竞争力的电子产品,逐步建立起行业领先地位。

问答坊 | AI 解惑

总结给要参加电子设计竞赛的同学们

本帖最后由 paulhyde 于 2014-9-15 09:33 编辑 总结给要参加电子设计竞赛的同学们 电子设计竞赛的近几年成为企业录用大学生的重点考察点从而带动成为大学生的热点,在参赛的同学中有很多是大二学生或者是第一次参赛的同学,或许很迷茫、不知道从 ...…

查看全部问答>

2008奥运考验医疗卫生行业IT基础设施

对很多体育爱好者来说,奥运是一个盛大的聚会;而对组织者和当地政府而言,奥运是一次前所未有的巨大考验。在短时间内,云集众多的运动员、官员和来访者,各种突发事件和重大事件可能不期而至,对各个行业带来了巨大的压力。而医疗卫生行业作为奥运 ...…

查看全部问答>

交叉编译器生成的ELF文件问题?

怎样从.elf格式文件中获得变量的信息,包括名称,类型,地址?哪位大神能发给我这样的函数?不胜感激。744287475@qq.com…

查看全部问答>

急急急! 新得到一个wince5.0设备. 如何动手

我现在拿到了一个wince 5.0的设备.上面已经有了系统, 我要是想在上面用vs2005做C#开发, 我看系统信息上说CPU是INTEL ARM920T-PX 要怎么做才能在上面开发?什么BSP.SDK..的都是什么流程? …

查看全部问答>

嵌入式群、LINUX群、VC群、黑客群、ASP群、经济群

欢 迎 大 家 加 入: 黑客开发者群:18605156,48490346,17795088,48490503 VC 群:18607590 ASP群:48490599 嵌 入 式 群:33956012加入请写名原因。 LINUX 群:18788803 经济、军事群:3685785 …

查看全部问答>

430F5438资料

与430x54xx配套的资料 希望可以有助于像我一样刚开始学习5系列单片机LZ…

查看全部问答>

CPLD中两个inout接口怎么打通,大侠们不要路过,进来说说您的方案,评优嘉奖啊

问题是这样的:一个CPLD上接了两个I2C的接口,即scl,sda和scl1,sda1,怎么将这两个I2C打通。(scl,sda是主机I2C,scl1,sda1是从机I2C) 问题相关信息搜集: I2C的scl信号是单通(input scl;   output scl1),这个信号直接相连就可以, ...…

查看全部问答>

嵌入式学习的点点滴滴(我的学习笔记-《鸟哥的linux私房菜》4)

好久没发帖了呢,最近几天回家了。。 在这里我想感谢soso管理员对我的支持,每次发帖她都会支持我继续写下去,谢谢 现在继续我这几天学习的总结吧。 linux一般将文件可存取访问的身份分为3个类别,分别是owner(用户),group(用户组),othe ...…

查看全部问答>

Beaglebone上android4.2音频移植

启动板的打印信息显示ALSA List Device: no soundcards found.进入系统的/dev/snd目录下,只存在这timer,没有pcmC0Dx和controlC这些文件。…

查看全部问答>