OpenEdv-开源电子网

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

stm32 矩阵键盘如何实现按钮长按只返回一次

[复制链接]

35

主题

59

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
224
金钱
224
注册时间
2014-8-15
在线时间
2 小时
发表于 2014-12-24 18:27:58 | 显示全部楼层 |阅读模式
5金钱
stm32的矩阵键盘如何实现按钮按下后,不管按下的时间长短,都只返回一次键值。
或者告诉我怎么判按钮断按下与松开?谢谢!

最佳答案

查看完整内容[请看2#楼]

while等待按键释放吧。 while(未松开);//读引脚电平
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

16

主题

409

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1292
金钱
1292
注册时间
2014-12-20
在线时间
534 小时
发表于 2014-12-24 18:27:59 | 显示全部楼层
while等待按键释放吧。
while(未松开);//读引脚电平
回复

使用道具 举报

16

主题

409

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1292
金钱
1292
注册时间
2014-12-20
在线时间
534 小时
发表于 2014-12-24 18:27:59 | 显示全部楼层
回复【3楼】cjiamoo:
---------------------------------
http://www.openedv.com/posts/list/0/43776.htm
看看别人怎么写的。
while((GPIOD->IDR & 0xf000) != 0xf000);
这个加到你给的代码最后看看呢。
回复

使用道具 举报

35

主题

59

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
224
金钱
224
注册时间
2014-8-15
在线时间
2 小时
 楼主| 发表于 2014-12-24 19:14:26 | 显示全部楼层
回复【2楼】BMN李:
---------------------------------
GPIO_Write(GPIOD,(GPIOD->ODR & 0xf0ff | 0x0100)); //让PB11到PB8输出二进制的0001.

switch(GPIOD->IDR & 0xf000)//对PB12到PB15的值进行判断,以输出不同的键值。
{
case 0x1000: KeyVal=0; break;
case 0x2000: KeyVal=4; break;
case 0x4000: KeyVal=8; break;
case 0x8000: KeyVal=12; break;
}
   
GPIO_Write(GPIOD,(GPIOD->ODR & 0xf0ff | 0x0200)); //让PB11到PB8输出二进制的0010.
switch(GPIOD->IDR & 0xf000)         //对PB12到PB15的值进行判断,以输出不同的键值。
{
case 0x1000: KeyVal=1; break;
case 0x2000: KeyVal=5; break;
case 0x4000: KeyVal=9; break;
case 0x8000: KeyVal=13; break;
}

GPIO_Write(GPIOD,(GPIOD->ODR & 0xf0ff | 0x0400)); //让PB11到PB8输出二进制的0100.
switch(GPIOD->IDR & 0xf000)         //对PB12到PB15的值进行判断,以输出不同的键值。
{
case 0x1000: KeyVal=2; break;
case 0x2000: KeyVal=6; break;
case 0x4000: KeyVal=10; break;
case 0x8000: KeyVal=14; break;
}
 
 GPIO_Write(GPIOD,(GPIOD->ODR & 0xf0ff | 0x0800)); //让PB11到PB8输出二进制的1000.
switch(GPIOD->IDR & 0xf000)         //对PB12到PB15的值进行判断,以输出不同的键值。
{
case 0x1000: KeyVal=3; break;
case 0x2000: KeyVal=7; break;
case 0x4000: KeyVal=11; break;
case 0x8000: KeyVal=15; break;
}

上面是我的程序,要在哪里加呢?未松开用什么表示?
回复

使用道具 举报

35

主题

59

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
224
金钱
224
注册时间
2014-8-15
在线时间
2 小时
 楼主| 发表于 2014-12-26 09:35:20 | 显示全部楼层
回复【4楼】BMN李:
---------------------------------
谢谢!已解决
回复

使用道具 举报

4

主题

36

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
289
金钱
289
注册时间
2015-10-7
在线时间
32 小时
发表于 2016-1-18 17:38:37 | 显示全部楼层
cjiamoo 发表于 2014-12-26 09:35
回复【4楼】BMN李:
---------------------------------
谢谢!已解决

求分享,最近我也遇到这个问题,也是那个while语句不知道该加到哪个位置,尝试了很多次,不是不发送就是还是按下一直发。求解决办法!!!!
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-26 00:24

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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