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

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的初始化配置就省啦,相信大家都会拉










友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。