一.前言
通过前一次的实验,相信大家都已经对cc2530程序的编写有了一定的认识,这次我们来操作和实验的是cc2530上的按键模块。
二.原理分析
我们先来看一下按键的原理图:
根据原理图我们可以得出,按键不按下的时候值为0,因为接地,所以,按键要被按下的时候,BUT1和BUT2输入值为1,当检测到它们为1时,按键就为按下的状态,因为P0DIR默认的状态是输入,所以不需要配置IO寄存器,当按键按下时,改变led的状态,来验证实验。
三.程序
#define LED1 P1_0 //LED1为P1_0端口控制
#define LED2 P1_1 //LED2为P1_1端口控制
#define LED3 P1_4 //LED3为P1_4端口控制
#define KEY1 P0_4 //KEY1为P0_4端口控制
/***************** 函 数 名 : Delayms 功能描述 : 毫秒延时 输入参数 : xms:延时时间,如 i=xms 即延时i毫秒 输出参数 : none 返 回 值 : none *********************/
void Delayms(uint xms) { uint i,j; for(i=xms;i>0;i--) for(j=587;j>0;j--); }
/ 函 数 名 : InitLed 功能描述 : LED IO初始化 输入参数 : none 输出参数 : none 返 回 值 : none *************/
void InitLed(void)
{ P1DIR |= 0xff; //P1端口定义为输出
LED1 = 1; //LED1灯熄灭
LED2 = 1;
LED3 = 1; }
/******************** 函 数 名 : KeyScan 功能描述 : 按键检测函数 输入参数 : none 输出参数 : none 返 回 值 : 0:无按键按下 1:按键按下 ***********************/
uchar KeyScan(void)
{
if(KEY1==0)
{ Delayms(2); //延时去抖
if(KEY1==0)
{ while(!KEY1); //松手检测,如果一直按着按键,将一直停在这条语句
return 1; //有按键按下 }
} return 0; //无按键按下 }
/************************* 函 数 名 : main 功能描述 : KEY测试(通用IO的输入/输出使用) 输入参数 : NONE 输出参数 : NONE 返 回 值 : NONE **************************/
void main(void) { InitLed(); //调用初始化函数
while(1)
{ if(KeyScan())
{ LED1=~LED1; //按键改变LED状态
LED2=~LED2;
LED3=~LED3; }
} }
四.总结
通过本次实验,我们学习了如何使用按键来控制cc2530的外设,用键盘扫描函数来检测按键状态的改变,函数中有调用延时函数,用于延时去抖,增加系统的稳定性,可是不断检测会造成占用cpu的工作时间,下一讲介绍一种更好的方式。