STM32 矩阵键盘控制

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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]);

}

相关文档
最新文档