matrixkey.h头文件
#ifndef __MATRIXKEY_H
#define __MATRIXKEY_H
#include “sys.h”
#include “stm32f10x.h”
#define PortF (GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7)
#define KEY_0 GPIO_ReadInputDataBit(GPIOF,GPIO_Pin_0) //读取按键0
#define KEY_1 GPIO_ReadInputDataBit(GPIOF,GPIO_Pin_1)//读取按键1
#define KEY_2 GPIO_ReadInputDataBit(GPIOF,GPIO_Pin_2)//读取按键2
#define KEY_3 GPIO_ReadInputDataBit(GPIOF,GPIO_Pin_3)//读取按键0
#define KEY_4 GPIO_ReadInputDataBit(GPIOF,GPIO_Pin_4)//读取按键1
#define KEY_5 GPIO_ReadInputDataBit(GPIOF,GPIO_Pin_5)//读取按键2
#define KEY_6 GPIO_ReadInputDataBit(GPIOF,GPIO_Pin_6)//读取按键0
#define KEY_7 GPIO_ReadInputDataBit(GPIOF,GPIO_Pin_7)//读取按键1
//#define KEY_8 GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_4)//读取按键1
#define KEY0_PRES 1 //KEY0按下
#define KEY1_PRES 2 //KEY1按下
#define KEY2_PRES 3 //KEY2按下
#define KEY3_PRES 4 //KEY3按下
#define KEY4_PRES 5 //KEY4按下
#define KEY5_PRES 6 //KEY5按下
#define KEY6_PRES 7 //KEY6按下
#define KEY7_PRES 8 //KEY7按下
extern void NUM_Init(void);
u8 keyscan(void);
u8 key_handle(void);
void input_num(void);
#endif
matrixkey.c源文件
#include “stm32f10x.h”
#include “sys.h”
#include “delay.h”
#include “matrixkey.h”
#include “usart.h”
void NUM_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF,ENABLE);//使能GPIOA,PORTF时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;//KEY0-KEY3矩阵键盘的行
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //设置成推挽输出 GPIO_Mode_Out_OD
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;//KEY4-KEY7 矩阵键盘的行
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOF, &GPIO_InitStructure);
GPIO_SetBits(GPIOF,GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7);
}
u8 keyscan(void)
{
uint8_t LIE,HANG,k,i=0;
GPIO_Write(GPIOF, 0xF0); //D0-D3拉低 D4-D7拉高
if((GPIO_ReadInputData(GPIOF)&0xF0)!=0xF0) //有按键按下
{
delay_ms(40); //消抖
if((GPIO_ReadInputData(GPIOF)&0xF0)!=0xF0) //再次判断是否有按下
{
LIE=GPIO_ReadInputData(GPIOF); //读取按键按下后得到的代码
HANG=LIE; //将代码复制给行
LIE=~LIE; //将键码取反,如按下某个键得到0111 0000 取反得到1000 1111
LIE=LIE&0XF0; //得到列1000 1111&1111 0000得到1000 0000,得到列数
for(i=0;i<4&&((HANG&0xF0)!=0xF0);i++) //逐次将行拉高,判断列数中原来变低的位是否变高
{ //得到之前检测到低的列变高则退出
GPIO_Write(GPIOF, (HANG&0xF0)|(0x01<
}
u8 key_handle(void)
{
uint8_t key_1=0;
uint8_t i=1;
u16 keyz=0;
while(i)
{
keyz=keyscan();
if(keyz!=0)
{
switch(keyz)
{
case 0x11: PBout(5)=1;key_1=1;i–;break;
case 0x21: PEout(5)=0;key_1=2;i–;break;
case 0x41: PBout(5)=0;key_1=3;i–;break;
case 0x81: PEout(5)=1;key_1=‘a’;i–;break;
case 0x12: PBout(5)=1;key_1=4;i–;break;
case 0x22: PEout(5)=0;key_1=5;i–;break;
case 0x42: PBout(5)=0;key_1=6;i–;break;
case 0x82: PEout(5)=1;key_1=‘b’;i–;break;
case 0x14: PBout(5)=1;key_1=7,i–;break;
case 0x24: PEout(5)=0;key_1=8;i–;break;
case 0x44: PBout(5)=0;key_1=9,i–;break;
case 0x84: PEout(5)=1;key_1=‘c’;i–;break;
case 0x18: PBout(5)=1;key_1=’*’;i–;break;
case 0x28: PEout(5)=0;key_1=0;i–;break;
case 0x48: PBout(5)=0;key_1=’#’;i–;break;
case 0x88: PEout(5)=1;key_1=‘d’;i–;break;
default:break;
}
}
}
return key_1;
}
//获取按键输入
void input_num(void)
{
//long long int mn = 0;
int time[14]={0};
u16 adcx;
int year=0;
int mon=0;
int day=0;
int hour=0;
int min=0;
int sec=0;
//float fre;
int i = 0;
//long long int t = 10000000000000;
//获取14位输入
for(i=0; i<14; i++) {
adcx=key_handle();
time[i]=adcx;
printf("%d\r\n",time[i]);
//mn += adcx * t;
//t /= 10;
}
year=time[0]*1000+time[1]*100+time[2]*10+time[3];
mon=time[4]*10+time[5];
day=time[6]*10+time[7];
hour=time[8]*10+time[9];
min=time[10]*10+time[11];
sec=time[12]*10+time[13];
printf("%d\r\n",year);
printf("%d\r\n",mon);
printf("%d\r\n",day);
printf("%d\r\n",hour);
printf("%d\r\n",min);
printf("%d\r\n",sec);
//fre=mn/10.000; //»»ËãÒÔMHzΪµ¥Î»µÄƵÂÊÖµ
//°´#ºÅÍ˳ö
while(adcx!='#')
{
adcx=key_handle();
}
//return fre;
}