ZigBee入门-CC2530-实验(二)-按键(查询/中断)控制LED代码
实验目的:
熟悉通用I/O寄存器,学会使用寄存器进行GPIO的编程。
以及学会通过按键的(查询/中断)的方式去控制LED灯的状态。
实验内容:
1.硬件连接。
2.相关的寄存器的设置。
3.程序编写。
实验过程:
1.硬件电路设计:
(1).LED采用低电平有效的方式,即相应的的I/O端口输出低电平时,LED灯点亮。
(2).按键采用输入上拉模式:即没有按键按下时,该端口为高电平,如果有按键按下时,该端口为低电平。
2.相关的寄存器配置:
PXSEL:功能选择寄存器 0:通用I/O 1:外设功能
PXDIR:方向寄存器 0:输出 1:输出
PXINP:用作输入时,通用 I/O 端口引脚可以设置为上拉、下拉或三态操作模式。
3.编写代码
/*按键查询的方式控制LED灯的亮灭,每当按键按下后松开一次,
*LED灯的状态就改变一次 */
#include <ioCC2530.h>
#define uint unsigned int
#define uchar unsigned char
#define LED1 P1_0 //定义P1.0口为LED1控制端
#define SW1 P0_5 //定义按键SW1 为P0_5脚
void Init_Led(); //声明初始化LED函数
void Init_Key(); //声明初始化按键函数
void Scan_Key(); //声明按键检测函数
void Delay(uint ms); //声明延时函数
/*====================主程序入口====================*/
void main()
{
Init_Led(); //初始化LED1灯
Init_Key(); //初始化按键SW1
while(1)
{
Scan_Key(); //一直检测按键
}
}
/*================声明函数的具体实现================*/
void Init_Led()
{
P1SEL &=~ 0x01; //配置P1.0 为通用I/O口
P1DIR |= 0x01; //配置P1.0 为输出
LED1 = 1; //初始LED1为熄灭
}
void Init_Key()
{
P0SEL &= ~0x20; //配置P0.5 为通用I/O口
P0DIR &= ~0x20; //配置P0.5 为输入
P0INP &= ~0x20; //配置P0.5 的端口输入方式为:上拉/下拉
P2INP &= ~0x20; //将P0端口和P1端口引脚设置为:上拉
}
void Scan_Key()
{
if(SW1 == 0) //判断SW1有低电平信号
{
Delay(100); //延时去抖动
if(SW1 == 0) //再次判断SW1有低电平信号
{
while(SW1 == 0); //等待SW1松开
LED1 ^= 1; //LED1灯的状态改变
}
}
}
void Delay(uint ms) //毫秒级延时函数
{
uint i,j;
for(i=0;i<ms;i++)
for(j=0;j<535;j++);
}
实验 :按键外部中断 涉及到的寄存器
PXIEN:端口中断屏蔽寄存器: 0:中断禁止 1:中断使能
PICTL:端口中断控制寄存器: 0:上升沿触发 1:下降沿触发
IEN1:中断使能控制寄存器: 0:中断使能 1:中断禁止
PXIFG:端口X的中断状态标志位:0:无中断 1:中断产生
/*按键中断的方式控制LED灯的亮灭,每当按键按下后松开一次,
*LED灯的状态就改变一次 */
#include <ioCC2530.h>
#define uint unsigned int
#define uchar unsigned char
#define LED1 P1_0 //定义P1.0口为LED1控制端
#define SW1 P0_5 //定义按键SW1 为P0_5脚
void Init_Led(); //声明初始化LED函数
void Init_Key(); //声明初始化按键函数
void Scan_Key(); //声明按键检测函数
void Delay(uint ms); //声明延时函数
/*====================主程序入口====================*/
void main()
{
Init_Led(); //初始化LED1灯
Init_Key(); //初始化按键SW1
while(1); //等待中断产生
}
/*================中断响应服务子程序================*/
#pragma vector = P0INT_VECTOR //P0口的中断入口矢量地址
__interrupt void P0_ISR() //中断服务子程序
{
if( P0IFG & 0X20) //确保是P0.5脚引发的中断
{
P0IFG = 0; //先清0中断标志位,一定要手动清除
LED1 = !LED1; //LED灯状态改变
}
}
/*================声明函数的具体实现================*/
void Init_Led()
{
P1SEL &=~ 0x01; //配置P1.0 为通用I/O口
P1DIR |= 0x01; //配置P1.0 为输出
LED1 = 1; //初始LED1为熄灭
}
void Init_Key()
{
P0SEL &= ~0x20; //配置P0.5 为通用I/O口
P0DIR &= ~0x20; //配置P0.5 为输入
P0INP &= ~0x20; //配置P0.5 的端口输入方式为:上拉/下拉
P2INP &= ~0x20; //将P0端口和P1端口引脚设置为:上拉
P0IFG &= 0X00; //初始化中断标志位(清零)
P0IEN |= 0X20; //P0.5设置为中断使能 (管脚打开中断)
IEN1 |= 0X20; //允许P0口中断 (端口打开中断)
PICTL |= 0x01; //设置下降沿触发 (配置触发方式)
EA = 1; //开总中断 (最后开总开关)
}
void Delay(uint ms) //毫秒级延时函数
{
uint i,j;
for(i=0;i<ms;i++)
for(j=0;j<535;j++);
}
CC2530的GPIO上电复位后每个I/O口都是默认通用、输入、上拉模式,所以网上别的代码就直接省略了这部分寄存器的配置,我都写出来了,就是想让大家把这些最基础的寄存器配置要搞明白不要忘掉,如果大家觉得实验中一些寄存器的配置不是很明白,大家就拿出咱们吃饭的家伙CC2530的数据手册来把实验中出现的寄存器在手册中查找,去理解,数据手册网上多的是。
啃骨头,要好好啃,使劲啃,啃到底,才能啃到精髓嘛~~
我会每天更新一篇ZigBee入门-CC2530-的基础实验,让大家学习Zigbee技术不在是从入门到“入土”,而是从入门到巅峰~!!!
欢迎大家的留言和评论我会在看到的第一时间内答复。
看完后感觉得到帮助的小伙伴,要点点赞哦~
给笔者一些动力嘛!谢谢啦~