微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 各种信号稳定性处理一个函数轻松搞定

各种信号稳定性处理一个函数轻松搞定

时间:10-02 整理:3721RD 点击:
/******************************程序编写者:周朝辉***************************//  
#define      uchar      unsigned char                                                                  //无符号char类型
#define      uint         unsigned int                                                                     //无符号int类型
#define      set_bit(x,y)              (x|=(1<<y))                                                   //位置1
#define      clr_bit(x,y)              (x&=~(1<<y))                                                //位清0
#define      get_bit(x,y)            (x&(1<<y))                                                      //位查询
#define      xor_bit(x,y)             (x^=(1<<y))                                                  //位取反
/**********************************稳定性处理函数***************************//
uint              key_keep_timer[8];                                                                      //稳定性计数次数初始化为0
uchar           key_station=0;                                                                             //稳定性状态标志信号反馈
//**************************************************************************//        
void key_station_scan(uchar station,uint click_timer,uchar keep_way)              //稳定性检测函数   station 为输入状态检测信号
{                                                                                                                      //click_timer为检测次数      keep_way为利用的函数信号通道
    if(station)                                                                                                      //信号输入比较是否为1
    {
        if(key_keep_timer[keep_way]==click_timer)                                             //计数对比是否达到稳定性次数要求
        set_bit(key_station,keep_way);                                                                //状态标记置位   
        if(key_keep_timer[keep_way]<65535)                                                     //防计数溢出
        key_keep_timer[keep_way]++;                                                               //计数未达到要求继续累加计数
    }
    else                                                                                                              //稳定性信号不符合清楚计数和标记
    {
    key_keep_timer[keep_way]=0;                                                                   //计数器清零
    clr_bit(key_station,keep_way);                                                                    //状态标记清零
    }
}
//**************************************************************************//
以上函数可以用来检测多种信号稳定性状态,列如最常见的按键长短按功能处理检测,电压阀值检测
列举1:如果要检测按键IO口P0_0口是否有按键按下(低有效),假设主程序为10ms一次循环,我们即可以用次函数来做按键检测
key_station_scan(P0_0==0,20,0);      //该函数的意思为利用函数0通道检测连续20次P0_0为低电平。最终若按键有效则置位主程序只需查询该位即可set_bit(short_key_station,0),
if(get_bit( key_station,0))                    //查询按键标记是否置位
{clr_bit( key_station,0)                        //查询到标记后清除标记
/*
     此处添加按键功能处理程序
*/
}
列举2:如果要检测单节电池充电电压是否达到4.2v(假设其对应的ad值为800),假设主程序为10ms一次循环,我们即可以用次函数来做多次稳定性检测
key_station_scan(ad>=800,20,1);      //该函数的意思为利用函数1通道检测连续20次ad电压大于等于4.2v。最终若有效则置位主程序只需查询该位即可set_bit(short_key_station,1),
if(get_bit( key_station,1))                    //查询按键标记是否置位
{clr_bit( key_station,1)                        //查询到标记后清除标记
/*
     此处添加功能处理程序
*/
}
列举……(其用处范围还十分广泛,大家可以开动思维多去想想)
备注:该功能函数看似很普通,甚至大家都经常用到,但是却没有这种统一整合封装的去充分利用它。该函数是个人曾经过严密整合封装的函数,用处非常之广泛,个人从事电器开发行业多年,其带来的开发便携性非常之大,同时也在向身边的同事朋友推荐应用,反应效果都非常好。后续还有很多其它的个人非常经典的程序内容与各位分享 ,相互交流学习可加个人qq 1044340359
                                                                                      

没有人抢沙发,只能自己来了

期待后期更多的分享

需要大家的支持才能不断的有精彩呈现

学习了 非常好学习了 非常好学习了 非常好学习了 非常好

对大家有所受益就好,后续还会不断有更多更精彩的内容

小编的程序很实用,像是项目提取出来的,收藏了,谢谢小编的分享!

长期工作经验中提炼出来的精华内容,都是个人原创。大家相互分享才有意义,藏着掖着能力只有自己知道也是枉然

感谢小编的好心态,分享经验是件有益的事,好的大家看到,学习了,有不足的大家实践了会帮你提个醒,自己也有技术的提升。期待更多类型(模块)的内容,有好的可以直接移植到自己的项目上去。

一直在学习着,收藏了

后期可以多关注,还会不断有新帖更新,对新手入门会很有帮助,多老手也会有一定的交流意义

  关注着,还不错。以后没事可以多来逛逛。支持小编!加油!

mark!mark!mark!mark!mark!

赖黄工以后多支持呢

很好                        

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top