DSP2833x实验_按键

按键原理:

 

 按下\释放抖动时间 大约5~10ms;

 

 消除抖动:

1. 硬件消抖。串联RC电路;

2.软件消抖。程序延时delay_ms(10),再采样;

按下扫描:(独立按键(直接判断线上高低电平)/矩阵键盘(行列线接GPIO))

  矩阵键盘检测方法有多种,最常用的是行列扫描和线翻转法。
  行列扫描法检测时, 先送一列为低电平, 其余几列全为高电平(此时我们确定了列数),然后立即轮流检测一次各行是否有低电平, 若检测到某一行为低电平(这时我们又确定了行数), 则我们便可确认当前被按下的键是哪一行哪一列的, 用同样方法轮流送各列一次低电平,再轮流检测一次各行是否变为低电平, 这样即可检测完所有的按键, 当有键被按下时便可判断出按下的键是哪一个键。 当然我们也可以将行线置低电平, 扫描列是否有低电平。 从而达到整个键盘的检测。
  线翻转法,就是使所有行线为低电平时,检测所有列线是否有低电平,如果有, 就记录列线值;然后再翻转, 使所有列线都为低电平, 检测所有行线的值, 由于有按键按下,行线的值也会有变化, 记录行线的值。 从而就可以检测到全部按键。

硬件电路:

 

 软件设计:

/*
 * key.c
 *
 *  Created on: 2021年7月7日
 *      Author: Administrator
 */
#include "key.h"

void KEY_Init(void)
{
   EALLOW;

   GpioCtrlRegs.GPAMUX1.bit.GPIO12 = 0;         // GPIO
   GpioCtrlRegs.GPADIR.bit.GPIO12 = 0;          // input
   GpioCtrlRegs.GPAPUD.bit.GPIO12 =0;

   GpioCtrlRegs.GPAMUX1.bit.GPIO13 = 0;         // GPIO
   GpioCtrlRegs.GPADIR.bit.GPIO13 = 0;          // input
   GpioCtrlRegs.GPAPUD.bit.GPIO13 =0;

   GpioCtrlRegs.GPAMUX1.bit.GPIO14 = 0;         // GPIO
   GpioCtrlRegs.GPADIR.bit.GPIO14 = 0;          // input
   GpioCtrlRegs.GPAPUD.bit.GPIO14 =0;

   GpioCtrlRegs.GPAMUX1.bit.GPIO15 = 0;         // GPIO
   GpioCtrlRegs.GPADIR.bit.GPIO15 = 0;          // input
   GpioCtrlRegs.GPAPUD.bit.GPIO15 =0;

   EDIS;
    }

Uint16 KEY_Scan(Uint16 mode)//mode 0:不支持连按;1:支持连按
{
    static int key_up = 1;//按键按下/松开标志位
    if(mode) key_up = 1;
    if(key_up&&(KEY_1 == 0 || KEY_2 == 0 || KEY_3 == 0 || KEY_4 == 0 ))
    {
        DELAY_US(10000);//延时10ms
        key_up = 0;
        if(KEY_1 == 0) return KEY1_PRESS;
        else if(KEY_2 == 0) return KEY2_PRESS;
        else if(KEY_3 == 0) return KEY3_PRESS;
        else if(KEY_4 == 0) return KEY4_PRESS;
    }
    else if(KEY_1 == 1 && KEY_2 == 1 && KEY_3 == 1 && KEY_4 == 1 ) key_up = 1;
    return 0;
    }

//void main(void)
//{
//    InitSysCtrl();
//
//    LED_Init();
//    KEY_Init();
//    Uint16 key = 0;
//    while(1)
//    {
//        key = KEY_Scan(0);
//        switch(key)
//        {
//            case KEY1_PRESS:LED1_ON,LED4_OFF;break;
//            case KEY2_PRESS:LED2_ON,LED1_OFF;break;
//            case KEY3_PRESS:LED3_ON,LED2_OFF;break;
//            case KEY4_PRESS:LED4_ON,LED3_OFF;break;
//            default: LED5_ON,LED6_ON,LED7_ON,LED8_ON;
//        }
//        DELAY_US(100);
//    }
//    }
/*
 * key.h
 *
 *  Created on: 2021年7月7日
 *      Author: Administrator
 */

#ifndef KEY_H_
#define KEY_H_
#include "DSP2833x_Device.h"     // DSP2833x 头文件
#include "DSP2833x_Examples.h"   // DSP2833x 例子相关头文件

void KEY_Init(void);
Uint16 KEY_Scan(Uint16 mode);

#define KEY1_PRESS        1
#define KEY2_PRESS        2
#define KEY3_PRESS        3
#define KEY4_PRESS        4

#define KEY_1            (GpioDataRegs.GPADAT.bit.GPIO12)
#define KEY_2            (GpioDataRegs.GPADAT.bit.GPIO13)
#define KEY_3            (GpioDataRegs.GPADAT.bit.GPIO14)
#define KEY_4            (GpioDataRegs.GPADAT.bit.GPIO15)

#endif /* KEY_H_ */

 

posted @ 2021-07-07 14:00  百叶集  阅读(477)  评论(0编辑  收藏  举报