DSP28335基础教程——GPIO输入(矩阵按键扫描)

Posted Sk Electronics

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DSP28335基础教程——GPIO输入(矩阵按键扫描)相关的知识,希望对你有一定的参考价值。

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_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输出(流水灯实验)

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

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

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

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

DSPTMS320F28335的GPIO