📄 main.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 + -