当前位置:文档之家› STM32 矩阵键盘控制

STM32 矩阵键盘控制

// PA0~PA3行控制线
// PA4~PA7列控制线
#include <stm32f10x_lib.h>
#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]);
}。

相关主题