4*4键盘程序代码 基于STM32

4*4键盘程序代码 基于STM32

 

这是自己写的扫描第一行按键的程序代码。

PE的位8~位11设置为下拉输入。

PE的位12~位15设置为推挽输出

其中PE的位11是4*4键盘的第一列,PE的为键盘的第一行。

先将第一行设置为高电平,检测列中是否有高电平

u8 KEY_Scan(u8 mode)

{       

         staticu8 key_up=1;//按键按松开标志

         if(mode)key_up=1;  //支持连按

         GPIO_SetBits(GPIOE,GPIO_Pin_15);                 

         if(key_up&&( (GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_8)) 

                                     ||(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_9))

                                     ||(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_10))

                                     ||(GPIO_ReadInputDataBit(GPIOE,GPIO_Pin_11)) ) )

         {

                   delay_ms(10);//去抖动

                   key_up=0;

                   if(GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_8) )return 10;

      

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个基于STM32F103的4x4矩阵键盘程序的详细代码示例: ```c #include "stm32f10x.h" #include "stdio.h" GPIO_InitTypeDef GPIO_InitStructure; // 定义键盘矩阵的行和列 #define ROWS 4 #define COLS 4 // 定义行引脚和列引脚 GPIO_TypeDef* ROW_PORT[ROWS] = { GPIOA, GPIOA, GPIOA, GPIOA }; uint16_t ROW_PIN[ROWS] = { GPIO_Pin_0, GPIO_Pin_1, GPIO_Pin_2, GPIO_Pin_3 }; GPIO_TypeDef* COL_PORT[COLS] = { GPIOA, GPIOA, GPIOA, GPIOA }; uint16_t COL_PIN[COLS] = { GPIO_Pin_4, GPIO_Pin_5, GPIO_Pin_6, GPIO_Pin_7 }; // 定义键盘矩阵按键对应的字符 char keymap[ROWS][COLS] = { {'1', '2', '3', 'A'}, {'4', '5', '6', 'B'}, {'7', '8', '9', 'C'}, {'*', '0', '#', 'D'} }; void Delay(__IO uint32_t nCount) { for(; nCount != 0; nCount--); } void init_GPIO() { RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 配置行引脚为上拉输入模式 for(int i = 0; i < ROWS; i++) { GPIO_InitStructure.GPIO_Pin = ROW_PIN[i]; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_Init(ROW_PORT[i], &GPIO_InitStructure); } // 配置列引脚为推挽输出模式 for(int i = 0; i < COLS; i++) { GPIO_InitStructure.GPIO_Pin = COL_PIN[i]; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(COL_PORT[i], &GPIO_InitStructure); } } char read_keypad() { for(int i = 0; i < COLS; i++) { // 将当前列引脚置低电平 GPIO_ResetBits(COL_PORT[i], COL_PIN[i]); for(int j = 0; j < ROWS; j++) { // 读取当前行引脚状态 if(GPIO_ReadInputDataBit(ROW_PORT[j], ROW_PIN[j]) == Bit_RESET) { // 延时一段时间,防止按键抖动 Delay(10000); // 再次检查按键状态 if(GPIO_ReadInputDataBit(ROW_PORT[j], ROW_PIN[j]) == Bit_RESET) { // 按键按下,返回对应字符 return keymap[j][i]; } } } // 将当前列引脚恢复为高电平 GPIO_SetBits(COL_PORT[i], COL_PIN[i]); } // 没有按键按下,返回空字符 return '\0'; } int main(void) { init_GPIO(); while(1) { char key = read_keypad(); if(key != '\0') { printf("Pressed key: %c\r\n", key); } // 延时一段时间,防止按键重复检测 Delay(500000); } } ``` 这段代码使用了STM32F103的GPIO模块,通过设置行引脚为上拉输入模式和列引脚为推挽输出模式,实现了对4x4矩阵键盘的读取。通过对行引脚和列引脚逐个进行扫描,可以检测到按键的状态,并返回对应的字符。在主循环中,通过调用`read_keypad()`函数来读取按键,并将结果打印出来。 请注意,这只是一个示例代码,实际使用时可能需要根据具体的硬件连接和引脚配置进行适当的修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值