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输出状态取反
-
}
-
}
-
}