OpenEdv-开源电子网

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

做了一个矩阵键盘的程序,是仿照mini的板子写的程序,但是设置不支持连按,还是会连按呢,贴上程序大神帮看下

[复制链接]

31

主题

130

帖子

0

精华

高级会员

Rank: 4

积分
790
金钱
790
注册时间
2015-6-28
在线时间
139 小时
发表于 2015-8-9 15:49:37 | 显示全部楼层 |阅读模式
5金钱
[mw_shl_code=c,true]void KEY_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB, ENABLE); //使能PA,PB端口时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_10|GPIO_Pin_11; //列 PB1 PB2 PB10 PB11 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 推挽输出 GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12; //行 PA9~PA12 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // 上拉输入 GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_SetBits(GPIOA, GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12); //行置为 1 GPIO_ResetBits(GPIOB, GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_10|GPIO_Pin_11); //列置为 0 } u8 Read_KeyValue(u8 mode) { u8 KeyValue=0; static u8 key_up=1;//按键按松开标志 if(mode)key_up=1; //支持连按 if(key_up&&(GPIO_ReadInputData(GPIOA)&0x1e00)!=0x1e00) { delay_ms(50); key_up=0; if((GPIO_ReadInputData(GPIOA)&0x1e00)!=0x1e00) { GPIO_SetBits(GPIOB, GPIO_Pin_2|GPIO_Pin_10); //扫描第一列 011 GPIO_ResetBits(GPIOB, GPIO_Pin_1); // switch((GPIO_ReadInputData(GPIOA)&0x1e00)) { case 0x1c00: KeyValue = 1; break; case 0x1a00: KeyValue = 4; break; case 0x1600: KeyValue = 7; break; case 0x0e00: KeyValue = 10; break; } GPIO_SetBits(GPIOB, GPIO_Pin_1|GPIO_Pin_10); //扫描第二列 101 GPIO_ResetBits(GPIOB, GPIO_Pin_2); // switch((GPIO_ReadInputData(GPIOA)&0x1e00)) { case 0x1c00: KeyValue = 2; break; case 0x1a00: KeyValue = 5; break; case 0x1600: KeyValue = 8; break; case 0xe00 : KeyValue = 11; break; } GPIO_SetBits(GPIOB, GPIO_Pin_1|GPIO_Pin_2); //扫描第三列 110 GPIO_ResetBits(GPIOB, GPIO_Pin_10); // switch((GPIO_ReadInputData(GPIOA)&0x1e00)) { case 0x1c00: KeyValue = 3; break; case 0x1a00: KeyValue = 6; break; case 0x1600: KeyValue = 9; break; case 0x0e00: KeyValue = 12; break; } GPIO_SetBits(GPIOA, GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12); //行置为 1 GPIO_ResetBits(GPIOB, GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_10); //列置为 0 return KeyValue; } } //判断键值结束 有按下则返回按下的键值 如果按下的跟前面的 else //if((GPIO_ReadInputData(GPIOA)&0x1e00)==0x1e00) key_up=1; return 0; } int main() { delay_init(); // 延时初始化 KEY_Init(); while(1) { key_m=Read_KeyValue(0); if(key_m!=0) { key_m=0; test_led=~test_led; //灯。每次取反 } } } [/mw_shl_code]

最佳答案

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

呵呵,换成全局的啊,或者考虑按键松开再返回数值
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

75

帖子

0

精华

初级会员

Rank: 2

积分
106
金钱
106
注册时间
2015-7-30
在线时间
1 小时
发表于 2015-8-9 15:49:38 | 显示全部楼层
呵呵,换成全局的啊,或者考虑按键松开再返回数值
方法比问题多,思路决定出路,人生无极限贵在坚持。
回复

使用道具 举报

31

主题

130

帖子

0

精华

高级会员

Rank: 4

积分
790
金钱
790
注册时间
2015-6-28
在线时间
139 小时
 楼主| 发表于 2015-8-9 15:49:38 | 显示全部楼层
回复【6楼】雪山飞狐:
---------------------------------
找出问题了。是else那里加判断就OK了
回复

使用道具 举报

31

主题

130

帖子

0

精华

高级会员

Rank: 4

积分
790
金钱
790
注册时间
2015-6-28
在线时间
139 小时
 楼主| 发表于 2015-8-9 16:01:15 | 显示全部楼层
按一次按键。应该是LED的状态反转才对。我现在测试就是有时候可以有时候不可以达到这效果
回复

使用道具 举报

2

主题

75

帖子

0

精华

初级会员

Rank: 2

积分
106
金钱
106
注册时间
2015-7-30
在线时间
1 小时
发表于 2015-8-9 16:11:43 | 显示全部楼层
加一条按键松开判断,if(key_m!=0&&key_up==1)试试
方法比问题多,思路决定出路,人生无极限贵在坚持。
回复

使用道具 举报

31

主题

130

帖子

0

精华

高级会员

Rank: 4

积分
790
金钱
790
注册时间
2015-6-28
在线时间
139 小时
 楼主| 发表于 2015-8-9 16:18:10 | 显示全部楼层
回复【3楼】雪山飞狐:
---------------------------------
key_up局部变量来啊。
回复

使用道具 举报

2

主题

75

帖子

0

精华

初级会员

Rank: 2

积分
106
金钱
106
注册时间
2015-7-30
在线时间
1 小时
发表于 2015-8-9 16:37:38 | 显示全部楼层
先判断赋值,等待某次查询按键松开再返回也可以。
方法比问题多,思路决定出路,人生无极限贵在坚持。
回复

使用道具 举报

31

主题

130

帖子

0

精华

高级会员

Rank: 4

积分
790
金钱
790
注册时间
2015-6-28
在线时间
139 小时
 楼主| 发表于 2015-8-9 17:55:35 | 显示全部楼层
while((GPIO_ReadInputData(GPIOA)&0x1e00)==0x1e00)

return KeyValue;
这样么
回复

使用道具 举报

2

主题

75

帖子

0

精华

初级会员

Rank: 2

积分
106
金钱
106
注册时间
2015-7-30
在线时间
1 小时
发表于 2015-8-9 18:42:39 | 显示全部楼层
你还是申请全局静态变量吧,这样好一些
方法比问题多,思路决定出路,人生无极限贵在坚持。
回复

使用道具 举报

2

主题

75

帖子

0

精华

初级会员

Rank: 2

积分
106
金钱
106
注册时间
2015-7-30
在线时间
1 小时
发表于 2015-8-9 19:10:54 | 显示全部楼层
呵呵,找出问题就好了,发下修改代码学习下哈~
方法比问题多,思路决定出路,人生无极限贵在坚持。
回复

使用道具 举报

31

主题

130

帖子

0

精华

高级会员

Rank: 4

积分
790
金钱
790
注册时间
2015-6-28
在线时间
139 小时
 楼主| 发表于 2015-8-10 21:33:55 | 显示全部楼层
回复【10楼】雪山飞狐:
---------------------------------
就是贴出来的哪里啊。在后面的else判断没有按下
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-18 18:53

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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