https://blog.csdn.net/zzz_xxj/article/details/79348397
2018年02月22日 17:47:24 ZZZ_XXJ 阅读数:913 标签: ZigBeeCC2530GPIOLEDKEY 更多
个人分类: ZigBee
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输出状态取反 -
} -
} -
}