新型独立按键扫描程序,申明不是原创,感觉很好用,与大家共享一下。大家的独立按键要是有高效的方法,不防也来讨论讨论

2019-10-16 05:42发布

说明:3个独立按键分别接stm32的PB10, PB11和 PB12
具体原理请参照: http://www.amobbs.com/thread-4308630-1-1.html  
下面是自己移植的,不足之处,希望各位指点:


#define KEY12 0x10   //安照八位单片机来算,对独立按键的信号端进行宏定义 ,方便后面检测用(PB10, B11和 B12就按PB2, B3和 B4来定义) #define KEY11 0x08    //也可以按照实际来定义,但KeyRead(void) 函数需要做适当修改 #define KEY10 0x04
unsigned char KEY_Trg; //扫描按键用(单击一次用) 全局变量 unsigned char KEY_Count;//扫描按键(长按用)用全局变量
unsigned char ms;//毫秒计数器 全局变量 
unsigned char t;// 表示长按按键的时间 =t*扫描时间?这里有个疑问,这个变量应该申明位全局还是局部?测试了一下都可以
void KeyRead(void) //按键扫描函数 {     unsigned char ReadData ; unsigned int temp; //若按键接的是IO口的高8位,需要定义一个缓冲区 //ReadData=((GPIOB->IDR^0xff)); //若按键接的是低8位的话,用这一句话就行,下面3句不需要         temp=GPIOB->IDR&0xff00;// 若按键接的是IO口的高8位 使用 ;GPIOB->IDR不能写,需要定义一个缓冲区 temp>>=8;  // 若按键接的是IO口的高8位 使用         ReadData=temp^0xff; // 若按键接的是IO口的高8位高8位用     KEY_Trg = ReadData & (ReadData ^ KEY_Count);      // 2     KEY_Count = ReadData;                            // 3 }
void KeyProcess(void)
{
    if((KEY_Trg & KEY10))//短按
                {do something}
    else if((KEY_Trg & KEY11))
                {do something}      else if((KEY_Trg & KEY12))
                {do something}      if(( KEY_Count  & KEY10))//长按
    {
        t++;    
        if(t>30)  //根据需要修改长安时间  
        {
        t=0;
        {do something} 
        }
    }
}
void main(void)
{

if(ms>80)//主程序每隔80ms去扫描一次按键
{
ms =0; 
KeyRead() ;
KeyProcess() ;
}
else {do something}
}

stm32的初始化配置就省啦,相信大家都会拉










友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
23条回答
wjfhsym
1楼-- · 2019-10-19 05:49
好像有问题,这个程序,长按这里有问题吧!!!每次长按 都会触发短按,并且t++这也是问题!!!个人意见!!!
z1234zz
2楼-- · 2019-10-19 06:08
STM32新学习者 发表于 2016-4-22 17:06
好像有问题,这个程序,长按这里有问题吧!!!每次长按 都会触发短按,并且t++这也是问题!!!个人意见! ...

对的,需要想办法解决
yangt
3楼-- · 2019-10-19 09:10
 精彩回答 2  元偷偷看……
STM32新学习者
4楼-- · 2019-10-19 14:17
这种方法 怎样去抖动?   
hkys_lxh
5楼-- · 2019-10-19 18:58
每隔一定时间  扫描一次这两个函数:KeyRead() ;
KeyProcess() ;   用这种方式去抖动?

一周热门 更多>