STM32矩阵键盘实现方法收集文档格式.docx
《STM32矩阵键盘实现方法收集文档格式.docx》由会员分享,可在线阅读,更多相关《STM32矩阵键盘实现方法收集文档格式.docx(17页珍藏版)》请在冰豆网上搜索。
GPIO_TypeDef*GPIO_x;
unsignedshortGPIO_pin;
};
staticstructio_portkey_output[4]={
{GPIOD,GPIO_Pin_0},{GPIOD,GPIO_Pin_1},
{GPIOD,GPIO_Pin_2},{GPIOD,GPIO_Pin_3}
staticstructio_portkey_input[4]={
{GPIOD,GPIO_Pin_4},{GPIOD,GPIO_Pin_5},
{GPIOD,GPIO_Pin_6},{GPIOD,GPIO_Pin_7}
unsignedcharkey[4][4];
voidkeyboard_init(void)
{
GPIO_InitTypeDefGPIO_InitStructure;
unsignedchari;
/*键盘行扫描输出线输出高电平*/
/*PA0PA1PA2PA3输出*/
=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
=GPIO_Mode_Out_PP;
=GPIO_Speed_50MHz;
GPIO_Init(GPIOD,&
GPIO_InitStructure);
/*键盘列扫描输入线键被按时输入高电平放开输入低电平*/
/*PA4PA5PA6PA7输入*/
=GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
=
GPIO_Mode_IPU;
for(i=0;
i<
4;
i++)
GPIO_SetBits(key_output[i].GPIO_x,key_output[i].GPIO_pin);
}
voidupdate_key(void)
unsignedchari,j;
i++)
PIO_x,key_output[i].GPIO_pin);
for(j=0;
j<
j++)
PIO_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|---line1PE6//
//---------------------------//
//|5|6|7|8|---line2PE5//
//|9|10|11|12|---line3PE4//
//|13|14|15|16|---line4PE3//
//|17|18|19|20|---line5PE2//
//||||//
//col1col2col3col4//
//PE0PB5PB8PB9//
//_________________________________________________//
参考了下基于avr的矩阵键盘程序,耐着性子移植到符合上面硬件规划的stm32板子上。
volatileuint8_tkey_flag=0;
voidkey_init(void)
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE|RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitTypeDefGPIO_InitStructure;
//keyoutput
=GPIO_Pin_0;
GPIO_Init(GPIOE,&
=GPIO_Pin_5|GPIO_Pin_8|GPIO_Pin_9;
GPIO_Init(GPIOB,&
//keyinput
=GPIO_Mode_IPU;
//上拉输入
=GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6;
//判断是否有键按下函数,对键盘进行一次扫描
//返回键盘接口状态,有键按下时返回键值;
没有键按下返回无效标志位
uint8_tIs_Key_PressOn(void)
volatileuint8_ti,ScanCode;
for(i=0;
i<
4;
i++)
switch(i)//扫描信号产生
case0:
GPIOE->
BSRR=0x00010000;
//PE0=0;
GPIOB->
BSRR=0x00000320;
//PB5=1;
PB8=1;
PB9=1;
key_flag=1;
break;
case1:
BSRR=0x00000001;
//PE0=1;
BSRR=0x00200300;
//PB5=0;
key_flag=2;
case2:
BSRR=0x01000220;
PB8=0;
key_flag=3;
case3:
BSRR=0x02000120;
PB9=0;
key_flag=4;
default:
key_flag=0;
break;
if((((uint8_t)GPIOE->
IDR)|0x83)!
=0xff)
return((uint8_t)GPIOE->
IDR|0x83);
return(PRESS_INVALID);
//找到闭合键,判断延时前后两次键值是否相同,如果相同则返回键值
uint8_tFind_Key_PressOn(uint8_tKeyCode_before,uint8_tKeyCode_after)
if(KeyCode_before==KeyCode_after)return(KeyCode_after);
elsereturn(PRESS_INVALID);
//计算键值,根据返回的键值计算相应的返回值
uint8_tCalc_Key_PressOn(uint8_tKeyCode)
uint8_tTempNum;
switch(KeyCode)
case0xBF:
if(1==key_flag)
TempNum=1;
elseif(2==key_flag)
TempNum=2;
elseif(3==key_flag)
TempNum=3;
elseif(4==key_flag)
TempNum=4;
elsebreak;
case0xDF:
TempNum=5;
TempNum=6;
TempNum=7;
TempNum=8;
case0xEF:
TempNum=9;
TempNum=10;
TempNum=11;
TempNum=12;
case0xF7:
TempNum=13;
TempNum=14;
TempNum=15;
TempNum=16;
case0xFB:
TempNum=17;
TempNum=18;
TempNum=19;
TempNum=20;
default:
TempNum=0;
//发生错