恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
STM32 4X4矩阵键盘 (可任意改变矩阵Map)
首页
资讯中心
/
STM32 4X4矩阵键盘 (可任意改变矩阵Map)
STM32 4X4矩阵键盘 (可任意改变矩阵Map)
发布时间:2026/9/28 6:00:48
可任意改变矩阵键盘Map的方法。比如键盘定义为u8 key_Map[] {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};若需要更改为u8 key_Map[] {4,2,7,1,5,11,3,16,14,10,6,12,13,9,15,8};则只需要更改数组就可方法如下。寄存器法“key.c” 文件/***********键盘初始化函数**********************/ void key_init(void){ GPIO_InitTypeDef GPIO_InitStruture; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF, ENABLE); //打开PF时钟 //定义PF4-PF7为上拉输入 分别定义为四列 GPIO_InitStruture.GPIO_Mode GPIO_Mode_IPU; GPIO_InitStruture.GPIO_Pin GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7; GPIO_InitStruture.GPIO_Speed GPIO_Speed_50MHz; GPIO_Init(GPIOF,GPIO_InitStruture); //定义PF0-PF3为推挽输出 分别定义为四行 GPIO_InitStruture.GPIO_Mode GPIO_Mode_Out_PP; GPIO_InitStruture.GPIO_Pin GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3; GPIO_Init(GPIOF,GPIO_InitStruture); } /***********键盘扫描函数**********************/ u16 key_count 0; //按键计数 u8 key_val 0; //采集到的键值 u8 key_Map[] { 1,2,3,4, 5,6,7,8, 9,10,11,12, 13,14,15,16}; //16个按键的键值数组 u8 KEY_SCAN_MATRIX(void) { u16 tmp; u8 row, col; u16 KEY_DOUT,tmp1, tmp2; tmp1 0x0008; GPIOF-ODR ((GPIOF-ODR0xfff0)|0x0000); tmp GPIO_ReadInputData(GPIOF); if((tmp 0x00f0) 0x00f0) //如果有键按下 { if(key_count0) { key_count1; for(row0; row4; row) //行扫描 { KEY_DOUT 0X000f; KEY_DOUT- tmp1; GPIOF-ODR((GPIOF-ODR0xfff0)|KEY_DOUT); tmp1 1; if((GPIO_ReadInputData(GPIOF)0x00f0) 0x00f0) { tmp2 0x0010; // 用于检测出哪一列为0 for(col0; col4; col) //列扫描 { if(0x00 (GPIO_ReadInputData(GPIOF) tmp2)) { key_val key_Map[row*4 col];//获取键值 return key_val; } tmp2 1; //左移1位 } } } } } else key_count 0; return 0xff; }