TA的每日心情 | 开心 2017-6-17 09:42 |
---|
签到天数: 3 天 连续签到: 1 天 [LV.2]偶尔看看I
|
玩GD32F450那些事之4x4薄片矩阵按键
一、前言 好久没有出来写贴子了,这上一个月还真忙,每天不是焊板子就是在调代码,还好上个月四套作品成功的完成了。。。一看时间擦擦擦!爱板也要交作品了,工作人员都催了几通了,但不要急哦!东西都构思好了,淘宝买了一个模块,正在坐等快递啦!不过今天先抽点时间来发一个基础点的--4x4矩阵键盘。
二、薄片4x4薄片矩阵键盘 薄膜4×4矩阵键盘,我想很多朋友玩C51时定然玩过,可能到了STM32时也有部分人玩过,昨天看GD32F450中没人写这个,我就补个漏,大家别嫌弃哦。下面图1是实物图,图2为内部电路图
图1 实物图
图2 内部电路图 正如图中所示,该矩阵键盘和其它的矩阵键盘没啥两样,8根线来控制,其中 1,2,3,4定义为低4位,5,6,7,8位定义为高4位。该矩阵键盘和板子的链接正如图2所示。 1-->PE15, 2-->PE13, 3-->PE12, 4-->PE11, 5-->PE10, 6-->PE9, 7-->PE8, 8-->PE7 三、代码 1、引脚初始化
- <font size="4">void BT4x4_gpio_config(void)
- {
- /* enable the BT clock */
- rcu_periph_clock_enable(RCU_GPIOE);
- /* configure BT GPIO port PE0 PE1*/
- gpio_mode_set(GPIOE, GPIO_MODE_INPUT, GPIO_PUPD_NONE,GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_15);
- gpio_mode_set(GPIOE, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE,GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10);
- gpio_output_options_set(GPIOE, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ,GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10);
- }</font>
复制代码 2、键值检测
本套代码的设计是将高4位循环的给低电平,其它位给高电平,这时去读低四位的状态,比如说当我们的第8位给高,这时高四位就为 1110,这时读到低四位是0111,很明显是第4个按键按下了,对应的矩阵键盘是“D”。具体实现见下面代码:
- <font size="4">uint16_t Read4x4Hinght(void)
- {
- uint16_t Data=0;
- uint16_t keynumble=20;
- gpio_bit_set(GPIOE,GPIO_PIN_10|GPIO_PIN_9|GPIO_PIN_8);
- gpio_bit_reset(GPIOE,GPIO_PIN_7);
- delay_1ms(1);
- Data = (gpio_input_bit_get(GPIOE, GPIO_PIN_11)<<3)|(gpio_input_bit_get(GPIOE, GPIO_PIN_12)<<2)|\
- (gpio_input_bit_get(GPIOE, GPIO_PIN_13)<<1)|(gpio_input_bit_get(GPIOE, GPIO_PIN_15)<<0);
- if(Data!=0x0f)
- {
- delay_1ms(1);
- Data = (gpio_input_bit_get(GPIOE, GPIO_PIN_11)<<3)|(gpio_input_bit_get(GPIOE, GPIO_PIN_12)<<2)|\
- (gpio_input_bit_get(GPIOE, GPIO_PIN_13)<<1)|(gpio_input_bit_get(GPIOE, GPIO_PIN_15)<<0);
- if(Data!=0x0f)
- {
- switch(Data)
- {
- case 0x07: keynumble = 13;//D
- break;
- case 0x0b: keynumble = 12;//C
- break;
- case 0x0d: keynumble = 11;//B
- break;
- case 0x0e: keynumble = 10;//A
- break;
- default:
- break;
- }
- while(Data!=0x0f)
- {
- Data = (gpio_input_bit_get(GPIOE, GPIO_PIN_11)<<3)|(gpio_input_bit_get(GPIOE, GPIO_PIN_12)<<2)|\
- (gpio_input_bit_get(GPIOE, GPIO_PIN_13)<<1)|(gpio_input_bit_get(GPIOE, GPIO_PIN_15)<<0);
- }
- return keynumble;
- }
- }
- gpio_bit_set(GPIOE,GPIO_PIN_10|GPIO_PIN_9|GPIO_PIN_7);
- gpio_bit_reset(GPIOE,GPIO_PIN_8);
- Data = (gpio_input_bit_get(GPIOE, GPIO_PIN_11)<<3)|(gpio_input_bit_get(GPIOE, GPIO_PIN_12)<<2)|\
- (gpio_input_bit_get(GPIOE, GPIO_PIN_13)<<1)|(gpio_input_bit_get(GPIOE, GPIO_PIN_15)<<0);
- if(Data!=0x0f)
- {
- delay_1ms(1);
- Data = (gpio_input_bit_get(GPIOE, GPIO_PIN_11)<<3)|(gpio_input_bit_get(GPIOE, GPIO_PIN_12)<<2)|\
- (gpio_input_bit_get(GPIOE, GPIO_PIN_13)<<1)|(gpio_input_bit_get(GPIOE, GPIO_PIN_15)<<0);
- if(Data!=0x0f)
- {
- switch(Data)
- {
- case 0x07: keynumble = 14;//#
- break;
- case 0x0b: keynumble = 9;
- break;
- case 0x0d: keynumble = 6;//11
- break;
- case 0x0e: keynumble = 3;//14
- break;
- default:
- break;
- }
- while(Data!=0x0f)
- {
- Data = (gpio_input_bit_get(GPIOE, GPIO_PIN_11)<<3)|(gpio_input_bit_get(GPIOE, GPIO_PIN_12)<<2)|\
- (gpio_input_bit_get(GPIOE, GPIO_PIN_13)<<1)|(gpio_input_bit_get(GPIOE, GPIO_PIN_15)<<0);
- }
- return keynumble;
- }
- }
- gpio_bit_set(GPIOE,GPIO_PIN_10|GPIO_PIN_8|GPIO_PIN_7);
- gpio_bit_reset(GPIOE,GPIO_PIN_9);
- Data = (gpio_input_bit_get(GPIOE, GPIO_PIN_11)<<3)|(gpio_input_bit_get(GPIOE, GPIO_PIN_12)<<2)|\
- (gpio_input_bit_get(GPIOE, GPIO_PIN_13)<<1)|(gpio_input_bit_get(GPIOE, GPIO_PIN_15)<<0);
- if(Data!=0x0f)
- {
- delay_1ms(1);
- Data = (gpio_input_bit_get(GPIOE, GPIO_PIN_11)<<3)|(gpio_input_bit_get(GPIOE, GPIO_PIN_12)<<2)|\
- (gpio_input_bit_get(GPIOE, GPIO_PIN_13)<<1)|(gpio_input_bit_get(GPIOE, GPIO_PIN_15)<<0);
- if(Data!=0x0f)
- {
- switch(Data)
- {
- case 0x07: keynumble = 0;//2
- break;
- case 0x0b: keynumble = 8;//7
- break;
- case 0x0d: keynumble = 5;//5
- break;
- case 0x0e: keynumble = 2;//15
- break;
- default:
- break;
- }
- while(Data!=0x0f)
- {
- Data = (gpio_input_bit_get(GPIOE, GPIO_PIN_11)<<3)|(gpio_input_bit_get(GPIOE, GPIO_PIN_12)<<2)|\
- (gpio_input_bit_get(GPIOE, GPIO_PIN_13)<<1)|(gpio_input_bit_get(GPIOE, GPIO_PIN_15)<<0);
- }
- return keynumble;
- }
- }
- gpio_bit_set(GPIOE,GPIO_PIN_9|GPIO_PIN_8|GPIO_PIN_7);
- gpio_bit_reset(GPIOE,GPIO_PIN_10);
- Data = (gpio_input_bit_get(GPIOE, GPIO_PIN_11)<<3)|(gpio_input_bit_get(GPIOE, GPIO_PIN_12)<<2)|\
- (gpio_input_bit_get(GPIOE, GPIO_PIN_13)<<1)|(gpio_input_bit_get(GPIOE, GPIO_PIN_15)<<0);
- if(Data!=0x0f)
- {
- delay_1ms(2);
- Data = (gpio_input_bit_get(GPIOE, GPIO_PIN_11)<<3)|(gpio_input_bit_get(GPIOE, GPIO_PIN_12)<<2)|\
- (gpio_input_bit_get(GPIOE, GPIO_PIN_13)<<1)|(gpio_input_bit_get(GPIOE, GPIO_PIN_15)<<0);
- if(Data!=0x0f)
- {
- switch(Data)
- {
- case 0x07: keynumble = 15;//*
- break;
- case 0x0b: keynumble = 7;//8
- break;
- case 0x0d: keynumble = 4;//9
- break;
- case 0x0e: keynumble = 1;//16
- break;
- default:
- break;
- }
- while(Data!=0x0f)
- {
- Data = (gpio_input_bit_get(GPIOE, GPIO_PIN_11)<<3)|(gpio_input_bit_get(GPIOE, GPIO_PIN_12)<<2)|\
- (gpio_input_bit_get(GPIOE, GPIO_PIN_13)<<1)|(gpio_input_bit_get(GPIOE, GPIO_PIN_15)<<0);
- }
- return keynumble;
- }
- }
- return keynumble;
- }</font>
复制代码 3、键值串口打印
通过高4位一位一位的轮流给低电平,然后读取对应状态下的低四位的结果来获取键值,不过这薄片键盘上存在“#”,“*”等符号,我们需要进一步处理后,再做串口显示,其代码如下: - <font size="4">if(keychar!=20)
- {
- if(keychar<10)
- {
- printf("keynumble=%d\t\n",keychar);
- }
- else
- {
- switch (keychar)
- {
- case 10:printf("keynumble=A\t\n");
- break;
- case 11:printf("keynumble=B\t\n");
- break;
- case 12:printf("keynumble=C\t\n");
- break;
- case 13:printf("keynumble=D\t\n");
- break;
- case 14:printf("keynumble=#\t\n");
- break;
- case 15:printf("keynumble=*\t\n");
- break;
- default:
- break;
- }
- }</font>
复制代码 到此矩阵键盘就实现了哦!!!其中串口部分配置大家看论坛分享或者直接下载我的代码。
四、实战演练
轮流按下矩阵键盘上的16个键,串口一一显示对应的键值。
五、附件
代码奉上,由于写地匆忙,有很多地方完全可以精简和浓缩,就请大家自行优化下;对于其中的按键消抖和等待按下松开,大家按照自己实际硬件按键来调,因为硬件不同可能延迟时间上会有些差异。
Key4x4.rar
(1019.39 KB, 下载次数: 24, 售价: 2 与非币)
|
|