概述
0 前言
GPIO输入功能是28335非常重要的部分,可通过外部数字逻辑信号的输入,作为逻辑触发控制的判断条件。比如在电机控制中,通过判断输入管脚的电平状态,实现电机调速。在显示屏人机界面下,也可通过按键触发的管脚输入电平状态,实现人机接口控制。
为了学习GPIO输入功能,大家在各个项目下都能触类旁通。
本期的学习目的为:使用核心板上的矩阵键盘4个按键,每个按键触发分别控制对应的LED灯亮灭。
分为三个部分:第一节是讲述核心板硬件及矩阵键盘控制原理;第二节是功能代码;第三节是实验结果;第四节是结论。
目录
1. 硬件及矩阵键盘控制原理
2. DSP代码介绍
3. 实验结果
4. 结论
1 硬件及矩阵键盘控制原理
如图所示,在一个n×n的矩阵键盘,要识别其中的某一个按键是否被按下,可以采用逐行扫描的方法。
比如要识别第i行第j列的按键是否被按下(记Kij),可以分以下步骤进行:
- 在行线全部输出低电平的前提下,逐个判断列线的状态,如果第j列识别到低电平,则判断结果为该被按下的按键处于第j列中。
- 在所有行线中,规定只允许其中一个是输出低电平,其他输出高电平。从第一个开始,按照此规定依次扫描,并同时判断该列线的状态。如果当第i行输出低电平,第j列识别也是低电平,则判断结果为该被按下的按键处于第i行中。
- 根据行列位置,即可识别是第几个按键被按下。
在核心板硬件架构中,采用的是2×2的矩阵键盘。当K11被按下,LED2亮1s后熄灭;K21被按下,LED3亮1s后熄灭;K12被按下,LED0亮1s后熄灭;K22被按下,LED1亮1s后熄灭。
2 DSP代码
(注意:查看代码时双击点进去看,否则会内容不全)。
/**
* ********************************************************************************************
* @file main.c
* @file SK Electronics
* @version V1.0
* @date 2020-xx-xx
* @brief LED按键测试
* *******************************************************************************************
* @attention
* 实验平台:SK-F28335Mini 核心板
* CSDN博客:https://blog.csdn.net/weixin_46556696
* 淘宝:https://shop409670932.taobao.com
*/
#include "DSP28x_Project.h"
#include "bsp_key.h"
#include "bsp_led.h"
#define FLASH_RUN 1
#define SRAM_RUN 2
#define RUN_TYPE FLASH_RUN
#if RUN_TYPE==FLASH_RUN
extern Uint16 RamfuncsLoadStart;
extern Uint16 RamfuncsLoadEnd;
extern Uint16 RamfuncsRunStart;
#endif
unsigned char i=0;
void delay_1ms(Uint16 t);
/**
* @brief 主函数
* @parameter 无
* @return_value 无
*/
void main(void)
{
/*第一步:初始化系统控制:*/
InitSysCtrl();
/*第二步:初始化GPIO口*/
InitGpio();
/* 第三步:清除所有中断 和初始化 PIE 向量表:*/
DINT;// 禁用CPU中断
InitPieCtrl();// 初始化 PIE 控制寄存器到默认状态,默认状态是全部 PIE 中断被禁用和标志位被清除
IER = 0x0000;// 禁用 CPU 中断和清除所有 CPU 中断标志位:
IFR = 0x0000;
InitPieVectTable();// 初始化 PIE 中断向量表
// 中断重映射,注册中断程序入口(用户按需求添加)
//
/*程序烧录入28335(可选的)*/
#if RUN_TYPE==FLASH_RUN
MemCopy(&RamfuncsLoadStart,&RamfuncsLoadEnd,&RamfuncsRunStart);
InitFlash();
#endif
/* 第四步: 初始化所有外设*/
// InitPeripherals(); //初始化所有外设(本例程不需要)
/* 第五步:添加用户具体代码*/
LED_GPIO_Config();//LED端口初始化
KEY_Matrix_Config();//矩阵键盘端口初始化
/*第六步:进入主循环*/
for(;;)
{
switch(i=KEY_Martix_Scan())
{
case 0: break;
case 5: LED0(1);
delay_1ms(1000);
LED0(0);
break;
case 6: LED1(1);
delay_1ms(1000);
LED1(0);
break;
case 9: LED2(1);
delay_1ms(1000);
LED2(0);
break;
case 10:LED3(1);
delay_1ms(1000);
LED3(0);
break;
default:break;
}
}
}
/**
* @brief 1ms延迟函数
* @parameter t
* @return_value 无
*/
void delay_1ms(Uint16 t)
{
while(t--)
{
DELAY_US(1000);
}
}
/**
* ********************************************************************************************
* @file bsp.key.c
* @file SK Electronics
* @version V1.0
* @date 2020-xx-xx
* @brief 按键应用函数接口
* *******************************************************************************************
* @attention
* 实验平台:SK-F28335Mini 核心板
* CSDN博客:https://blog.csdn.net/weixin_46556696
* 淘宝:https://shop409670932.taobao.com
*/
#include "bsp_key.h"
/**
* @brief 配置矩阵键盘端口
* @parameter 无
* @return_value 无
*/
extern void delay_1ms(Uint16 t);
void KEY_Matrix_Config(void)
{
EALLOW;
GpioCtrlRegs.GPCMUX1.bit.GPIO64=0;//普通IO模式
GpioCtrlRegs.GPCPUD.bit.GPIO64=0;//使能内部上拉
GpioCtrlRegs.GPCDIR.bit.GPIO64=0;//配置成输入
GpioCtrlRegs.GPCMUX1.bit.GPIO65=0;//普通IO模式
GpioCtrlRegs.GPCPUD.bit.GPIO65=0;//使能内部上拉
GpioCtrlRegs.GPCDIR.bit.GPIO65=0;//配置成输入
GpioCtrlRegs.GPCMUX1.bit.GPIO67=0;//普通IO模式
GpioCtrlRegs.GPCPUD.bit.GPIO67=0;//使能内部上拉
GpioCtrlRegs.GPCDIR.bit.GPIO67=1;//配置成输出
GpioDataRegs.GPCCLEAR.bit.GPIO67=1;//默认输出低电平
GpioCtrlRegs.GPCMUX1.bit.GPIO68=0;//普通IO模式
GpioCtrlRegs.GPCPUD.bit.GPIO68=0;//使能内部上拉
GpioCtrlRegs.GPCDIR.bit.GPIO68=1;//配置成输出
GpioDataRegs.GPCCLEAR.bit.GPIO68=1;//默认输出低电平
EDIS;
}
/**
* @brief 矩阵键盘行扫描
* @parameter 无
* @return_value 4bit数值 <行值 列值> 表示形式:<01 01>第一行第一列,<01 10>表示第一行第二列,<10 01>第二行第一列
* <10 10>第二行第二列,<00 00>默认无按键
*/
unsigned char KEY_Martix_Scan(void)
{
if(GpioDataRegs.GPCDAT.bit.GPIO64==0)//第一列
{
delay_1ms(30);
if(GpioDataRegs.GPCDAT.bit.GPIO64==0)
{
GpioDataRegs.GPCCLEAR.bit.GPIO67=1;//第一行输出低电平
GpioDataRegs.GPCSET.bit.GPIO68=1;//第二行输出高电平
delay_1ms(30);
if(GpioDataRegs.GPCDAT.bit.GPIO64==0)
{
GpioDataRegs.GPCCLEAR.bit.GPIO67=1;
GpioDataRegs.GPCCLEAR.bit.GPIO68=1;
return 5;
}
else
{
GpioDataRegs.GPCCLEAR.bit.GPIO67=1;
GpioDataRegs.GPCCLEAR.bit.GPIO68=1;
return 9;
}
}
else
return 0;
}
else if(GpioDataRegs.GPCDAT.bit.GPIO65==0)//第二列
{
delay_1ms(30);
if(GpioDataRegs.GPCDAT.bit.GPIO65==0)
{
GpioDataRegs.GPCCLEAR.bit.GPIO67=1;//第一行输出低电平
GpioDataRegs.GPCSET.bit.GPIO68=1;//第二行输出高电平
delay_1ms(30);
if(GpioDataRegs.GPCDAT.bit.GPIO65==0)
{
GpioDataRegs.GPCCLEAR.bit.GPIO67=1;
GpioDataRegs.GPCCLEAR.bit.GPIO68=1;
return 6;
}
else
{
GpioDataRegs.GPCCLEAR.bit.GPIO67=1;
GpioDataRegs.GPCCLEAR.bit.GPIO68=1;
return 10;
}
}
else
return 0;
}
else
return 0;
}
/**
* ********************************************************************************************
* @file bsp.led.c
* @file SK Electronics
* @version V1.0
* @date 2020-xx-xx
* @brief LED应用函数接口
* *******************************************************************************************
* @attention
* 实验平台:SK-F28335Mini 核心板
* CSDN博客:https://blog.csdn.net/weixin_46556696
* 淘宝:https://shop409670932.taobao.com
*/
#include "bsp_led.h"
void LED_GPIO_Config(void)
{
EALLOW;
GpioCtrlRegs.GPAMUX1.bit.GPIO0=0;//普通IO模式
GpioCtrlRegs.GPAPUD.bit.GPIO0=0;//使能内部上拉
GpioCtrlRegs.GPADIR.bit.GPIO0=1;//配置成输出
GpioCtrlRegs.GPAMUX1.bit.GPIO1=0;//普通IO模式
GpioCtrlRegs.GPAPUD.bit.GPIO1=0;//使能内部上拉
GpioCtrlRegs.GPADIR.bit.GPIO1=1;//配置成输出
GpioCtrlRegs.GPAMUX1.bit.GPIO2=0;//普通IO模式
GpioCtrlRegs.GPAPUD.bit.GPIO2=0;//使能内部上拉
GpioCtrlRegs.GPADIR.bit.GPIO2=1;//配置成输出
GpioCtrlRegs.GPAMUX1.bit.GPIO3=0;//普通IO模式
GpioCtrlRegs.GPAPUD.bit.GPIO3=0;//使能内部上拉
GpioCtrlRegs.GPADIR.bit.GPIO3=1;//配置成输出
GpioCtrlRegs.GPAMUX1.bit.GPIO4=0;//普通IO模式
GpioCtrlRegs.GPAPUD.bit.GPIO4=0;//使能内部上拉
GpioCtrlRegs.GPADIR.bit.GPIO4=1;//配置成输出
GpioDataRegs. GPASET.bit.GPIO0=1;
GpioDataRegs. GPASET.bit.GPIO1=1;
GpioDataRegs. GPASET.bit.GPIO2=1;
GpioDataRegs. GPASET.bit.GPIO3=1;
GpioDataRegs. GPASET.bit.GPIO4=1;
EDIS;
}
3 实验结果
实验已经成功实现矩阵按键扫描下的GPIO输入功能。图中是K11按下后,LED2亮灯的结果。
4 结论
通过学习这个例程后,对GPIO输入功能的寄存器的配置都应有相应的了解。之后大家用到这个输入功能时,可直接复制套用其配置的过程。
下期讲解“系统CPU定时器中断”。有不清楚的欢迎留言,也可以加群一起学习讨论!!
最后
以上就是活力火车为你收集整理的(二)DSP28335基础教程——GPIO输入(矩阵按键扫描)的全部内容,希望文章能够帮你解决(二)DSP28335基础教程——GPIO输入(矩阵按键扫描)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复