【STM32】4*4矩阵键盘扫描程序(扫描方式)

由于买的最小系统开发板只有一个按键感觉不大方便调试和搞其他东东,所以又在某宝买了一个4*4矩阵键盘拓展一下按键哈。能力有限,参照之前学的51单片机例程写了份简单粗暴型的按键扫描程序,如需在大项目中使用还是得用中断来处理比较好~
点击下载源码

矩阵键盘实物和原理图


图中厂家给的图应该标错了序号,从左到右是S1-S4、S5-S8、S9-S12、S13-S16为一行,小伙伴们自行理会啦。

总体思路:先向矩阵的4行输出低电平,然后检测4列的输入,若为’0’的那列即该列有按键按下;接着向列输出高电平,检测行输入,若为’1’的那行即为按键在该列的位置,从而确定按键所在的某列某行了。(先检测行再检测列也是可以的)

void KEY1_Init(void)
{
   
   GPIO_InitTypeDef GPIO_InitStructure;
   RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE);//使能GPIOA、B
   GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;//上拉输入  
   GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_10|GPIO_Pin_11;  
   GPIO_Init(GPIOB,&GPIO_InitStructure); 
   GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;        //推挽输出
   GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;      
   GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
   GPIO_Init(GPIOA,&GPIO_InitStructure);       
   GPIO_ResetBits(GPIOA,GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7); //行输出低电平,扫描列
}
void KEY2_Init(void)
{
   
   GPIO_InitTypeDef GPIO_InitStructure;
   RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE);

	
   GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;        //推挽输出
   GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
   GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_10;
   GPIO_Init(GPIOB,&GPIO_InitStructure);
我可以为您提供一个简单的STM32 4 * 4矩阵键盘扫描程序的示例代码。请注意,此代码并未进行实际测试,也可能需要进行一些自定义修改以适应您的特定硬件设置。 #include "stm32f10x.h" int main(void) { /* Enable GPIOC clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); /* Configure PC0-PC3 as outputs (rows) */ GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStruct); /* Configure PC4-PC7 as inputs (columns) */ GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPD; GPIO_Init(GPIOC, &GPIO_InitStruct); /* Initialize variables */ uint16_t keys[4][4] = {{1, 2, 3, 10}, {4, 5, 6, 11}, {7, 8, 9, 12}, {14, 0, 15, 13}}; uint8_t row_pins[4] = {GPIO_Pin_0, GPIO_Pin_1, GPIO_Pin_2, GPIO_Pin_3}; uint8_t col_pins[4] = {GPIO_Pin_4, GPIO_Pin_5, GPIO_Pin_6, GPIO_Pin_7}; uint8_t row, col; /* Main loop */ while (1) { /* Scan each row */ for (row = 0; row < 4; row++) { /* Set row pin high */ GPIO_SetBits(GPIOC, row_pins[row]); /* Check each column */ for (col = 0; col < 4; col++) { /* If column pin is low, key is pressed */ if (GPIO_ReadInputDataBit(GPIOC, col_pins[col]) == Bit_RESET) { uint16_t key = keys[row][col]; /* TODO: handle key press */ } } /* Set row pin low */ GPIO_ResetBits(GPIOC, row_pins[row]); } } } 希望这段代码能对您有所帮助!
评论 74
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Yeah__binbin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值