⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 键盘扫描算法有很多中
💻 C
字号:
#include "hw_ints.h"
#include "hw_memmap.h"
#include "hw_types.h"
#include "gpio.h"
#include "sysctl.h"
#include "cpu.h"
#include "interrupt.h"
#include "uart.h"

void KEY_SCAN_INIT();
unsigned char ScanKey();
void Delay(unsigned short i);
#define           KEY_IN1     GPIO_PIN_4
#define           KEY_IN2     GPIO_PIN_1
#define           KEY_IN3     GPIO_PIN_0
#define           KEY_IN4     GPIO_PIN_6

#define           KEY_OUT1      GPIO_PIN_3
#define           KEY_OUT2      GPIO_PIN_2
#define           KEY_OUT3      GPIO_PIN_1
#define           KEY_OUT4      GPIO_PIN_2
#define           KEY_OUT5      GPIO_PIN_5 
#define           KEY_OUT6      GPIO_PIN_4

#define  UART0_PIN    GPIO_PIN_0 | GPIO_PIN_1
unsigned char TestData[50] = {0};
unsigned char KEYVALUE[32] =
{
	
	/*01    02      03	  04,       05	    06	    07	      08*/
	'1',    '5',    '9',      ' ',      'D',    'W',    'K',      'f',
        
	/*01    02      03	  04,       05	    06	    07	      08*/
	'2',    '6',    '0',      'A',      'E',    'T',    'J',      'r',
        
        /*01    02      03	  04,       05	    06	    07	      08*/
	'3',    '7',    '.',      'B',      'F',    'O',    'L',      'e',
        
        /*01    02      03	  04,       05	    06	    07	      08*/
	'4',    '8',    '-',      'C',      'G',    'H',    ';',      's',
};

int main(void)
{  
  //unsigned short i = 0;
  unsigned short Tmp = 0;
    SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN |
                   SYSCTL_XTAL_7_37MHZ);                                   /*  设置晶振为时钟源            */
    //*************************************UART0配置*********************************************************************
    SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0); 
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
    GPIOPinTypeUART(GPIO_PORTA_BASE, UART0_PIN);
    UARTConfigSet(UART0_BASE, 19200, (UART_CONFIG_WLEN_8 |
                                     UART_CONFIG_STOP_ONE |
                                     UART_CONFIG_PAR_NONE));
    UARTEnable(UART0_BASE);
    //**********************************************************************************************************
   KEY_SCAN_INIT();
   
   KEYVALUE[31] = 0x00;

   while(1)
   {
    Tmp = ScanKey();  
    if(Tmp != 0x00 )
      {
         UARTCharPut(UART0_BASE, Tmp);
       }
  
   }
}
void KEY_SCAN_INIT()
{
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);    
    SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);      
  
    GPIODirModeSet(GPIO_PORTF_BASE, (GPIO_PIN_1 | GPIO_PIN_4), GPIO_DIR_MODE_IN);  //PF1 PF4设置为输入
    GPIOPadConfigSet(GPIO_PORTF_BASE, (GPIO_PIN_1 | GPIO_PIN_4),                             
                       GPIO_STRENGTH_2MA,                      
                       GPIO_PIN_TYPE_STD);
    
    GPIODirModeSet(GPIO_PORTB_BASE, (GPIO_PIN_0 | GPIO_PIN_6), GPIO_DIR_MODE_IN);  //PB0 PB6设置为输入
    GPIOPadConfigSet(GPIO_PORTB_BASE, (GPIO_PIN_0 | GPIO_PIN_6),                             
                       GPIO_STRENGTH_2MA,                      
                       GPIO_PIN_TYPE_STD);         
    
    GPIODirModeSet(GPIO_PORTB_BASE, (GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_4 | GPIO_PIN_5), GPIO_DIR_MODE_OUT);  //PB1 PB2 PB4 PB5设置为输出
    GPIOPadConfigSet(GPIO_PORTB_BASE, (GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_4 | GPIO_PIN_5),
                       GPIO_STRENGTH_2MA,  
                       GPIO_PIN_TYPE_STD);
    
    GPIODirModeSet(GPIO_PORTF_BASE, (GPIO_PIN_2 | GPIO_PIN_3), GPIO_DIR_MODE_OUT);  //PF2 PF3设置为输出
    GPIOPadConfigSet(GPIO_PORTF_BASE, (GPIO_PIN_2 | GPIO_PIN_3),        
                       GPIO_STRENGTH_2MA,      
                       GPIO_PIN_TYPE_STD);

    
    GPIOPinWrite(GPIO_PORTB_BASE, (GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_4 | GPIO_PIN_5), ~(GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_4 | GPIO_PIN_5));
    GPIOPinWrite(GPIO_PORTF_BASE, (GPIO_PIN_2 | GPIO_PIN_3), ~(GPIO_PIN_2 | GPIO_PIN_3));//输出都为低电平
}
void Delay(unsigned short i)
{
  while(i--);
}

