DSP28335:独立按键控制LED灯

2024-06-17 09:28

本文主要是介绍DSP28335:独立按键控制LED灯,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

做任何事情不可操之过急,虽然我们可能在之前的单片机学过相关的原理,但是一个新的单片机依然有他的学习的地方,之前我觉得很简单,就跳过这个学习,结果到后面就很浮躁,导致后面的内容与这一章相连接的时候,就不会了,导致又要重新学这个知识

通过这一章,我们主要学习GPIO作为输入的代码编写;

单个独立按键的原理是下图所示:因为一个管脚一个连接GPIO,一个连接GND。、

I/O口有上拉电阻,默认GPIO是高电平,当你按下的时候,与GND连接,所以变成了低电平

 唯一需要考虑的是,抖动的问题:大部分通过软件进行滤除。

操作板上的是3*3矩阵按键,这样设计的方法是为了减少I/O的数量,

那我们怎么知道是哪个按键按下了呢?

 行列扫描法检测时, 先送一列为低电平, 其余几列全为高电平(此时我们确定了列数),然后立即轮流检测一次各行是否有低电平, 若检测到某一行为低电平(这时我们又确定了行数), 则我们便可确认当前被按下的键是哪一行哪一列的, 用同样方法轮流送各列一次低电平,再轮流检测一次各行是否变为低电平, 这样即可检测完所有的按键, 当有键被按下时便可判断出按下的键是哪一个键。 当然我们也可以将行线置低电平, 扫描列是否有低电平。 从而达到整个键盘的检测。

本章所要实现的功能是:通过操作3*3矩阵键盘控制LED指示灯,并且控制LED1指示灯不断闪烁,提示系统正在运行。程序框架如下:

(1)初始化按键IO口(使能对应IO外设时钟、配置IO为普通IO功能和输出模式、上拉设置等) (2)按键检测程序

(3)按键控制程序

 下面是代码编写:

1.新建工程:(之前的博客写过,这里不再写)

2.代码如下

leds.c

#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上拉电阻//LED2端口配置GpioCtrlRegs.GPCMUX1.bit.GPIO67=0;GpioCtrlRegs.GPCDIR.bit.GPIO67=1;GpioCtrlRegs.GPCPUD.bit.GPIO67=0;//LED3端口配置GpioCtrlRegs.GPCMUX1.bit.GPIO66=0;GpioCtrlRegs.GPCDIR.bit.GPIO66=1;GpioCtrlRegs.GPCPUD.bit.GPIO66=0;//LED4端口配置GpioCtrlRegs.GPCMUX1.bit.GPIO65=0;GpioCtrlRegs.GPCDIR.bit.GPIO65=1;GpioCtrlRegs.GPCPUD.bit.GPIO65=0;//LED5端口配置GpioCtrlRegs.GPCMUX1.bit.GPIO64=0;GpioCtrlRegs.GPCDIR.bit.GPIO64=1;GpioCtrlRegs.GPCPUD.bit.GPIO64=0;//LED6端口配置GpioCtrlRegs.GPAMUX1.bit.GPIO10=0;GpioCtrlRegs.GPADIR.bit.GPIO10=1;GpioCtrlRegs.GPAPUD.bit.GPIO10=0;//LED7端口配置GpioCtrlRegs.GPAMUX1.bit.GPIO11=0;GpioCtrlRegs.GPADIR.bit.GPIO11=1;GpioCtrlRegs.GPAPUD.bit.GPIO11=0;GpioDataRegs.GPCSET.bit.GPIO68=1;GpioDataRegs.GPCSET.bit.GPIO67=1;GpioDataRegs.GPCSET.bit.GPIO66=1;GpioDataRegs.GPCSET.bit.GPIO65=1;GpioDataRegs.GPCSET.bit.GPIO64=1;GpioDataRegs.GPASET.bit.GPIO10=1;GpioDataRegs.GPASET.bit.GPIO11=1;EDIS;
}

led.h

