OpenEdv-开源电子网

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

STM32 4*4矩阵键盘程序

[复制链接]

38

主题

302

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
440
金钱
440
注册时间
2012-3-6
在线时间
5 小时
发表于 2012-10-18 16:40:18 | 显示全部楼层 |阅读模式
u8 check_Key(void)
{    
u16 cord_h,cord_l;//行列值中间变量  高位为行 ,低位为列;
u8 Val = 0xFF;
//i=(GPIOG->ODR)&0xFFFF;
GPIOG->CRL=0x33888844; 
GPIOG->CRH=0x44444433;     
Delay_1us();
GPIOG->ODR = 0xFC3F;            //行线输出全为0  //1111 1100 0011 1111
Delay_1us();
cord_h = GPIOG->IDR & 0x003C;     //读入列线值   //0000 0000 0011 1100
if(cord_h != 0x003C)    //先检测有无按键按下     //1111 1100 0011 1111
{
Delay_Nms(100);        //去抖
if(cord_h != 0x003C)  // 0000 0000 0000 0000 //1111 1100 0011 1111
{                                              
cord_h = GPIOG->IDR&0x003C;  //读入列线值//
GPIOG->CRL=0x88333344;  
GPIOG->CRH=0x44444488;  
Delay_1us();
GPIOG->ODR = cord_h|0xFFC3;  //输出当前列线值1111 1111 1100 0011
Delay_Nms(2);// 此延时比不可少;
cord_l = GPIOG->IDR&0x03C0;  //读入行线值    0000 0011 1100 0000
Delay_1us();
cord_h>>=2;
cord_l>>=2;
Val = (cord_h+cord_l)&0xff;
return Val;                  //键盘最后组合码值 
}
}
return 0xFF;     //返回该值
}

本人一行行写出来的.适用于寄存器写和库版本写都可以用,反转法循环扫描;由于本人接的是GPIOG PIN2 - PIN 9 所以字节都是左移了两位的 后面移回来了. 输出的时候要 推挽输出 输入的时候要上拉输入;如果直接从pin0-pin7 那就更容易了.
键盘直接接的IO口 没其他外拉了.








ES?全称?Embedded?Show;ES是由众多嵌入式爱好者组织的一个团队,致力于带领学生进步,帮助毕业生找到工作,更重要的是在职的嵌入式工作者提供自主外包和创业的机会。(详情进群查看) ES的宗旨是:交流共享与合作发展。ES?QQ群?第三群:152820643?。群内论坛有很多嵌入式开发模块解决方案可以参考。进群的立马共享自己做的模块简介。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

27

主题

148

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
276
金钱
276
注册时间
2012-7-25
在线时间
0 小时
发表于 2012-10-18 18:45:50 | 显示全部楼层
回复【楼主位】a4615800:
---------------------------------
你的设计如果有多个按键同时按下,会不会有输出短路的情况。
回复 支持 反对

使用道具 举报

18

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
286
金钱
286
注册时间
2012-9-13
在线时间
33 小时
发表于 2013-1-17 15:53:01 | 显示全部楼层
延时消抖以后 还要再读一下吧..  要不消抖也没意义了..
回复 支持 反对

使用道具 举报

18

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
286
金钱
286
注册时间
2012-9-13
在线时间
33 小时
发表于 2013-1-17 16:20:12 | 显示全部楼层
关于 最后的  组合码  一般还要调整成0..15    我只会那个switch..  case     各位有什么简单的方法就 像一个 宏一样? 
回复 支持 反对

使用道具 举报

5

主题

69

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
374
金钱
374
注册时间
2014-2-13
在线时间
98 小时
发表于 2014-5-23 11:56:10 | 显示全部楼层
如果IO不是连续的,比如用的pb2-pb6,pG12-PG14,怎么处理?
回复 支持 反对

使用道具 举报

11

主题

200

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1154
金钱
1154
注册时间
2014-11-9
在线时间
228 小时
发表于 2016-6-22 18:44:42 | 显示全部楼层
写按键程序,延时我觉得一点不好,最好是定时器定时去扫描
回复 支持 反对

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2016-7-21
在线时间
6 小时
发表于 2016-7-21 12:45:17 | 显示全部楼层
你这个程序第三行没有用?  按键没反映  还是按键松没做检测
回复 支持 反对

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2016-7-21
在线时间
6 小时
发表于 2016-7-21 12:51:50 | 显示全部楼层
如果是使用PB3-PB10  你这个程序怎么改  而且我按照你的接口连接线  第三行没有用
回复 支持 反对

使用道具 举报

11

主题

179

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1103
金钱
1103
注册时间
2016-7-19
在线时间
168 小时
发表于 2016-11-20 12:38:39 | 显示全部楼层
学习了,
Delay_Nms(2);// 此延时比不可少
这个确实必须要,看了楼主的程序,我把这句加到我的程序,能够正确运行了。不过楼主为什么加了这句,就能够正确运行了?
回复 支持 反对

使用道具 举报

2

主题

4

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2017-7-19
在线时间
6 小时
发表于 2017-7-28 16:01:07 | 显示全部楼层
学习到啦 但为啥我的第四行不能用 而且返回的行值不对呢。。。一样的硬件 难道是状态翻转时的问题?
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2019-11-3
在线时间
5 小时
发表于 2020-12-7 10:16:16 | 显示全部楼层
求程序源码
1332543898@qq.com
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-23 11:55

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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