STM32 矩阵键盘控制
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
// PA0~PA3行控制线
// PA4~PA7列控制线
#include
#include "Delay.h"
#include "key_4x4.h"
#define KEY_X (0X0F << 0)
#define KEY_Y (0XF0 << 0)
unsigned char const Key_Tab[4][4]=//键盘编码表
{
{'D','C','B','A'},
{'#','9','6','3'},
{'0','8','5','2'},
{'*','7','4','1'}
};
//没有得到键值返回0,否则返回相应的键值
unsigned char Get_KeyValue(void)
{//使用线反转法
u8 i=5,j=5;
u16 temp1,temp2;
RCC->APB2ENR|=1<<2; //使能PORTA时钟
RCC->APB2ENR|=1<<0; //开启辅助时钟
AFIO->MAPR&=0XF8FFFFFF; //清除MAPR的[26:24]AFIO->MAPR|=0X04000000; //关闭JTAG
GPIOA->CRL&=0XFFFF0000;
GPIOA->CRL|=0X00003333; //PA0~PA3 推挽输出
GPIOA->CRL&=0X0000FFFF; //PA4~PA7 输入
GPIOA->CRL|=0X44440000; //PA4~PA7默认上拉
GPIOA->ODR&=~KEY_X ; //PA0~PA3置0
if(((GPIOA->IDR >> 4) & 0X0F)<0x0f) // 读取PA12~PA15的值{
delay_ms(70); //按键消抖
if((GPIOA->IDR >>4 & 0x0f)<0x0f)
temp1=(GPIOA->IDR >>4 & 0x0f);
switch(temp1)
{
case 0x0e:j=0;break;
case 0x0d:j=1;break;
case 0x0b:j=2;break;
case 0x07:j=3;break;
default:break;
}
}
GPIOA->CRL&=0X0000FFFF;
GPIOA->CRL|=0X33330000; //PA4~PA7 推挽输出
GPIOA->CRL&=0XFFFF0000; //PA0~PA3 输入GPIOA->CRL|=0X00004444; //PA0~PA4 默认下拉
GPIOA->ODR&=~KEY_Y; //PA4~PA7置0
if((GPIOA->IDR & 0x0f)<0x0f)
{
temp2=(GPIOA->IDR & 0x0f);
switch(temp2)
{
case 0x0e:i=0;break;
case 0x0d:i=1;break;
case 0x0b:i=2;break;
case 0x07:i=3;break;
default:break;
}
}
if((i==5)||(j==5))
return 0;
else
return (Key_Tab[i][j]);
}