#ifndef _LEDS_H_
#define _LEDS_H_#include "DSP2833x_Device.h"     // DSP2833x 头文件
#include "DSP2833x_Examples.h"   // DSP2833x 例子相关头文件#define LED1_OFF        (GpioDataRegs.GPCSET.bit.GPIO68=1)
#define LED1_ON         (GpioDataRegs.GPCCLEAR.bit.GPIO68=1)
#define LED1_TOGGLE     (GpioDataRegs.GPCTOGGLE.bit.GPIO68=1)#define LED2_OFF        (GpioDataRegs.GPCSET.bit.GPIO67=1)
#define LED2_ON         (GpioDataRegs.GPCCLEAR.bit.GPIO67=1)
#define LED2_TOGGLE     (GpioDataRegs.GPCTOGGLE.bit.GPIO67=1)#define LED3_OFF        (GpioDataRegs.GPCSET.bit.GPIO66=1)
#define LED3_ON         (GpioDataRegs.GPCCLEAR.bit.GPIO66=1)
#define LED3_TOGGLE     (GpioDataRegs.GPCTOGGLE.bit.GPIO66=1)#define LED4_OFF        (GpioDataRegs.GPCSET.bit.GPIO65=1)
#define LED4_ON         (GpioDataRegs.GPCCLEAR.bit.GPIO65=1)
#define LED4_TOGGLE     (GpioDataRegs.GPCTOGGLE.bit.GPIO65=1)#define LED5_OFF        (GpioDataRegs.GPCSET.bit.GPIO64=1)
#define LED5_ON         (GpioDataRegs.GPCCLEAR.bit.GPIO64=1)
#define LED5_TOGGLE     (GpioDataRegs.GPCTOGGLE.bit.GPIO64=1)#define LED6_OFF        (GpioDataRegs.GPASET.bit.GPIO10=1)
#define LED6_ON         (GpioDataRegs.GPACLEAR.bit.GPIO10=1)
#define LED6_TOGGLE     (GpioDataRegs.GPATOGGLE.bit.GPIO10=1)#define LED7_OFF        (GpioDataRegs.GPASET.bit.GPIO11=1)
#define LED7_ON         (GpioDataRegs.GPACLEAR.bit.GPIO11=1)
#define LED7_TOGGLE     (GpioDataRegs.GPATOGGLE.bit.GPIO11=1)void LED_Init(void);#endif /* LED_H_ */

key.h

#ifndef _KEY_H_
#define _KEY_H_#include "DSP2833x_Device.h"     // DSP2833x Headerfile Include File
#include "DSP2833x_Examples.h"   // DSP2833x Examples Include File#define KEY_L1_SetL         (GpioDataRegs.GPBCLEAR.bit.GPIO48=1)
#define KEY_L2_SetL         (GpioDataRegs.GPBCLEAR.bit.GPIO49=1)
#define KEY_L3_SetL         (GpioDataRegs.GPBCLEAR.bit.GPIO50=1)#define KEY_L1_SetH         (GpioDataRegs.GPBSET.bit.GPIO48=1)
#define KEY_L2_SetH         (GpioDataRegs.GPBSET.bit.GPIO49=1)
#define KEY_L3_SetH         (GpioDataRegs.GPBSET.bit.GPIO50=1)#define KEY_H1          (GpioDataRegs.GPADAT.bit.GPIO12)//第一行,获取这个为是否为高电平,判断
#define KEY_H2          (GpioDataRegs.GPADAT.bit.GPIO13)//
#define KEY_H3          (GpioDataRegs.GPADAT.bit.GPIO14)//#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 KEY_UNPRESS     0void KEY_Init(void);
char KEY_Scan(char mode);#endif /* APP_KEY_KEY_H_ */

key.c

