高级会员

- 积分
- 852
- 金钱
- 852
- 注册时间
- 2018-10-11
- 在线时间
- 69 小时
|
5金钱
老师布置的作业是编写矩阵键盘的代码
这个是自己写的逐行扫描的过程
第一次学习矩阵键盘,可能有不对的地方,希望大家指出
下面是代码
#include "stm32f10x.h"
#include "key.h"
#include "sys.h"
#include "delay.h"
void KEY_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF,ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;//行
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOF, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;//列
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//上拉输入,有按键按下则被拉低
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOF, &GPIO_InitStructure);
GPIO_SetBits(GPIOF,GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7);
}
/* 1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16 */
u8 KEY_Scan(void)//扫描函数
{
u8 KeyVal=0,i;
u16 Scan[4]={0x00fe,0x00fd,0x00fb,0x00f7};
if(i==4) i=0;
for(i=0;i<4;i++)
{
GPIO_Write(GPIOF,Scan);//1111 1110,1111 1101,1111 1011,1111 0111 逐行扫描
if( (GPIOF->IDR & 0x00F0) != 0x00F0) //有按键按下 Pin_4到Pin_7之间存在按键按下被拉低的情况
{
delay_ms(10);//去抖动
switch(GPIOF->IDR & 0x00FF)
{
case 0x00EE: KeyVal=1; break; //1110 1110 第一行 第一列
case 0x00DE: KeyVal=2; break; //1101 1110 第一行 第二列
case 0x00BE: KeyVal=3; break; //1011 1110 第一行 第三列
case 0x007E: KeyVal=4; break; //0111 1110 第一行 第四列
case 0x00ED: KeyVal=5; break; //1110 1101 第二行 第一列
case 0x00DD: KeyVal=6; break; //1101 1101 第二行 第二列
case 0x00BD: KeyVal=7; break; //1011 1101 第二行 第三列
case 0x007D: KeyVal=8; break; //0111 1101 第二行 第四列
case 0x00EB: KeyVal=9; break; //1110 1011 第三行 第一列
case 0x00DB: KeyVal=10; break; //1101 1011 第三行 第二列
case 0x00BB: KeyVal=11; break; //1011 1011 第三行 第三列
case 0x007B: KeyVal=12; break; //0111 1011 第三行 第四列
case 0x00E7: KeyVal=13; break; //1110 0111 第四行 第一列
case 0x00D7: KeyVal=14; break; //1101 0011 第四行 第二列
case 0x00B7: KeyVal=15; break; //1011 0111 第四行 第三列
case 0x0077: KeyVal=16; break; //0111 0111 第四行 第四列
}
while( (GPIOF->IDR & 0x00F0) != 0x00F0 )//松手检测
{
delay_ms(1);
}
return KeyVal;
}
}
return 0;
}
|
|