0 前言

GPIO输入功能是28335非常重要的部分,可通过外部数字逻辑信号的输入,作为逻辑触发控制的判断条件。比如在电机控制中,通过判断输入管脚的电平状态,实现电机调速。在显示屏人机界面下,也可通过按键触发的管脚输入电平状态,实现人机接口控制。

为了学习GPIO输入功能,大家在各个项目下都能触类旁通。

本期的学习目的为:使用核心板上的矩阵键盘4个按键,每个按键触发分别控制对应的LED灯亮灭。

分为三个部分:第一节是讲述核心板硬件及矩阵键盘控制原理;第二节是功能代码;第三节是实验结果;第四节是结论。


目录

1. 硬件及矩阵键盘控制原理

2. DSP代码介绍

3. 实验结果

4. 结论


1 硬件及矩阵键盘控制原理


如图所示,在一个n×n的矩阵键盘,要识别其中的某一个按键是否被按下,可以采用逐行扫描的方法。

比如要识别第i行第j列的按键是否被按下(记Kij),可以分以下步骤进行:

  1. 在行线全部输出低电平的前提下,逐个判断列线的状态,如果第j列识别到低电平,则判断结果为该被按下的按键处于第j列中。
  2. 在所有行线中,规定只允许其中一个是输出低电平,其他输出高电平。从第一个开始,按照此规定依次扫描,并同时判断该列线的状态。如果当第i行输出低电平,第j列识别也是低电平,则判断结果为该被按下的按键处于第i行中。
  3. 根据行列位置,即可识别是第几个按键被按下。

在核心板硬件架构中,采用的是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_RUNMemCopy(&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;}}elsereturn 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;}}elsereturn 0;}elsereturn 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输入(矩阵按键扫描)相关推荐

  1. Hive(二)基础教程

    Hive(二)基础教程@你宝爷 一.常用交互命令 #beeline jdbc 启动客户端,可多线程访问,hive不可以 $HIVE_HOME/bin/beeline -u jdbc:hive2://h ...

  2. 计算机键盘是编码键盘还是非编码键盘,矩阵按键原理图_矩阵按键扫描实例

    键盘分编码键盘和非编码键盘.键盘上闭合键的识别由专用的硬件编码器实现,并产生键编码号或键值的称为编码键盘,如计算机键盘.而靠软件编程来识别的称为非编码键盘. 在一般嵌入式应用中,用的最多的是非编码键盘 ...

  3. STM32矩阵按键扫描冲突问题

    最近做了一个项目,有个部分用到了矩阵扫描的原理,要检测按键是否按下去执行一个动作.一开始硬件工程师的原理图实现是设计成传统矩阵按键方式,大致原理如下所示: 这种硬件实现方式当去检测单个按下.一整行按下 ...

  4. HTML5与CSS3基础教程(第8版) PDF扫描版​

    <HTML5与CSS3基础教程(第8版)>自第1版至今,一直是讲解HTML和CSS入门知识的经典畅销书,全面系统地阐述HTML5和CSS3基础知识以及实际运用技术,通过大量实例深入浅出地分 ...

  5. (四)DSP28335基础教程——SCI串口通信实验(上位机收发显示)

    0 前言 本期的实验目的为:使用核心板上的SCI串口通信功能,在电脑端上位机,输入数字0,1,2,3,4,分别控制五个LED亮灭. 1 DSP代码 (注意:查看代码时双击点进去看,否则会内容不全). ...

  6. 蓝桥杯基础模块4_3:矩阵按键

    一.模块题目 二.原理简述 1.矩阵键盘的扫描思想(转载+删减) 与独立按键不同的是,按键的两个引脚都分别连接的单片机的I/O端口,一个作为行信号,另外一个作为列信号.下以4X4的矩阵键盘为例,探讨其 ...

  7. STM32F103 矩阵键盘4*4 16*16等任意矩阵 按键扫描程序

    基于STM32的按键扫描测试程序(学习记录): 目录: 源码: 4x4按键原理: 按键扫描逻辑: Tips: 粘贴代码时,粘贴在源文件存放的位置中(如:HARDWARE中的.c和.h文件),用C++编 ...

  8. (五)DSP28335基础教程——外部中断控制(按键触发)

    0 前言 本期实验目标:采用外部中断方式响应按键触发,实现LED电平反转. 外部中断是DSP十分常用的功能,通常用来响应一些控制操作,比如判断按键是否按下,传感器是否接收到信号等等.那么通过该例程,大 ...

  9. GD32F103基础教程—GPIO输出实验(五)

    一.教程简介 本章主要是讲解GPIO输出实验,讲解GPIO的输出配 置方法,并控制LED2灯实现间隔1s闪烁. 二.实验流程 1.工程配置 (1)首先在工程模板目录下的HardWare文件夹内创建文件 ...

最新文章

  1. 转:动态链接库的全局变量问题
  2. 如何用FAPROTAX预测微生物群落功能
  3. 【linux基础】重命名文件和文件夹
  4. linux命令wc解读
  5. spring 注解上传文件 @RequestParam,FormData上传文件
  6. Comet---“服务器推”技术实现
  7. 使用rpm包升级ntpd服务_服务器准备升级,小程序将暂停使用
  8. 萌新的Python练习菜鸟100例(十)暂停一秒输出,并格式化输出当前时间
  9. 教会别人编程,你能收获什么?
  10. react key值警告问题
  11. CDA Level1复盘总结
  12. Bus hound USTS
  13. 计算机无法打开浏览器,win7电脑打开ie浏览器被提示“该页无法显示”怎么解决...
  14. WeChat-JSAPI支付
  15. STM32 内核复位 与 系统复位 区别及程序实现
  16. vs不允许使用不完整的类型_擦痕破损严重老照片修复,基础工具辅助绘画,不使用素材完整修复...
  17. 0.0.0.0/0是什么意思
  18. 矩阵的基础知识回顾:矩阵乘法,矩阵的逆,伴随矩阵,矩阵的转置,行列式,相似矩阵,实对称矩阵
  19. 图书借阅管理系统的设计与实现/书籍借还管理系统
  20. Linux 系统如何设置开机程序自启动

热门文章

  1. c语言做bs架构_BS架构技术方案 Technology
  2. 武汉新时标文化传媒有限公司短视频创作的对象法与情感需求法
  3. linux c语言修改文件的时间属性,请教一个关于用标准C语言修改文件创建时间、修改时间和访问时间的问题。...
  4. STM32F103程序设计-5-控制引脚高低电平的实现
  5. 爬虫学习笔记:爬取古诗文网
  6. 5G无线技术基础自学系列 | 密集组网
  7. Object类中的五种方法
  8. 【网络科普】Wi-Fi 安全接入方法 - WEP, WPA, WPS
  9. centos8设置静态IP
  10. python微信自动群发脚本_python 微信批量发送消息脚本