|
写个矩阵键盘发现stm32全是函数,看到帖子上的方案,感觉不错,特此转发。
希望对需要的人有个参考!
以下是作者的介绍:
stm32f103ze蜘蛛版上6*6矩阵键盘程序的改进
hohai_abc 发表于: 2009-9-15 11:09 来源: IC开发网
这是上个版本的改进,经过改进后可以检测几个键盘一起按下的效果,可以制作像电脑一样的三键一起按重启的效果。
下面是common.h文件内容
#ifndef __COMMON_H
#define __COMMON_H
#include "stm32f10x.h"
/* 6*6矩阵键盘 */
void keyboard_init(void);
void update_key(void);
extern unsigned char key[6][6];
#include "common.h"
struct io_port {
GPIO_TypeDef *GPIO_x;
unsigned short GPIO_pin;
};
static struct io_port key_output[6] = {
{GPIOB, GPIO_Pin_9}, {GPIOB, GPIO_Pin_8},
{GPIOB, GPIO_Pin_7}, {GPIOB, GPIO_Pin_6},
{GPIOB, GPIO_Pin_5}, {GPIOG, GPIO_Pin_15}
};
static struct io_port key_input[6] = {
{GPIOG, GPIO_Pin_14}, {GPIOG, GPIO_Pin_13},
{GPIOG, GPIO_Pin_11}, {GPIOG, GPIO_Pin_9},
{GPIOD, GPIO_Pin_7}, {GPIOD, GPIO_Pin_6}
};
unsigned char key[6][6];
void keyboard_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
unsigned char i;
/* 键盘扫描输出线 输出低电平 */
/* PB9 PB8 PB7 PB6 PB5 PG15 输出*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_8 | GPIO_Pin_7 | GPIO_Pin_6 | GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOG, &GPIO_InitStructure);
/* 键盘扫描输入线 键被按时输入低电平 放开输入高电平 */
/* PG14 PG13 PG11 PG9 PD7 PD6 输入*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14 | GPIO_Pin_13 | GPIO_Pin_11 | GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOG, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOD, &GPIO_InitStructure);
for(i = 0; i < 6; i++)
{
GPIO_ResetBits(key_output.GPIO_x, key_output.GPIO_pin);
}
}
void update_key(void)
{
unsigned char i, j;
for(i = 0; i < 6; i++)
{
GPIO_SetBits(key_output.GPIO_x, key_output.GPIO_pin);
for(j = 0; j < 6; j++)
{
if(GPIO_ReadInputDataBit(key_input[j].GPIO_x, key_input[j].GPIO_pin) == 1)
{
key【i】【j】 = 1; //这里用【】代替[],因为论坛不好显示。
}else{
key【i】【j】 = 0;
}
}
GPIO_ResetBits(key_output.GPIO_x, key_output.GPIO_pin);
}
}
使用键盘就用TIM2设置成150ms一个周期运行下update_key();
然后接下来直接读取key[x][y]的值判断按键是否被按下。
if(key[5][5] == 1) 单键按下
{
do_something();
}
if((key[0][0] == 1) && (key[0][1] == 1) && (key[0][2] == 1)) 多键按下
{
do_something();
} |
阿莫论坛20周年了!感谢大家的支持与爱护!!
月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!
|