unsigned char ScanKey()
{
//    unsigned short usKeyValue;
    unsigned short usCurKeyScanValue;
    unsigned short usPreKeyScanValue; 
    unsigned short usRowNo;
    unsigned short Tmp1, Tmp2 ;
    
    //****************************************************************************************** 
      Tmp1 = GPIOPinRead(GPIO_PORTF_BASE, (KEY_IN1 | KEY_IN2));
      Tmp2 = GPIOPinRead(GPIO_PORTB_BASE, (KEY_IN3 | KEY_IN4));
      usCurKeyScanValue = ((Tmp1 >> 4) | (Tmp1 & 0x0F) | (Tmp2 << 2) | (Tmp2 >> 3))&0x0F;//输入引脚组合成的数值
      usPreKeyScanValue = usCurKeyScanValue;
    //****************************************************************************************** 
    if(usCurKeyScanValue == 0x0F)
    {
      return 0x0;//条件成立表明没有按键按下,有按键按下,某个输入引脚会变低
    }
    else
    {
          //*****************************扫描KEYOUT1************************************************
          
          GPIOPinWrite(GPIO_PORTF_BASE, KEY_OUT1, KEY_OUT1);
          /*扫描输入键值*/
          Tmp1 = GPIOPinRead(GPIO_PORTF_BASE, (KEY_IN1 | KEY_IN2));
          Tmp2 = GPIOPinRead(GPIO_PORTB_BASE, (KEY_IN3 | KEY_IN4));
          usCurKeyScanValue = ((Tmp1 >> 4) | (Tmp1 & 0x0F) | (Tmp2 << 2) | (Tmp2 >> 3))&0x0F;
          
          if(usCurKeyScanValue == 0x0F)
          {
             usRowNo = 0;
             GPIOPinWrite(GPIO_PORTF_BASE, KEY_OUT1, ~KEY_OUT1);
             goto ReleaseKey;
          }
          else
          {
            GPIOPinWrite(GPIO_PORTF_BASE, KEY_OUT1, ~KEY_OUT1);  
          }
          //********************************扫描KEYOUT2****************************************************
          GPIOPinWrite(GPIO_PORTF_BASE, KEY_OUT2, KEY_OUT2);
          /*扫描输入键值*/
          Tmp1 = GPIOPinRead(GPIO_PORTF_BASE, (KEY_IN1 | KEY_IN2));
          Tmp2 = GPIOPinRead(GPIO_PORTB_BASE, (KEY_IN3 | KEY_IN4));
          usCurKeyScanValue = ((Tmp1 >> 4) | (Tmp1 & 0x0F) | (Tmp2 << 2) | (Tmp2 >> 3))&0x0F;
          
          if(usCurKeyScanValue == 0x0F)
          {
             usRowNo = 1;
             GPIOPinWrite(GPIO_PORTF_BASE, KEY_OUT2, ~KEY_OUT2);
             goto ReleaseKey;
          }
          else
          {
            GPIOPinWrite(GPIO_PORTF_BASE, KEY_OUT2, ~KEY_OUT2); 
          }
          //********************************扫描KEYOUT3****************************************************
          GPIOPinWrite(GPIO_PORTB_BASE, KEY_OUT3, KEY_OUT3);
          /*扫描输入键值*/
          Tmp1 = GPIOPinRead(GPIO_PORTF_BASE, (KEY_IN1 | KEY_IN2));
          Tmp2 = GPIOPinRead(GPIO_PORTB_BASE, (KEY_IN3 | KEY_IN4));
          usCurKeyScanValue = ((Tmp1 >> 4) | (Tmp1 & 0x0F) | (Tmp2 << 2) | (Tmp2 >> 3))&0x0F;
          
          if(usCurKeyScanValue == 0x0F)
          {
             usRowNo = 2;
             GPIOPinWrite(GPIO_PORTB_BASE, KEY_OUT3, ~KEY_OUT3);
             goto ReleaseKey;
          }
          else
          {
            GPIOPinWrite(GPIO_PORTB_BASE, KEY_OUT3, ~KEY_OUT3);
          }
          //********************************扫描KEYOUT4****************************************************
          GPIOPinWrite(GPIO_PORTB_BASE, KEY_OUT4, KEY_OUT4);
          /*扫描输入键值*/
          Tmp1 = GPIOPinRead(GPIO_PORTF_BASE, (KEY_IN1 | KEY_IN2));
          Tmp2 = GPIOPinRead(GPIO_PORTB_BASE, (KEY_IN3 | KEY_IN4));
          usCurKeyScanValue = ((Tmp1 >> 4) | (Tmp1 & 0x0F) | (Tmp2 << 2) | (Tmp2 >> 3))&0x0F;
          
          if(usCurKeyScanValue == 0x0F)
          {
             usRowNo = 3;
             GPIOPinWrite(GPIO_PORTB_BASE, KEY_OUT4, ~KEY_OUT4);
             goto ReleaseKey;
          }
          else
          {
            GPIOPinWrite(GPIO_PORTB_BASE, KEY_OUT4, ~KEY_OUT4);
          }
          //********************************扫描KEYOUT5****************************************************
          GPIOPinWrite(GPIO_PORTB_BASE, KEY_OUT5, KEY_OUT5);
          /*扫描输入键值*/
          Tmp1 = GPIOPinRead(GPIO_PORTF_BASE, (KEY_IN1 | KEY_IN2));
          Tmp2 = GPIOPinRead(GPIO_PORTB_BASE, (KEY_IN3 | KEY_IN4));
          usCurKeyScanValue = ((Tmp1 >> 4) | (Tmp1 & 0x0F) | (Tmp2 << 2) | (Tmp2 >> 3))&0x0F;
          
          if(usCurKeyScanValue == 0x0F)
          {
             usRowNo = 4;
             GPIOPinWrite(GPIO_PORTB_BASE, KEY_OUT5, ~KEY_OUT5);
             goto ReleaseKey;
          }
          else
          {
            GPIOPinWrite(GPIO_PORTB_BASE, KEY_OUT5, ~KEY_OUT5);
          }
          //********************************扫描KEYOUT6****************************************************
          GPIOPinWrite(GPIO_PORTB_BASE, KEY_OUT6, KEY_OUT6);
          /*扫描输入键值*/
          Tmp1 = GPIOPinRead(GPIO_PORTF_BASE, (KEY_IN1 | KEY_IN2));
          Tmp2 = GPIOPinRead(GPIO_PORTB_BASE, (KEY_IN3 | KEY_IN4));
          usCurKeyScanValue = ((Tmp1 >> 4) | (Tmp1 & 0x0F) | (Tmp2 << 2) | (Tmp2 >> 3))&0x0F;
          
          if(usCurKeyScanValue == 0x0F)
          {
             usRowNo = 5;
             GPIOPinWrite(GPIO_PORTB_BASE, KEY_OUT6, ~KEY_OUT6);
             goto ReleaseKey;
          }
          else
          {
            GPIOPinWrite(GPIO_PORTB_BASE, KEY_OUT6, ~KEY_OUT6);
          }
    }
//***************************************等待按键释放***************************************************** 
ReleaseKey:     do{
                    Tmp1 = GPIOPinRead(GPIO_PORTF_BASE, (KEY_IN1 | KEY_IN2));
                    Tmp2 = GPIOPinRead(GPIO_PORTB_BASE, (KEY_IN3 | KEY_IN4));
                    usCurKeyScanValue = ((Tmp1 >> 4) | (Tmp1 & 0x0F) | (Tmp2 << 2) | (Tmp2 >> 3))&0x0F;
                  }while(usCurKeyScanValue != 0x0F);
                Delay(20000); 
                do{
                    Tmp1 = GPIOPinRead(GPIO_PORTF_BASE, (KEY_IN1 | KEY_IN2));
                    Tmp2 = GPIOPinRead(GPIO_PORTB_BASE, (KEY_IN3 | KEY_IN4));
                    usCurKeyScanValue = ((Tmp1 >> 4) | (Tmp1 & 0x0F) | (Tmp2 << 2) | (Tmp2 >> 3))&0x0F;
                  }while(usCurKeyScanValue != 0x0F);  
                  
//***************************************码值转换*********************************************************    
    
    switch(usPreKeyScanValue&0x0F)
    {
    case 0x0E:
      return  KEYVALUE[usRowNo];
 
    case 0x0D:
      return  KEYVALUE[usRowNo+8];

    case 0x0B:
      return  KEYVALUE[usRowNo+16];

    case 0x07:
      return  KEYVALUE[usRowNo+24];

    default:
      return 0x0;
    }

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -