关于按键去抖等的一些问题,基础(附完整代码、注释)
/******************************************************************************
XWWK-CC2530A模块按键测试程序
Filename: CC2530KeyTest.c
Target: cc2530
Revised: 2012-01
Revision: 1.0
Description:
问题:两个按键控制不同灯的状态,但是必须轮流按,才起作用,也即是说,单独按一个键,只执行一次。
备注:每个按键我都独立测试过的,硬件上没有问题,独立测试也都可以实现相应功
******************************************************************************/
#include <ioCC2530.h>
#define uint unsigned int
#define uchar unsigned char
//定义控制灯的端口
#define RLED P1_0 //定义LED1为P10口控制
#define GLED P1_1 //定义LED2为P11口控制
//#define KEY1 P1_2 //定义按键为P12口控制(配置XWWk供电底板)
#define KEY1 P0_1
#define KEY2 P2_0
#define KEY3 P1_2
//函数声明
void Delay(uint);//延时函数声明
void InitIO(void);//初始化函数声明
void InitKey(void); //初始化按键函数声明
uchar KeyScan(void); //按键扫描函数声明
uchar Keyvalue = 0 ; //定义变量记录按键动作
uint KeyTouchtimes = 0 ; //定义变量记录按键次数
/****************************
//延时
*****************************/
void Delay(uint n)
{
uint i;
for(i = 0;i<n;i++);
for(i = 0;i<n;i++);
for(i = 0;i<n;i++);
for(i = 0;i<n;i++);
for(i = 0;i<n;i++);
}
/****************************
//按键初始化
*****************************/
void InitKey(void)
{
P0SEL &= ~0x01;//按键K1
P0DIR &= ~0x01;
P0INP |= 0x01;
P2SEL &= ~0x00;//按键K2
P2DIR &= ~0x00;
P2INP |= 0x00;
P1SEL &= ~0x04;//按键K3
P1DIR &= ~0x04;
P1INP |= 0x04;
}
/****************************
//初始化程序,将P10、P11、P14定义为输出口,并将LED灯初始化为灭
*****************************/
void InitIO(void)
{
P1DIR |= 0x03; //P10、P11 定义为输出
RLED = 0;
GLED = 0;
}
/*****************************************
//按键动作记录函数
*****************************************/
uchar KeyScan(void)
{
if(KEY1 == 1) //高电平有效
{
Delay(100); //检测到按键
if(KEY1 == 1)
{
while(KEY1); //直到松开按键
return(1);
}
}
if(KEY2 == 1) //高电平有效
{
Delay(100); //检测到按键
if(KEY2 == 1)
{
while(KEY2); //直到松开按键
return(2);
}
}
if(KEY3 == 1) //高电平有效
{
Delay(100); //检测到按键
if(KEY3 == 1)
{
while(KEY3); //直到松开按键
return(3);
}
}
return(0);
}
/***************************
//主函数
***************************/
void main(void)
{
InitIO();//初始化LED灯控制IO口
InitKey(); //初始化按键控制IO口
while(1)
{
Keyvalue = KeyScan(); //读取按键动作
if(Keyvalue == 1) //按下按键设置为LED3,LED2,LED1倒序流水闪烁
{
GLED = !GLED;
Delay(20000);
// RLED = !RLED;
// Delay(20000);
InitKey();
}
if(Keyvalue == 2) //按下按键设置为LED3,LED2,LED1倒序流水闪烁
{
GLED = !GLED;
Delay(20000);
RLED = !RLED;
Delay(20000);
InitKey();
}
}
}