一个简单的按键实验:
每一个按键的功能是不一样的
其中不知道为什么key3出现了问题,可是查不出原因,就先放在这里了
按键采用行列扫描的方式判断
大家可以自己看资料
看管脚和资料是程序猿的基本功
代码:
key的驱动
keys.c
/*
* key.c
*
* Created on: 2024年8月5日
* Author: Administrator
*/
#include<keys.h>
void KEY_Init(void)
{
EALLOW;//关闭写保护
SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK = 1; // 开启GPIO时钟
//LED1端口配置
GpioCtrlRegs.GPAMUX1.bit.GPIO12=0;//设置为通用GPIO功能
GpioCtrlRegs.GPADIR.bit.GPIO12=0;//设置GPIO方向为输入
GpioCtrlRegs.GPAPUD.bit.GPIO12=0;//使能GPIO上拉电阻
GpioCtrlRegs.GPAMUX1.bit.GPIO13=0;//设置为通用GPIO功能
GpioCtrlRegs.GPADIR.bit.GPIO13=0;//设置GPIO方向为输入
GpioCtrlRegs.GPAPUD.bit.GPIO13=0;//使能GPIO上拉电阻
GpioCtrlRegs.GPAMUX1.bit.GPIO14=0;//设置为通用GPIO功能
GpioCtrlRegs.GPADIR.bit.GPIO14=0;//设置GPIO方向为输入
GpioCtrlRegs.GPAPUD.bit.GPIO14=0;//使能GPIO上拉电阻
GpioCtrlRegs.GPBMUX2.bit.GPIO48=0;//设置为通用GPIO功能
GpioCtrlRegs.GPBDIR.bit.GPIO48=1;//设置GPIO方向为输出
GpioCtrlRegs.GPBPUD.bit.GPIO48=0;//使能GPIO上拉电阻
GpioCtrlRegs.GPBMUX2.bit.GPIO49=0;//设置为通用GPIO功能
GpioCtrlRegs.GPBDIR.bit.GPIO49=1;//设置GPIO方向为输出
GpioCtrlRegs.GPBPUD.bit.GPIO49=0;//使能GPIO上拉电阻
GpioCtrlRegs.GPBMUX2.bit.GPIO50=0;//设置为通用GPIO功能
GpioCtrlRegs.GPBDIR.bit.GPIO50=1;//设置GPIO方向为输出
GpioCtrlRegs.GPBPUD.bit.GPIO50=0;//使能GPIO上拉电阻
EDIS;//开启写保护
GpioDataRegs.GPBSET.bit.GPIO48=1;//设置GPIO输出高电平
GpioDataRegs.GPBSET.bit.GPIO49=1;//设置GPIO输出高电平
GpioDataRegs.GPBSET.bit.GPIO50=1;//设置GPIO输出高电平
}
char KEY_Scan(char mode)
{
KEY_L1SET_L;
KEY_L2SET_H;
KEY_L3SET_H;
if(keyh1==0||keyh2==0||keyh3==0)
{
DELAY_US(10000);
if(keyh1==0)
{
mode=KEY1_PRESS;
}
else if(keyh2==0)
{
mode=KEY4_PRESS;
}
else if(keyh3==0)
{
mode=KEY7_PRESS;
}
}
KEY_L1SET_H;
KEY_L2SET_L;
KEY_L3SET_H;
if(keyh1==0||keyh2==0||keyh3==0)
{
DELAY_US(10000);
if(keyh1==0)
{
mode=KEY2_PRESS;
}
else if(keyh2==0)
{
mode=KEY5_PRESS;
}
else if(keyh3==0)
{
mode=KEY8_PRESS;
}
}
KEY_L1SET_H;
KEY_L2SET_H;
KEY_L3SET_L;
if(keyh1==0||keyh2==0||keyh3==0)
{
DELAY_US(10000);
if(keyh1==0)
{
mode=KEY3_PRESS;
}
else if(keyh2==0)
{
mode=KEY6_PRESS;
}
else if(keyh3==0)
{
mode=KEY9_PRESS;
}
}
return mode;
}
key.h
/*
* key.h
*
* Created on: 2024年8月5日
* Author: Administrator
*/
#ifndef KEYS_H_
#define KEYS_H_
#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h" // DSP2833x Examples Include File
#define KEY_L1SET_H (GpioDataRegs.GPBSET.bit.GPIO48=1)//设置GPIO输出高电平
#define KEY_L1SET_L (GpioDataRegs.GPBCLEAR.bit.GPIO48=1)//设置GPIO输出低电平
#define KEY_L2SET_H (GpioDataRegs.GPBSET.bit.GPIO49=1)//设置GPIO输出高电平
#define KEY_L2SET_L (GpioDataRegs.GPBCLEAR.bit.GPIO49=1)//设置GPIO输出低电平
#define KEY_L3SET_H (GpioDataRegs.GPBSET.bit.GPIO50=1)//设置GPIO输出高电平
#define KEY_L3SET_L (GpioDataRegs.GPBCLEAR.bit.GPIO50=1)//设置GPIO输出低电平
#define KEY1_PRESS 1
#define KEY2_PRESS 2
#define KEY3_PRESS 3
#define KEY4_PRESS 4
#define KEY5_PRESS 5
#define KEY6_PRESS 6
#define KEY7_PRESS 7
#define KEY8_PRESS 8
#define KEY9_PRESS 9
#define keyh1 (GpioDataRegs.GPADAT.bit.GPIO12)//管脚信号
#define keyh2 (GpioDataRegs.GPADAT.bit.GPIO13)//管脚信号
#define keyh3 (GpioDataRegs.GPADAT.bit.GPIO14)//管脚信号
void KEY_Init();
char KEY_Scan(char mode);
#endif /* KEYS_H_ */
leds文件夹:
leds.c
/*
* leds.c
*
* Created on: 2024年8月2日
* Author: Administrator
*/
#include<leds.h>
/*******************************************************************************
* 函 数 名 : LED_Init
* 函数功能 : LED初始化函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void LED_Init(void)
{
EALLOW;//关闭写保护
SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK = 1; // 开启GPIO时钟
//LED1端口配置
GpioCtrlRegs.GPCMUX1.bit.GPIO68=0;//设置为通用GPIO功能
GpioCtrlRegs.GPCDIR.bit.GPIO68=1;//设置GPIO方向为输出
GpioCtrlRegs.GPCPUD.bit.GPIO68=0;//使能GPIO上拉电阻
GpioCtrlRegs.GPCMUX1.bit.GPIO67=0;//设置为通用GPIO功能
GpioCtrlRegs.GPCDIR.bit.GPIO67=1;//设置GPIO方向为输出
GpioCtrlRegs.GPCPUD.bit.GPIO67=0;//使能GPIO上拉电阻
GpioCtrlRegs.GPCMUX1.bit.GPIO66=0;//设置为通用GPIO功能
GpioCtrlRegs.GPCDIR.bit.GPIO66=1;//设置GPIO方向为输出
GpioCtrlRegs.GPCPUD.bit.GPIO66=0;//使能GPIO上拉电阻
GpioCtrlRegs.GPCMUX1.bit.GPIO65=0;//设置为通用GPIO功能
GpioCtrlRegs.GPCDIR.bit.GPIO65=1;//设置GPIO方向为输出
GpioCtrlRegs.GPCPUD.bit.GPIO65=0;//使能GPIO上拉电阻
GpioCtrlRegs.GPCMUX1.bit.GPIO64=0;//设置为通用GPIO功能
GpioCtrlRegs.GPCDIR.bit.GPIO64=1;//设置GPIO方向为输出
GpioCtrlRegs.GPCPUD.bit.GPIO64=0;//使能GPIO上拉电阻
GpioCtrlRegs.GPAMUX1.bit.GPIO10=0;//设置为通用GPIO功能
GpioCtrlRegs.GPADIR.bit.GPIO10=1;//设置GPIO方向为输出
GpioCtrlRegs.GPAPUD.bit.GPIO10=0;//使能GPIO上拉电阻
GpioCtrlRegs.GPAMUX1.bit.GPIO1=0;//设置为通用GPIO功能
GpioCtrlRegs.GPADIR.bit.GPIO11=1;//设置GPIO方向为输出
GpioCtrlRegs.GPAPUD.bit.GPIO11=0;//使能GPIO上拉电阻
GpioDataRegs.GPCSET.bit.GPIO68=1;//设置GPIO输出高电平
GpioDataRegs.GPCSET.bit.GPIO67=1;//设置GPIO输出高电平
GpioDataRegs.GPCSET.bit.GPIO66=1;//设置GPIO输出高电平
GpioDataRegs.GPCSET.bit.GPIO65=1;//设置GPIO输出高电平
GpioDataRegs.GPCSET.bit.GPIO64=1;//设置GPIO输出高电平
GpioDataRegs.GPASET.bit.GPIO10=1;//设置GPIO输出高电平
GpioDataRegs.GPASET.bit.GPIO11=1;//设置GPIO输出高电平
EDIS;//开启写保护
}
led.h代码
/*
* leds.h
*
* Created on: 2024年8月2日
* Author: Administrator
*/
#ifndef LEDS_H_
#define LEDS_H_
#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h" // DSP2833x Examples Include File
#define LED1OFF (GpioDataRegs.GPCSET.bit.GPIO68=1)
#define LED1ON (GpioDataRegs.GPCCLEAR.bit.GPIO68=1)
#define LED1TOGGLE (GpioDataRegs.GPCTOGGLE.bit.GPIO68=1)
#define LED2OFF (GpioDataRegs.GPCSET.bit.GPIO67=1)
#define LED2ON (GpioDataRegs.GPCCLEAR.bit.GPIO67=1)
#define LED2TOGGLE (GpioDataRegs.GPCTOGGLE.bit.GPIO67=1)
#define LED3OFF (GpioDataRegs.GPCSET.bit.GPIO66=1)
#define LED3ON (GpioDataRegs.GPCCLEAR.bit.GPIO66=1)
#define LED3TOGGLE (GpioDataRegs.GPCTOGGLE.bit.GPIO66=1)
#define LED4OFF (GpioDataRegs.GPCSET.bit.GPIO65=1)
#define LED4ON (GpioDataRegs.GPCCLEAR.bit.GPIO65=1)
#define LED4TOGGLE (GpioDataRegs.GPCTOGGLE.bit.GPIO65=1)
#define LED5OFF (GpioDataRegs.GPCSET.bit.GPIO64=1)
#define LED5ON (GpioDataRegs.GPCCLEAR.bit.GPIO64=1)
#define LED5TOGGLE (GpioDataRegs.GPCTOGGLE.bit.GPIO64=1)
#define LED6OFF (GpioDataRegs.GPASET.bit.GPIO10=1)
#define LED6ON (GpioDataRegs.GPACLEAR.bit.GPIO10=1)
#define LED6TOGGLE (GpioDataRegs.GPATOGGLE.bit.GPIO10=1)
#define LED7OFF (GpioDataRegs.GPASET.bit.GPIO11=1)
#define LED7ON (GpioDataRegs.GPACLEAR.bit.GPIO11=1)
#define LED7TOGGLE (GpioDataRegs.GPATOGGLE.bit.GPIO11=1)
void LED_Init(void);
#endif /* LEDS_H_ */
main.c文件
/*
* main.c
*
* Created on: 2018-3-21
* Author: Administrator
*/
#include "DSP2833x_Device.h" // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h" // DSP2833x Examples Include File
#include<leds.h>
#include <keys.h>
/*******************************************************************************
* 函 数 名 : delay
* 函数功能 : 延时函数,通过循环占用CPU,达到延时功能
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void delay(void)
{
Uint16 i;
Uint32 j;
for(i=0;i<32;i++)
for (j = 0; j < 100000; j++);
}
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void main()
{
InitSysCtrl();//系统时钟初始化,默认已开启F28335所有外设时钟
LED_Init();
KEY_Init();
char MODE1=10;
char MODE2=12;
char mode1=11;
int flag=0;
char mode;
LED1OFF;
LED2OFF;
LED3OFF;
LED4OFF;
LED5OFF;
LED6OFF;
LED7OFF;
while(1)
{
mode1=KEY_Scan(mode);
if(mode1==1)
{
LED1TOGGLE;
LED2OFF;
LED3OFF;
LED4OFF;
LED5OFF;
LED6OFF;
LED7OFF;
DELAY_US(200000);
}
if(mode1==2)
{
LED2TOGGLE;
LED1OFF;
LED3OFF;
LED4OFF;
LED5OFF;
LED6OFF;
LED7OFF;
DELAY_US(200000);
}
if(mode1==3)
{
LED3TOGGLE;
LED2OFF;
LED1OFF;
LED4OFF;
LED5OFF;
LED6OFF;
LED7OFF;
DELAY_US(200000);
}
if(mode1==4)
{
LED4TOGGLE;
LED2OFF;
LED3OFF;
LED1OFF;
LED5OFF;
LED6OFF;
LED7OFF;
DELAY_US(200000);
}
if(mode1==5)
{
LED5TOGGLE;
LED2OFF;
LED3OFF;
LED4OFF;
LED1OFF;
LED6OFF;
LED7OFF;
DELAY_US(200000);
}
if(mode1==6)
{
LED6TOGGLE;
LED2OFF;
LED3OFF;
LED4OFF;
LED5OFF;
LED1OFF;
LED7OFF;
DELAY_US(200000);
}
if(mode1==7)
{
LED7TOGGLE;
LED2OFF;
LED3OFF;
LED4OFF;
LED5OFF;
LED6OFF;
LED1OFF;
DELAY_US(200000);
}
if(mode1==8)
{
LED1OFF;
LED2OFF;
LED3OFF;
LED4OFF;
LED5OFF;
LED6OFF;
LED7OFF;
DELAY_US(200000);
LED1ON;
LED2ON;
LED3ON;
LED4ON;
LED5ON;
LED6ON;
LED7ON;
DELAY_US(200000);
}
if(mode1==9)
{
LED1OFF;
DELAY_US(200000);
LED1ON;
DELAY_US(200000);
LED2OFF;
DELAY_US(200000);
LED2ON;
DELAY_US(200000);
LED3OFF;
DELAY_US(200000);
LED3ON;
DELAY_US(200000);
LED4OFF;
DELAY_US(200000);
LED4ON;
DELAY_US(200000);
LED5OFF;
DELAY_US(200000);
LED5ON;
DELAY_US(200000);
LED6OFF;
DELAY_US(200000);
LED6ON;
DELAY_US(200000);
LED7OFF;
DELAY_US(200000);
LED7ON;
DELAY_US(200000);
}
}
}
演示视频:
STM32F28335的按键实验