OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4096|回复: 6

按键扫描问题请教,谢谢

[复制链接]

17

主题

73

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
238
金钱
238
注册时间
2013-9-4
在线时间
18 小时
发表于 2013-10-14 19:50:41 | 显示全部楼层 |阅读模式
参考原子老师的按键扫描程序
有2个按键,扫描不到或者要按多次才能扫描到。按键有优先级,不支持连按。
这个程序要哪些要注意的细节,请指教。谢谢
        static u8 key_up=1;//按键按松开标志
if(mode)key_up=1;  //支持连按  
if(key_up&&((K1==0)||(K2==0)||(K4==0)||(K5==0)||(K7==0)||(K8==0)||(K10==0)||(K11==0)||(K13==0)||(K14==0)||(K9==0)||(K12==0)||(K15==0)))
{ //K3==0||K6==0
//delay_ms(2);//去抖动 
key_up=0;
if(K1==0)
return 1;
else if(K2==0)
return 2;
//else if(KEY3==0)return 3;
else if(K4==0)
return 4;
else if(K5==0)
return 5;
//else if(KEY6==0)return 6;
else if(K7==0)
return 7;
else if(K8==0)
return 8;
else if(K9==0)
return 9;
else if(K10==0)
return 10;
else if(K11==0)
return 11;
else if(K12==0)
return 12;
else if(K13==0)
return 13;
else if(K14==0)
return 14;
else if(K15==0)
return 15;
} //K3==1&&K6==1
else if((K1==1)&&(K2==1)&&(K4==1)&&(K5==1)&&(K7==1)&&(K8==1)&&(K10==1)&&(K11==1)&&(K13==1)&&(K14==1)&&(K9==1)&&(K12==1)&&(K15==1)) key_up=1;
return Key_Null;// 无按键按下



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

17

主题

73

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
238
金钱
238
注册时间
2013-9-4
在线时间
18 小时
 楼主| 发表于 2013-10-14 19:56:21 | 显示全部楼层
RCC->APB2ENR|=1<<4;    //使能PORTC时钟
RCC->APB2ENR|=1<<5;    //使能PORTD时钟
RCC->APB2ENR|=1<<6;    //使能PORTE时钟

GPIOC->CRH&=0XFFF0FFFF;//PC12设置成输入   
GPIOC->CRH|=0X00080000;
GPIOC->ODR|=1<<12;    //PC12上拉

GPIOD->CRL&=0X00000000;//PD0-7设置成输入   
GPIOD->CRL|=0X88888888;
GPIOD->ODR|=0XFF;    //PD0-7上拉

GPIOE->CRL&=0XFFF0F000;//PE04设置成输入   
GPIOE->CRL|=0X00080888;             
GPIOE->ODR|=0X17;//PE4-0上拉
回复 支持 反对

使用道具 举报

16

主题

70

帖子

0

精华

初级会员

Rank: 2

积分
154
金钱
154
注册时间
2013-9-23
在线时间
0 小时
发表于 2013-10-14 20:36:03 | 显示全部楼层
亲,这个也只是个算法而已,还和STM关系不太大。我这里有个自己写的键盘扫描,不是太完美,你可以参考一下:
我自信,我努力,我成功
回复 支持 反对

使用道具 举报

17

主题

73

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
238
金钱
238
注册时间
2013-9-4
在线时间
18 小时
 楼主| 发表于 2013-10-14 21:31:52 | 显示全部楼层
回复【3楼】一通无阻:
---------------------------------
谢谢您咯,贴出来让我们这些小菜鸟瞻仰瞻仰学习学习。
回复 支持 反对

使用道具 举报

16

主题

70

帖子

0

精华

初级会员

Rank: 2

积分
154
金钱
154
注册时间
2013-9-23
在线时间
0 小时
发表于 2013-10-15 15:37:20 | 显示全部楼层
回复【4楼】oooiou:
---------------------------------
呵呵,我又忘了,等着我会宿舍啊,不过我这里有个触摸按键的,和那个按键的差不了多少啊,你看看有啥建议我们交流交流。
u8 TPAD_Scan(void){   //自己编写的函数
u16 temp;       //来接受获得的时间
    static u8 flag=0 ;  //标志位,看有没有放开按键
temp=TPAD_Get_MaxVal(6); //获得6次得到的最大值
if(flag==0&&(temp>(tpad_default_val+TPAD_GATE_VAL))){//判断是否有手触摸
temp=TPAD_Get_MaxVal(6); //再次得到
if(flag==0&&(temp>(tpad_default_val+TPAD_GATE_VAL))){  //再次判断
     flag=1;  //标记已经有手触摸了
printf("%d\n",temp); //打印本次触摸的时间
return 1;
}
}
else if(flag==1){
if(temp>(tpad_default_val+TPAD_GATE_VAL)) flag=1; //手没有放下
else flag=0; //手放开了
}
return 0;
}
我自信,我努力,我成功
回复 支持 反对

使用道具 举报

16

主题

70

帖子

0

精华

初级会员

Rank: 2

积分
154
金钱
154
注册时间
2013-9-23
在线时间
0 小时
发表于 2013-10-15 22:56:30 | 显示全部楼层
回复【4楼】oooiou:
---------------------------------
u8 KEY_Scan(void){    //自己写的程序,多简单啊,还少了2个变量 ,时间和空间都相当节省
if(KEY0==0||KEY1==0||KEY2==0||KEY3==1){
delay_ms(10);
if(KEY0==0){while(!KEY0); return 1;}
else if(KEY1==0) {while(!KEY1);return 2;}
else if(KEY2==0) {while(!KEY2);return 3;}
else if(KEY3==1) {while(KEY3); return 4;}
}
return 0;
}
我自信,我努力,我成功
回复 支持 反对

使用道具 举报

17

主题

73

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
238
金钱
238
注册时间
2013-9-4
在线时间
18 小时
 楼主| 发表于 2013-10-16 07:34:47 | 显示全部楼层
回复【6楼】一通无阻:
---------------------------------
谢谢
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-10 21:32

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表