.
继续我的第二个实验;实现按键控制
LED亮灭:
功能描述:
上电默认 LD3 亮;
触动一次按键 SW12,LD3 灭 再按一次按键 SW12, LD3亮 再触动一次按键 SW12,LD3 灭 再按一次按键 SW12, LD3亮 。。。。。。
实现每触动一次按键, LED执行一次由亮到灭,或者由灭到亮,也就是实现一次状态反转。
电路连接说明:
LD3 设置为通用 GPIO 上拉输出 初始化后默认为输出 LD3 亮状态; LD3 控制 LED灯的负极,如下图;
SW12 设置为通用 GPIO 上拉输入 该引脚应用滤波功能,且仅在按键抬起时控制 LD3状态发生变化。
按键电路如上图, GPIO53须输出 0,当按键按下时,读取 GPIO50端口值,为 0,当按键未按下时, GPIO50因为上上拉作用,其端口值为 1。
程序设计说明:
按键的读取采用实时扫描的方式(非中断方式) ,功能要求在按键抬起后发
..
.
生 LED状态翻转;所以要记录上一次按键值,并且将当前值 ==1 时,做为按键抬起有效,控制 LED发生状态翻转。
主要程序如下:
==0&&上一次值
while (1) {
EALLOW;
last_Key_SW12 = new_Key_SW12; new_Key_SW12 = Key_SW12();
// 保存旧值 // 读取新值
if ( last_Key_SW12==0 && new_Key_SW12==1)
LD3_TOGGLE();
EDIS;
}
经实际测试, 上述程序可以实现 LD3的翻转,基本达到设计要求。 但是在测试过程中,时好时坏,有时能够看见 LED快速翻转,说明按键有抖动的情况,这里可以考虑 IO 口滤波,即在初始化时,设置 IO 采样周期以及量化串口,设置如下:采样周期设置为 200 时,不再出现抖动现象,按键稳定操作。
源程序如下:
#include #include
\"DSP2833x_Device.h\" \"DSP2833x_Examples.h\"
// DSP2833x Headerfile Include File // DSP2833x Examples Include File
#define #define #define
LD3_ON() LD3_OFF() LD3_TOGGLE()
GpioDataRegs.GPACLEAR.bit.GPIO0 GpioDataRegs.GPASET.bit.GPIO0 GpioDataRegs.GPATOGGLE.bit.GPIO0
= 1
= 1 = 1
#define #define #define
LD4_ON() LD4_OFF() Key_SW12()
GpioDataRegs.GPBCLEAR.bit.GPIO34 GpioDataRegs.GPBSET.bit.GPIO34 GpioDataRegs.GPBDAT.bit.GPIO50
= 1
= 1
..
.
/*
* main.c */ int
main ( void ) {
unsigned char last_Key_SW12=1; // 保留上一次扫描结果,上电默认为未按下状态 unsigned char new_Key_SW12=1; // 保留当前扫描结果,上电默认为未按下状态
InitSysCtrl(); DINT;
IER = 0x0000; IFR = 0x0000;
InitPieCtrl();
InitPieVectTable(); InitGpio();
EALLOW;
//GPIO0 LD3 GpioCtrlRegs. GpioCtrlRegs. GpioCtrlRegs. //GPIO34 LD4 GpioCtrlRegs. GpioCtrlRegs. GpioCtrlRegs. //GPIO50
控制 LED负极
GPAMUX1. bit . GPIO0 = 0; //0 gpio mode GPADIR. bit . GPIO0 GPAPUD. bit . GPIO0 控制 LED负极
= 1; = 0;
//1 output 0 input
//1 enable pullup 0 disable pullup
GPBMUX1. bit . GPIO34 = 0; //0 gpio mode
GPBDIR. bit . GPIO34 = 1; //1 output 0 input
GPBPUD. bit . GPIO34 = 0; //1 enable pullup 0 disable pullup
按键矩阵 SW12输入端
GpioCtrlRegs. GpioCtrlRegs. GpioCtrlRegs. GpioCtrlRegs. GpioCtrlRegs. //GPIO53
GPBMUX2. bit . GPIO50 GPBDIR. bit . GPIO50 GPBPUD. bit . GPIO50
= 0; //0 gpio mode = 0; //1 output 0 input
= 0; //1 enable pullup 0 disable pullup
GPBCTRL. bit . QUALPRD2= 200; // 采样周期 =2*Tsysclkout*200 GPBQSEL2. bit . GPIO50 = 2;
// 采样窗内 3次采样结构相同
按键矩阵负极输出 0
GpioCtrlRegs. GpioCtrlRegs. GpioCtrlRegs.
GPBMUX2. bit . GPIO53 GPBDIR. bit . GPIO53 GPBPUD. bit . GPIO53
= 0; //0 gpio mode = 1; //1 output 0 input
= 0; //1 enable pullup 0 disable pullup
GpioDataRegs. GPBCLEAR. bit . GPIO53 = 1;
LD3_ON(); // 默认输出亮状态 LD4_OFF();
..
.
EDIS; while (1) {
EALLOW;
last_Key_SW12 = new_Key_SW12; new_Key_SW12 = Key_SW12();
// 保存旧值 // 读取新值
if ( last_Key_SW12==0 && new_Key_SW12==1)
}
}
..
LD3_TOGGLE();EDIS;
因篇幅问题不能全部显示,请点此查看更多更全内容