#include "key.h"
void KEY_Init(void)
{EALLOW;//关闭写保护SysCtrlRegs.PCLKCR3.bit.GPIOINENCLK = 1;// 开启GPIO时钟//KEY端口配置GpioCtrlRegs.GPAMUX1.bit.GPIO12=0;GpioCtrlRegs.GPADIR.bit.GPIO12=0;//配置为输入GpioCtrlRegs.GPAPUD.bit.GPIO12=0;//配置上拉电阻GpioCtrlRegs.GPAMUX1.bit.GPIO13=0;GpioCtrlRegs.GPADIR.bit.GPIO13=0;//配置为输入GpioCtrlRegs.GPAPUD.bit.GPIO13=0;GpioCtrlRegs.GPAMUX1.bit.GPIO14=0;GpioCtrlRegs.GPADIR.bit.GPIO14=0;//配置为输入GpioCtrlRegs.GPAPUD.bit.GPIO14=0;GpioCtrlRegs.GPBMUX2.bit.GPIO48=0;GpioCtrlRegs.GPBDIR.bit.GPIO48=1;//配置为输出GpioCtrlRegs.GPBPUD.bit.GPIO48=0;GpioCtrlRegs.GPBMUX2.bit.GPIO49=0;GpioCtrlRegs.GPBDIR.bit.GPIO49=1;//配置为输出GpioCtrlRegs.GPBPUD.bit.GPIO49=0;GpioCtrlRegs.GPBMUX2.bit.GPIO50=0;GpioCtrlRegs.GPBDIR.bit.GPIO50=1;//配置为输出GpioCtrlRegs.GPBPUD.bit.GPIO50=0;EDIS;GpioDataRegs.GPBSET.bit.GPIO48=1;//输出为高电平GpioDataRegs.GPBSET.bit.GPIO49=1;GpioDataRegs.GPBSET.bit.GPIO50=1;}char KEY_Scan(char mode)
{//行列式扫描方法static char keyl1=1;//static char keyl2=1;static char keyl3=1;//第1列扫描KEY_L1_SetL;//表示第一列输出低电平KEY_L2_SetH;//表示第二列输出低电平KEY_L3_SetH;//表示第三列输出低电平if(keyl1==1&&(KEY_H1==0||KEY_H2==0||KEY_H3==0)){DELAY_US(10000);keyl1=0;if(KEY_H1==0){return KEY1_PRESS;}else if(KEY_H2==0){return KEY4_PRESS;}else if(KEY_H3==0){return KEY7_PRESS;}}else if(KEY_H1==1&&KEY_H2==1&&KEY_H3==1){keyl1=1;}if(mode)keyl1=1;//第2列扫描KEY_L2_SetL;KEY_L1_SetH;KEY_L3_SetH;if(keyl2==1&&(KEY_H1==0||KEY_H2==0||KEY_H3==0)){DELAY_US(10000);keyl2=0;if(KEY_H1==0){return KEY2_PRESS;}else if(KEY_H2==0){return KEY5_PRESS;}else if(KEY_H3==0){return KEY8_PRESS;}}else if(KEY_H1==1&&KEY_H2==1&&KEY_H3==1){keyl2=1;}if(mode)keyl2=1;//第3列扫描KEY_L3_SetL;KEY_L1_SetH;KEY_L2_SetH;if(keyl3==1&&(KEY_H1==0||KEY_H2==0||KEY_H3==0)){DELAY_US(10000);keyl3=0;if(KEY_H1==0){return KEY3_PRESS;}else if(KEY_H2==0){return KEY6_PRESS;}else if(KEY_H3==0){return KEY9_PRESS;}}else if(KEY_H1==1&&KEY_H2==1&&KEY_H3==1){keyl3=1;}if(mode)keyl3=1;return KEY_UNPRESS;
}

这篇关于DSP28335:独立按键控制LED灯的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1069066

相关文章

Python异步编程中asyncio.gather的并发控制详解

《Python异步编程中asyncio.gather的并发控制详解》在Python异步编程生态中,asyncio.gather是并发任务调度的核心工具,本文将通过实际场景和代码示例,展示如何结合信号量... 目录一、asyncio.gather的原始行为解析二、信号量控制法:给并发装上"节流阀"三、进阶控制

使用DrissionPage控制360浏览器的完美解决方案

《使用DrissionPage控制360浏览器的完美解决方案》在网页自动化领域,经常遇到需要保持登录状态、保留Cookie等场景,今天要分享的方案可以完美解决这个问题:使用DrissionPage直接... 目录完整代码引言为什么要使用已有用户数据?核心代码实现1. 导入必要模块2. 关键配置(重点!)3.

SpringSecurity 认证、注销、权限控制功能(注销、记住密码、自定义登入页)

《SpringSecurity认证、注销、权限控制功能(注销、记住密码、自定义登入页)》SpringSecurity是一个强大的Java框架,用于保护应用程序的安全性,它提供了一套全面的安全解决方案... 目录简介认识Spring Security“认证”(Authentication)“授权” (Auth

python之流程控制语句match-case详解

《python之流程控制语句match-case详解》:本文主要介绍python之流程控制语句match-case使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录match-case 语法详解与实战一、基础值匹配(类似 switch-case)二、数据结构解构匹

Spring Security注解方式权限控制过程

《SpringSecurity注解方式权限控制过程》:本文主要介绍SpringSecurity注解方式权限控制过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、摘要二、实现步骤2.1 在配置类中添加权限注解的支持2.2 创建Controller类2.3 Us

Python中如何控制小数点精度与对齐方式

《Python中如何控制小数点精度与对齐方式》在Python编程中,数据输出格式化是一个常见的需求,尤其是在涉及到小数点精度和对齐方式时,下面小编就来为大家介绍一下如何在Python中实现这些功能吧... 目录一、控制小数点精度1. 使用 round() 函数2. 使用字符串格式化二、控制对齐方式1. 使用

Springboot控制反转与Bean对象的方法

《Springboot控制反转与Bean对象的方法》文章介绍了SpringBoot中的控制反转(IoC)概念,描述了IoC容器如何管理Bean的生命周期和依赖关系,它详细讲解了Bean的注册过程,包括... 目录1 控制反转1.1 什么是控制反转1.2 SpringBoot中的控制反转2 Ioc容器对Bea

浅析如何使用Swagger生成带权限控制的API文档

《浅析如何使用Swagger生成带权限控制的API文档》当涉及到权限控制时,如何生成既安全又详细的API文档就成了一个关键问题,所以这篇文章小编就来和大家好好聊聊如何用Swagger来生成带有... 目录准备工作配置 Swagger权限控制给 API 加上权限注解查看文档注意事项在咱们的开发工作里,API

Spring IOC控制反转的实现解析

《SpringIOC控制反转的实现解析》:本文主要介绍SpringIOC控制反转的实现,IOC是Spring的核心思想之一,它通过将对象的创建、依赖注入和生命周期管理交给容器来实现解耦,使开发者... 目录1. IOC的基本概念1.1 什么是IOC1.2 IOC与DI的关系2. IOC的设计目标3. IOC

Python实现局域网远程控制电脑

《Python实现局域网远程控制电脑》这篇文章主要为大家详细介绍了如何利用Python编写一个工具,可以实现远程控制局域网电脑关机,重启,注销等功能,感兴趣的小伙伴可以参考一下... 目录1.简介2. 运行效果3. 1.0版本相关源码服务端server.py客户端client.py4. 2.0版本相关源码1