没有合适的资源?快使用搜索试试~ 我知道了~
STM32矩阵键盘实现方法收集[参照].pdf
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
8 浏览量
2021-10-12
00:47:26
上传
评论
收藏 291KB PDF 举报
STM32矩阵键盘实现方法收集[参照].pdf
资源推荐
资源详情
资源评论







STM32 用矩阵键盘,不带外部中断,可以多个按键同时按下
C 代码 : STM32 用矩阵键盘,不带外部中断,可以多个按键同时按下
/************** 矩阵键盘 .h 文件 *********************************/
#ifndef __COMMON_H
#define __COMMON_H
#include "stm32f10x.h"
/* 4*4 矩阵键盘 */
void keyboard_init(void);
void update_key(void);
extern unsigned char key[4][4];
#endif
/************** 矩阵键盘 .c 文件 *****************************/
#include "common.h"
struct io_port {
GPIO_TypeDef *GPIO_x;
unsigned short GPIO_pin;
};
static struct io_port key_output[4] = {
{GPIOD, GPIO_Pin_0}, {GPIOD, GPIO_Pin_1},
{GPIOD, GPIO_Pin_2}, {GPIOD, GPIO_Pin_3}
};
static struct io_port key_input[4] = {
{GPIOD, GPIO_Pin_4}, {GPIOD, GPIO_Pin_5},
{GPIOD, GPIO_Pin_6}, {GPIOD, GPIO_Pin_7}
};
unsigned char key[4][4];
void keyboard_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
unsigned char i;
/* 键盘行扫描输出线 输出高电平 */
/* PA0 PA1 PA2 PA3 输出 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOD, &GPIO_InitStructure);
/* 键盘列扫描输入线 键被按时输入高电平 放开输入低电平 */
/* PA4 PA5 PA6 PA7 输入 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOD, &GPIO_InitStructure);
for(i = 0; i < 4; i++)
{
GPIO_SetBits(key_output[i].GPIO_x, key_output[i].GPIO_pin);
}
}
void update_key(void)
{
unsigned char i, j;
for(i = 0; i < 4; i++) //i 是输出口,依次置低电平
{
GPIO_ResetBits(key_output[i].GPIO_x, key_output[i].GPIO_pin);
for(j = 0; j < 4; j++) //j 是输入口,当键按下时导通被置为低电平
{
if(GPIO_ReadInputDataBit(key_input[j].GPIO_x, key_input[j].GPIO_pin) == 0)
{
key[i][j] = 1;
}
else
{
key[i][j] = 0;
}
}
GPIO_SetBits(key_output[i].GPIO_x, key_output[i].GPIO_pin);
}
}

stm32 矩阵键盘
这是硬件上的键盘规划
// | 1 | 2 | 3 | 4 | ---line 1 PE6 //
// --------------------------- //
// | 5 | 6 | 7 | 8 | ---line 2 PE5 //
// --------------------------- //
// | 9 | 10| 11| 12| ---line 3 PE4 //
// --------------------------- //
// | 13| 14| 15| 16| ---line 4 PE3 //
// --------------------------- //
// | 17| 18| 19| 20| ---line 5 PE2 //
// --------------------------- //
// | | | | //
// col1 col2 col3 col4 //
// PE0 PB5 PB8 PB9 //
//_________________________________________________//
参考了下基于 avr 的矩阵键盘程序,耐着性子移植到符合上面硬件规划的 stm32 板子上。
volatile uint8_t key_flag = 0;
void key_init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE | RCC_APB2Periph_GPIOB,
ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
//key output
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_Init(GPIOE,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_8 | GPIO_Pin_9;
GPIO_Init(GPIOB,&GPIO_InitStructure);
//key input
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;// 上拉输入
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 |
GPIO_Pin_6;
GPIO_Init(GPIOE,&GPIO_InitStructure);
}
//判断是否有键按下函数,对键盘进行一次扫描
//返回键盘接口状态,有键按下时返回键值;没有键按下返回无效标志位
uint8_t Is_Key_PressOn(void)
{
volatile uint8_t i,ScanCode;
剩余14页未读,继续阅读
资源评论

czq131452007
- 粉丝: 0
- 资源: 12万+

下载权益

电子书特权

VIP文章

课程特权

开通VIP

上传资源 快速赚钱
我的内容管理 收起
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助

会员权益专享
安全验证
文档复制为VIP权益,开通VIP直接复制
