zigbee之点灯1
1、单纯亮个灯
2、按键点灯
3、中断点灯
一、单纯的亮个灯
首先找到你的zigbee板子的原理图,找到led灯对应的接口。
在这里我想点亮灯D1和D2,可以看到灯D1和D2对应的接口是P1_0和P1_1
我们可以在cc2530的中文手册中找到端口P1的相关设置
首先P0、P1、P2都是可以用作通用IO口也可以用作外设IO口,具体的选择跟上图是一样的。
PxSEL选择IO是通用还是外设
PxDIR选择是输入还是输出
PxINP设置上拉。要注意P1.0和P1.1没有上拉下拉功能,在这里可以不用设置。
#include <ioCC2530.h>#define LED1 P1_0 //定义P1.0口为LED1控制端
#define LED2 P1_1 //定义P1.1口为LED2控制端/**LED口初始化**/
void InitLed(void)
{P1SEL &= ~0x03; //设置为通用IO口P1DIR |= 0x03; //0000 0011 P1.0,P1.1口定义为输出,LED1 = 1;LED2 = 1; //灯的默认状态为熄灭状态
}void main(void)
{//初始化InitLed();while(1){ LED1 = 0;LED2 = 0;}
}
之所以设定 P1SEL &= ~0x03; P1DIR |= 0x03; 是为了避免对端口其他位置的改变
&按位或 全1为1
P1SEL & 1111 1100(~0000 0011) 最后两位为0,在或运算下,最后两位的值是不会改变的。如果其他位有改变,也不会有影响。
|按位与 有1为1
同理 P1DIR | 0000 0011 最后两位为1,在与运算下,最后两位的值不会改变。
如果要设置流水灯,那么挨个亮灭就可以了
#include <ioCC2530.h>#define LED1 P1_0 //定义P1.0口为LED1控制端
#define LED2 P1_1 //定义P1.1口为LED2控制端/**延时函数**/
void Delayms(int ms)
{int i,j;for(i = 0;i < ms;i++){for(j = 0;j < 535;j++);}
}/**LED口初始化**/
void InitLed(void)
{P1SEL &= ~0x03; //设置为通用IO口P1DIR |= 0x03; //0000 0011 P1.0,P1.1口定义为输出,LED1 = 1;LED2 = 1; //灯的默认状态为熄灭状态
}void main(void)
{//初始化InitLed();while(1){ LED1 = ~LED1;Delayms(500);LED1 = ~LED1;LED2 = ~LED2;Delayms(500);LED2 = ~LED2;}
}
大概最后的效果是D1亮一下灭了然后D2再亮一下灭这样循环。
二、按键点灯
同样是上图
想形成的效果是按一下S1灯开,再按一下灯关。
在这里按键S1的连接端口为P0_1 这个端口有上拉电阻的功能,所以这里要设置P0INP
#include <ioCC2530.h>#define LED1 P1_0 //定义P1.0口为LED1控制端
#define LED2 P1_1 //定义P1.1口为LED2控制端
#define KEY P0_1 //定义P0.1为按键S1控制端/**延时函数**/
void Delayms(int ms)
{int i,j;for(i = 0;i < ms;i++){for(j = 0;j < 535;j++);}
}
/**LED口初始化**/
void InitLed(void)
{P1SEL &= ~0x03; //设置为通用IO口P1DIR |= 0x03; //0000 0011 P1.0,P1.1口定义为输出,LED1 = 1;LED2 = 1; //灯的默认状态为熄灭状态
}
/**按键初始化**/
void KeyInit(void)
{P0SEL &= ~0x02; //设置P0.1为普通IO口 0000 0010P0DIR &= ~0x02; //设置P0.1为输入模式P0INP &= ~0x02; //打开上拉电阻
}
/**读取按键状态,KEY=0表示按键被按下,KEY=1表示按键抬起**/
int KeyScan(void)
{if(KEY == 0){Delayms(10);if(KEY == 0){while(!KEY){return 1;}}}return 0;
}
void main(void)
{//初始化InitLed();KeyInit();while(1){ if(KeyScan()){LED1 = ~LED1;LED2 = ~LED2;}}
}
这个代码IAR单步运行调试的时候是显示是对的,全速运行的时候有的时候按下会亮有的时候不会,不知道是代码逻辑问题还是哪里我没注意到的问题。
三、中断点灯
首先这里关于中断有几个概念。
中断向量:中断服务程序的入口地址。每个中断源都对应一个固定的入口地址。当内核响应中断请求时,就会暂停当前的程序执行,然后跳转到该入口地址执行代码。
中断服务函数: 内核响应中断后执行的相应处理程序。
CPU 有 18 个中断源。每个中断源都有它自己的位于一系列 SFR 寄存器中的中断请求标志。相应标志位请求的每个中断可以分别使能或禁用。
表2-5
大概意思就是,我请求一个中断,这个中断作用在某个端口,在这里,我是按下S1的按键后请求一个中断,这个中断响应在灯的P0口。而在中断源会有设置中断屏蔽,如果P0要响应就得开相应的设置。
注意一定要清楚中断标志,不然就会一直中断。
/******通过按键S1产生外部中断改变LED1状态******/#include <ioCC2530.h>
#define LED1 P1_0
#define KEY1 P0_1/**延时函数**/
void Delayms(int ms)
{for(int i = 0;i < ms;i++){for(int j = 0;j < 535;j++);}
}/**灯初始化**/
void InitLed(void)
{P1DIR |= 0x01; //定义为输出口LED1 = 1; //LED1默认熄灭
}/**按键初始化**/
void InitKey()
{P0IEN |= 0x2; //P0.1设置为中断方式1PICTL |= 0x1; //下降沿触发IEN1 |= 0x20; //允许P0口中断P0IFG = 0x00; //初始化中断标志位EA = 1; //打开总中断
}/**中断函数**/
#pragma vector = P0INT_VECTOR__interrupt void PA(void)
{Delayms(10); //消抖LED1 = ~LED1;P0IFG = 0; //清理中断标志P0IF = 0; //要清理中断标志位不然一直一直中断
}/**主函数**/
void main(void)
{InitLed();InitKey();while(1){}
}
小声bb一个我容易混乱的点
因为这里大多都是字节运算 八位的顺序是从右往左为0~7
意思就是 76543210 0位是最右边是端口上的0位比如P1_0
zigbee之点灯1相关推荐
- zigbee按键点灯
zigbee点灯程序-1024程序员节日快乐 最近开始了专业课的学习,我们所使用到的zigbee模块搭载于51芯片,大致的使用与51开发板使用 差不多,不过功能更加的强大,多了很多难记得中断,以及通信 ...
- ZigBee无线点灯示例
light_switch.c代码详解:无论你看哪个实验的代码,首先要找的就是main函数: void main ( void ) {uint8 appMode = NONE; /* 不设置模块的模 ...
- ai-人工智能的本质和未来_人工智能的历史-从一开始
ai-人工智能的本质和未来 In the seminal paper on AI, titled Computing Machinery and Intelligence, Alan Turing f ...
- Zigbee 学习计划——第4天——基于CC2530 Basic RF的无线点灯
就像Hellow world一样,无线点灯也是Zigbee的经典例子.根据<网蜂实战演练>中介绍,虽然还没有用到协议栈,但它体现出来的数据发送.接收和用协议栈是差不多的,而且TI公司的Ba ...
- ZigBee远程无线点灯
ZigBee远程无线点灯 一.任务要求: 二.任务逻辑分析: 三.逻辑代码实现: 四.开发中注意的事项: 一.任务要求: 大棚种植区改造过程中提出新的需求,要求部分设备需要支持短距离无线 通讯控制风扇 ...
- ZIGBEE通讯-10.ZigBee协议栈的无线点灯
在ZIGBEE协议栈中已经自带了按键与LED的驱动与使用函数,所以只需要将按键与LED修改为使用的开发板所连接IO就可以使用了.接下来将主要分析在协议栈中按键的初始化.按键的检测以及按键事件的传递与处 ...
- TI Zigbee Light Link 参考设计
TI Zigbee Light Link 参考设计 原文出处: http://processors.wiki.ti.com/index.php/Category:ZigBee_Light_Link ...
- ZigBee 3.0实战教程-Silicon Labs EFR32+EmberZnet:学习教程目录
[源码.文档.软件.硬件.技术交流.技术支持,入口见文末] [所有相关IDE.SDK和例程源码均可从群文件免费获取,免安装,解压即用] 持续更新中,欢迎关注! 一.理论 ZigBee 3.0理论教程- ...
- 《ZigBee实战演练》
转一个多年前的帖,看内容就知道: 为什么学习 ZigBee? 试想着有一天,你坐在电脑前,你家里的空调.冰箱.洗衣机.电视,等在你屏幕前受你掌控时,这便是物联网的时代.我是一名普通的电子爱好者,半年前 ...
最新文章
- ubuntu字符界面login_Ubuntu字符界面输入密码始终提示错误 login incorrect 解决办法...
- Reverse Linked List
- 程序员面试系列——约瑟夫环
- 登录mysql时 未找到 grant命令_我在mysql数据库中可以登陆,为什么用grant命令创建用户时提示错误?...
- 【HDU - 1281 】棋盘游戏 (经典的二分图匹配,匈牙利算法,枚举删除顶点,必须边,关建边)
- 单线程会导致死锁吗?
- post请求改成body_如何使用BODY快速发送POST请求
- Clob类型转换为String
- C++程序设计必知:多文件结构和编译预处理命令
- ArcGIS API 离线字体库加载及跨域问题解决
- C4D多边形建模快捷键
- java设置单元格为文本_怎样设置单元格属性为文本格式?
- 天下所有的事,都是为了利益,都是按利益逻辑规律在运行,发生的一切事情都可以用利益逻辑来解释
- 博客摘录「 2022年C语言程序设计题库习集带答案(史上最全版)」2023年5月2日
- BERT微调(SQuAD v1.1)
- RTT(往返时间)和RPC
- vs2015 产品密钥
- 13 ,CSS 入门基础,行内排版内嵌式排版和外部排版样式
- 对于手机号和邮箱的格式验证
- vue手把手教你实现论坛bbs——(一)项目骨架
热门文章
- 美食微信公众号裂变引流?地方美食公众号怎么引流?
- 为什么最近这么多人去注册菲律宾公司?
- numpy 实现mask叠加原图
- java 非模态_JavaScrip高级应用:操作模态与非模态对话框
- 老电脑安装Windows11方法(不能保证全部都能用)
- 2013国内IT行业薪资对照表【技术岗位】
- MFC+HPSocket+log4cplus的TCP助手(一、界面绘制)
- oracle闪回某个时间点的数据库,Oracle 闪回总结
- linux 如何禁用wifi,如何禁用内置 wifi并仅使用USB wifi卡?
- 为赢取市场,vivo手机性价比超过小米,性价比旗手易位