矩阵键盘驱动代码

这篇博客分享了关于STM32单片机使用C语言实现矩阵键盘的驱动代码,提供基本思路,适合需要进行键盘驱动移植的读者。详细代码包含在key.c和key.h两个文件中。

此代码仅提供了代码思路,具体移植应用可以私信博主。

key.c:

#include "stm32f10x.h"
#include "key.h"
#include "led.h"
#include "sys.h" 
#include "delay.h"

u16 keyz=0;

void KEY_Init(void) 
{ 
 	GPIO_InitTypeDef GPIO_InitStructure;
 	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,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(GPIOC, &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(GPIOC, &GPIO_InitStructure);	
}

u8 keyscan(void)
{ 
	uint8_t LIE,HANG,k,i=0;
	
	GPIO_Write(GPIOC, 0xF0);                           
	if((GPIO_ReadInputData(GPIOC)&0xF0)!=0xF0)          
	{
	  delay_ms(40);                                     
	   if((GPIO_ReadInputData(GPIOC)&0xF0)!=0xF0)       
	   {
		   LIE=GPIO_ReadInputData(GPIOC);                
		   HANG=LIE;                                     
		   LIE=~LIE;                                     
		   LIE=LIE&0XF0;                                  
		   
			 for(i=0;i<4&&((HANG&0xF0)!=0xF0);i++)         
		   {                                              
		       GPIO_Write(GPIOC, (HANG&0xF0)|(0x01<<i));  
		       HANG=GPIO_ReadInputData(GPIOC);            		   
		   }
		   HANG&=0x0F;                                  
		   k=LIE|HANG;                                   
			 
			 
			 
		   GPIO_Write(GPIOC, 0xF0);                       
	     while((GPIO_ReadInputData(GPIOC)&0xF0)!=0xF0)  
		   {
		        delay_ms(40);                             
		   }
		   return k;                                     
	   }
	}	
	return (0);                                        
}

u8 keyhandle(void)
{ 
	uint8_t key_1=0;
	
	keyz=keyscan();
	if(keyz!=0)
		{ 
			switch(keyz)
			{
				case 0x11: key_1=1;break; 
				case 0x21: key_1=5;break; 
				case 0x41: key_1=9;break; 
				case 0x81: key_1=13;break; 
				case 0x12: key_1=2;break; 
				case 0x22: key_1=6;break; 
				case 0x42: key_1=10;break; 
				case 0x82: key_1=14;break;
				case 0x14: key_1=3;break;
				case 0x24: key_1=7;break;
        case 0x44: key_1=11;break;	
		    case 0x84: key_1=15;break;				
				case 0x18: key_1=4;break;
				case 0x28: key_1=8;break;
        case 0x48: key_1=12;break;	
		    case 0x88: key_1=16;break;		
				default:break;
			}
		
	}
	return key_1;
}

key.h:

#ifndef __KEY_H
#define __KEY_H	 
#include "sys.h"

#define  PortD   (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 KEY0  GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_0)
#define KEY1  GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_1)
#define KEY2  GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_2)
#define KEY3  GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_3)
#define KEY4  GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_4)
#define KEY5  GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_5)
#define KEY6  GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_6)
#define KEY7  GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_7)

#define KEY0_PRES 1	
#define KEY1_PRES	2	
#define KEY2_PRES	3	
#define KEY3_PRES 4	
#define KEY4_PRES	5	
#define KEY5_PRES	6	
#define KEY6_PRES 7	
#define KEY7_PRES	8	

void KEY_Init(void);
u8 keyscan(void);
u8 keyhandle(void);

#endif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值