本节目的:利用按键控制流水灯的开启,也就是CC2530的输入与输出功能,还是按照硬件电路-寄存器配置-代码编写3个阶段
1 硬件电路
输出在上一节中已经说明,本节重点在CC2530的输入,通过电路图可以得到,key1按键与P0_1连接在一起,当按键没有按下时,P0_1通过上拉电阻与3.3V连接,也就是说当按键没有按下时,此时端口的电平为高电平。当按键按下时,P0_1与GND连接,也就是说当按键按下时,此时端口的电平为低电平,所以得到一个思路,通过检测P0_1的电平状态就可以判断是否按下按键。
2 寄存器配置
在该实验中,首先分析用到的引脚,分别是输出引脚P1_0, P1_1和输入引脚P0_1,其中对应的寄存器分别为P1SEL、P1DIR和P0SEL、P0DIR;其配置方法如下表:
本节主要针对按键P0端口进行配置,代码如下:
P0SEL &= ~0x02; //设置 P0.1 为普通 IO 口
P0DIR &= ~0x02; //按键接在P0.1口上, 设P0.1为输入模式
(1)将P0.1端口设置为通用I/O功能,则对应的P0SEL应为11111101,即对应程序中的P0SEL &= ~0x02;首先0x02为00000010,取反为11111101,与P0SEL做“与”运算,则无论P0SEL第2位是几,其结果都会是0,所以通过这一步,就可以将P0.1端口设置为通用I/O功能。
(2)将P0.1端口设置为输入功能,因为输入功能才可以读取引脚电平才可以判断按键是否按下。故P0DIR也应该为11111101,所以程序为P0DIR &= ~0x02
3 代码编写
按键初始化
/****************************
//按键初始化
*****************************/
void InitKey(void)
{
P0SEL &= ~0X02;
P0DIR &= ~0X02; //按键在P01口,设置为输入模式
}
按键函数
uchar KeyScan(void)
{
if(KEY1 == 0) //低电平表示按下
{
Delay(100); //去抖
if(KEY1 == 0) //还是低电平
{
while(KEY1==0); //直到松开按键
return(1);
}
}
return(0);
}
主函数:
/***************************
//主函数
***************************/
void main(void)
{
InitIO(); //初始化LED灯控制IO口
InitKey(); //初始化按键控制IO口
while(1)
{
Keyvalue = KeyScan(); //读取按键动作
if(Keyvalue == 1) //按下按键KEY1,弹起时流水方向:LED3->LED2->LED1倒序流水闪烁
{
LED3 = !LED3;
Delay(20000);
LED2 = !LED2;
Delay(20000);
LED1 = !LED1;
Delay(20000);
}
}
}