STM32矩阵键盘实现方法收集文档格式.docx

上传人:b****3 文档编号:15069005 上传时间:2022-10-27 格式:DOCX 页数:17 大小:18.63KB
下载 相关 举报
STM32矩阵键盘实现方法收集文档格式.docx_第1页
第1页 / 共17页
STM32矩阵键盘实现方法收集文档格式.docx_第2页
第2页 / 共17页
STM32矩阵键盘实现方法收集文档格式.docx_第3页
第3页 / 共17页
STM32矩阵键盘实现方法收集文档格式.docx_第4页
第4页 / 共17页
STM32矩阵键盘实现方法收集文档格式.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

STM32矩阵键盘实现方法收集文档格式.docx

《STM32矩阵键盘实现方法收集文档格式.docx》由会员分享,可在线阅读,更多相关《STM32矩阵键盘实现方法收集文档格式.docx(17页珍藏版)》请在冰豆网上搜索。

STM32矩阵键盘实现方法收集文档格式.docx

 

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;

//发生错

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学 > 天文地理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1