STM32矩阵键盘代码

  • Post author:
  • Post category:其他


key_board.c文件

#include "stm32f10x.h"                  // Device header
#include "key_board.h"  
#include "Delay.h"                  // Device header
 
//引脚分配
#define KeyScan_C1    GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0)
#define KeyScan_C2    GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1)
#define KeyScan_C3    GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_10)
#define KeyScan_C4    GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11)
#define KeyScan_R1    GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_7)
#define KeyScan_R2    GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_6)
#define KeyScan_R3    GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_5)
#define KeyScan_R4    GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_4)

void KEY1_Board_Init(void)
{
   GPIO_InitTypeDef GPIO_InitStructure;
	
   RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE);
   GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
   GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_11|GPIO_Pin_10; 
   GPIO_Init(GPIOB,&GPIO_InitStructure); 
	
	
   GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;      
   GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;      
   GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
   GPIO_Init(GPIOA,&GPIO_InitStructure);       
   GPIO_ResetBits(GPIOA,GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7); 
}
void KEY2_Board_Init(void)
{
   GPIO_InitTypeDef GPIO_InitStructure;
   RCC_APB2PeriphClockCmd (RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE);
 
 
   GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;     
   GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
   GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1|GPIO_Pin_0|GPIO_Pin_11|GPIO_Pin_10;
   GPIO_Init(GPIOB,&GPIO_InitStructure);
   GPIO_SetBits(GPIOB,GPIO_Pin_1|GPIO_Pin_0|GPIO_Pin_11|GPIO_Pin_10);  
	
   GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPD;  
   GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
	 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
   GPIO_Init(GPIOA,&GPIO_InitStructure);  
}
int KeyScan(void)
{
 u8 column=0;
u8 KeyValue=0;
   KEY1_Board_Init();    
	
  if( KeyScan_C4==0)
  {
   Delay_ms(50);
   if( KeyScan_C4==0)
   {
    column=4;     
   }
  }
  if( KeyScan_C3==0)
  {
   Delay_ms(50);
  if( KeyScan_C3==0)
   {
    column=3;      
   }
  }
   if( KeyScan_C2==0)
  {
   Delay_ms(50);
    if( KeyScan_C2==0)
   {
    column=2;     
   }
  }
  if( KeyScan_C1==0)
  {
   Delay_ms(50);
    if( KeyScan_C1==0)
   {
    column=1;       
   }
  }  
  if(column==1)  
  {
     KEY2_Board_Init();             
     if( KeyScan_R1==1)
     {
      KeyValue=1; 
			 
     }
     if( KeyScan_R2==1)
     {
      KeyValue=5;
   
     }
     if( KeyScan_R3==1)
     {
      KeyValue=9;
  
     }
     if( KeyScan_R4==1)
     {
      KeyValue=13;
    
     }
    
  } 
	
		
  
if(column==2)  
  {
     KEY2_Board_Init();       
     if( KeyScan_R1==1)
     {
      KeyValue=2;  
     }
     if( KeyScan_R2==1)
     {
      KeyValue=6;
   
     }
     if( KeyScan_R3==1)
     {
      KeyValue=10;
  
     }
     if( KeyScan_R4==1)
     {
      KeyValue=14;
    
     }
    
  } 
	
	
	if(column==3)  
  {
     KEY2_Board_Init();           
     if( KeyScan_R1==1)
     {
      KeyValue=3;  
     }
     if( KeyScan_R2==1)
     {
      KeyValue=7;
   
     }
     if( KeyScan_R3==1)
     {
      KeyValue=11;
  
     }
     if( KeyScan_R4==1)
     {
      KeyValue=15;
    
     }
    
  } 
	
	if(column==4)  
  {
     KEY2_Board_Init();        
     if( KeyScan_R1==1)
     {
      KeyValue=4;  
     }
     if( KeyScan_R2==1)
     {
      KeyValue=8;
   
     }
     if( KeyScan_R3==1)
     {
      KeyValue=12;
  
     }
     if( KeyScan_R4==1)
     {
      KeyValue=16;
    
     }
    
   
    
  } 
    return KeyValue;
 }
 
 
   

key_board.h头文件

#ifndef __KEYBOARD_H
#define __KEYBOARD_H


void KEY1_Board_Init(void);
void KEY2_Board_Init(void);
int KeyScan(void);

 

#endif

用就完事了,亲测有效,根据条件修改引脚就行



版权声明:本文为qq_52068493原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。