CC2530学习笔记(2)—— IO端口基本操作(按键控制亮灯)
关于CC2530的IO端口基本知识、IO端口有关寄存器的介绍和描述请参照:CC2530学习笔记(1)—— IO端口
电路原理图如图1所示:
图1 按键和LED灯电路连接原理图
分析:本操作中不涉及IO端口中断,采用轮询方式实现操作。要求按一个按键亮一个灯,再按键灯熄灭。所以我们需要及时的检测按键是否被按下。原理图中两个LED当IO端口输出低电平时亮,三个按键当被按下时IO端口为低电平。
寄存器配置:
- LED对应的P0_1、P0_4配置为通用IO引脚,方向为输出,初始电平为高电平。
- 按键对应的P1_1、P2_0配置为通用IO引脚,方向为输入。
程序:
/**************************************
*本次操作只需添加以下这个头文件
*************************************/
#include <ioCC2530.h>
#define LED2 P0_1
#define LED3 P0_4
#define KEY3 P1_1
#define KEY4 P2_0
/***********************************
*初始化LED
**********************************/
void LEDInit(void)
{
/*********LED2************/
P0SEL &= ~(1<<1); //通用IO
P0DIR |= 1<<1; //方向为输出
LED2 = 1; //初始输出高电平,灯灭
/*********LED3************/
P0SEL &= ~(1<<4); //通用IO
P0DIR |= 1<<4; //方向为输出
LED3 = 1; //初始输出高电平,灯灭
}
/***********************************
*初始化按键
**********************************/
void KEYInit(void)
{
/*********KEY3************/
P1SEL &= ~(1<<1); //通用IO
P1DIR &= ~(1<<1); //方向为输入
/*********KEY3************/
P2SEL &= ~(1<<0); //通用IO
P2DIR &= ~(1<<0); //方向为输入
}
/***********************************
*毫秒级延迟函数
**********************************/
void Delayms(unsigned int ms)
{
unsigned int i,j;
for (i = ms; i > 0; i--)
{
for (j = 587; j > 0; j--);
}
}
/***********************************
*按键扫描函数
**********************************/
void KEYScan(void)
{
if (0 == KEY3)//当KEY3按下
{
Delayms(10);//去抖
LED2 = ~LED2; //P0_1输出状态取反
}
else if(0 == KEY4)//当KEY4按下
{
Delayms(10);//去抖
LED2 = ~LED2; //P0_4输出状态取反
}
}
void main()
{
LEDInit();
KEYInit();
while(1)
{
KEYScan();
}
}
2018.07.10更新:
前面的代码中,按键扫描函数其实是有点小问题的,改成下面的样子效果会好些。
/***********************************
*按键扫描函数
**********************************/
void KEYScan(void)
{
if (0 == KEY3)//当KEY3按下
{
Delayms(10);//去抖
if (0 == KEY3)//再次判断
{
LED2 = ~LED2; //P0_1输出状态取反
}
}
else if(0 == KEY4)//当KEY4按下
{
Delayms(10);//去抖
if(0 == KEY4)//再次判断
{
LED2 = ~LED2; //P0_4输出状态取反
}
}
}