目录
1.矩阵键盘简介
2.原理描述
3.代码编写
4.自我总结
此处我们采用4*4的矩阵键盘,需要8个端口与单片机连接
4个控制行,4个控制列
很多人不清楚八个引脚怎么连接,这里我采取PD0-PD7
PD0-PD3控制1-4行,PD4-PD7控制1-4列
如何确定我们按下的是哪个按键呢?
一.确定列值
1.将PD0-PD3作为输出,PD4-PD7作为输入,
2.输入均配置为上拉,即都为1,输出均拉低,即为0
3.当按下某个按键后,将该按键所连接的列置0,例如按下S1
二.确定行值
1.将PD0-PD3作为输入,PD4-PD7作为输出,
2.输入均配置为上拉,即都为1,输出均拉低,即为0
3.当按下某个按键后,将该按键所连接的行置0,例如按下S1
第一张图可知:(列值) col=0x1110_0000,即col=0xe0
第二张图可知:(行值) row=0x0000_1110,即row=0x0e
综合起来就得到了按键S1对应的键值:res=col|row=0xee
其余所有按键均按此逻辑推得
大体思路就是建立一个Key模块,包含Key.c和Key.h,最后在main里调用即可
key.c
#include "stm32f10x.h" // Device header
#include "Delay.h"
void Key_Init1(void){
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
//PD0,1,2,3作为输出,PD4,5,6,7作为输入,且上拉,默认为1
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOD,&GPIO_InitStructure);
//0,1,2,3置低电位,即0
GPIO_ResetBits(GPIOD,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3);
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOD,&GPIO_InitStructure);
}
void Key_Init2(void){
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);
//PD0,1,2,3作为输入,且上拉,默认为1;PD4,5,6,7作为输出,且置0
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOD,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOD,&GPIO_InitStructure);
GPIO_ResetBits(GPIOD,GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7);
}
uint16_t Key_Scan(void){
uint16_t row,col,res;//row为行值,col为列值,res=row|col,用于主函数判断
Key_Init1();//此时PD7...PD0为0x11110000,即0xf0
col=GPIO_ReadInputData(GPIOD); //读取上面的0xf0
col=col&0xf0;//没有任何按键按下那么col必然与0xf0相等
if(col!=0xf0)//说明可能有按键按下,需要消除抖动,进一步确定
{
Delay_ms(20);//消除抖动
col=GPIO_ReadInputData(GPIOD);
col=col&0xf0;
if(col!=0xf0)//若还是不相等,表示必然有按键按下
{
col=GPIO_ReadInputData(GPIOD);
col=col&0xf0;//如果S1按下,那此处就是0xe0&0xf0=0xe0
}
Key_Init2();//此时PD7...PD0为0x00001111,即0x0f
row=GPIO_ReadInputData(GPIOD);//读取上面的0x0f
row=row&0x0f;//没有任何按键按下那么row必然与0x0f相等
if(row!=0x0f)//说明可能有按键按下,需要消除抖动,进一步确定
{
Delay_ms(20);//消除抖动
row=GPIO_ReadInputData(GPIOD);
row=row&0x0f;
if(row!=0x0f)//若还是不相等,表示必然有按键按下
{
row=GPIO_ReadInputData(GPIOD);
row=row&0x0f;//若S1按下,那此处就是0x0e&0x0f=0x0e
}
res=row|col;//0xe0|0x0e=0xee,表示按键S1对应的键值为0xee
}
}
return res;
}
key.h
#ifndef __KEY_H
#define __KEY_H
void Key_Init1(void);//获取列值
void Key_Init2(void);//获取行值
uint16_t Key_Scan(void);//获取按键值
#endif
main文章来源:https://www.toymoban.com/news/detail-568816.html
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "Key.h"
uint16_t keyValue=0;
int main(void)
{
while(1)
{
keyValue=Key_Scan();//获取按键的键值
switch(keyValue) //根据键值确定按下的按钮
{
case 0xee:/**待调用函数**/;break;
case 0xde:;break;
case 0xbe:;break;
case 0x7e:;break;
case 0xed:;break;
case 0xdd:;break;
case 0xbd:;break;
case 0x7d:;break;
case 0xeb:;break;
case 0xdb:;break;
case 0xbb:;break;
case 0x7b:;break;
case 0xe7:;break;
case 0xd7:;break;
case 0xb7:;break;
case 0x77:;break;
default:break;
}
}
}
学习单片机的外设时,需要了解该外设的结构,原理,如何驱动该外设
我在学习矩阵键盘的过程中,也是屡次试错,有时候是线接的不对,有时候是代码写的不对,不过我也在一次一次试错中找到了正确的解,希望大家在学习的过程中敢于试错,不断练习,善于总结,我们下期见!文章来源地址https://www.toymoban.com/news/detail-568816.html
到了这里,关于【STM32-矩阵键盘】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!