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

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条回答
稻子熟了
1楼-- · 2019-10-17 11:59
回复【楼主位】hkys_lxh:
---------------------------------
你好 在吗?
mygod
2楼-- · 2019-10-17 15:51
两个 状态 变量, 利用的就是  C中的 异或操作,相同为 0,不同为 1,其中一个保存 上次的状态量,就是这么个原理。
tian123chi
3楼-- · 2019-10-17 17:57
void KEY_Scan(void)
{  
    static u8 keytemp=0;
static u16 key_count=0;   
if(KEY0==0||KEY1==0)

if(key_count<200) 
{
if(KEY0==0)  keytemp=1;
if(KEY1==0)  keytemp=2;
}
else if(key_count==200)
{  
if(KEY0==0)  keynum=3;
if(KEY1==0)  keynum=4;
keytemp=3;
}
key_count++;
}
else if(KEY0==1&&KEY1==1)
{
    if(key_count>1)
{
if(keytemp!=3)  keynum=keytemp;
key_count=0;
}    
}      
}
一样的原理~,如果加其他功能 长按,同时按,真的很方便
yyocuo007
4楼-- · 2019-10-17 19:58
好神奇的按键 去抖动一流。看了很久都不是很明白,自己写一遍就懂了
xouou_53320
5楼-- · 2019-10-17 20:47
 精彩回答 2  元偷偷看……
hkys_lxh
6楼-- · 2019-10-18 01:36
回复【12楼】xouou_53320:
---------------------------------
1秒以上 每100毫秒连发一次  一秒发10次 ,是个什么意思,不太明白,望您说的再详细一点,正好在测试菜单结构,用到按键,顺便再测试一下你这个“游戏手柄”玩意

一周热门 更多>