4*4键盘函数,STM32F103ZET6

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;

}

你可能感兴趣的:(4*4键盘函数,STM32F103ZET6)