实例介绍
【实例简介】
基础开发是用来熟悉CC2530F256的资源组成和各接口控制使用,为后面进行基于协议栈应用开发,组网和数据传输时打下基础。通过CC2530的通用IO口点亮LED1和LED2。
【实例原理】
1)先了解LED连接原理图,如下图所示,可以看到P1_0、P1_1两个IO是CC2530的P1端口来控制LED灯亮灭,需要设置CC2530 P1[1:0]为通用IO口、输出模式,这样输出低电平时点亮,高电平时灭。
2)CC2530有三个端口P0[7:0]、P1[7:0]、P2[4:0]共21个通用IO口,设置PX(X=0~2)端口时,主要配置三个寄存器,通过三个寄存器配置21个通用IO:
PXSEL:0为默认通用IO,1为功能接口(如UART串口、TIMER定时器等,后面再研究);
PXDIR:0为默认输入,1为输出;
PXINP:0默认为上拉/下拉,1为三态;在上拉和下拉选择中,在P2INP中进行设置,如下图P2INP[7:5]三位来设置,0默认为上拉,1为下拉。
通用IO配置详细参考CC2530 datasheet.pdf P78开始,上面总结可以看出P2INP[7:5]的设置是针对整个PX端口设置上拉或下拉,在设计作为输入IO时要注意整个端口所有IO电平匹配情况。
3)总结CC2530的IO 口配置后,我们回到具体设计中来,点LED需要配置三个寄存器P1SEL、P1DIR、P1INP:
P1SEL &=~0x03; //00000011取反后与原P1SEL值相与,再赋值给P1SEL,确定最后两位为
//00,即P1_1、P1_0作为通用IO口,其它6位保留原状态
P1DIR |= 0x03; // 00000011与原P1DIR值相或,再赋值给P1DIR,确定最后两位为11,
//即P1_1、P1_0作为输出,其它6位保留原状态
P1INP &=~0X03; // 00000011取反后与原P1INP值相与,再赋值给P1INP,确定最后两位为
//00,即P1_1、P1_0选择上拉/下拉,考虑作为输出,可以不关注上拉还是
//下拉的选择,所以不设置P2INP。
在没有复杂的设计时,我们可以利用默认值简化设计,由于 CC2530 寄存器初始化时默认是: P1SEL =0x00; P1DIR =0x00; P1INP =0X00; P2INP =0X00;
所以 IO 口初始化我们可以简化初始化指令: P1DIR |= 0x03;
【核心代码】源程序代码
/**********************************************
基础开发:点亮LED
**********************************************/
#include <ioCC2530.h>
#define LED1 P1_0 //定义P1_0为LED1控制端
#define LED2 P1_1 //定义P1_1为LED2控制端
void IO_Init(void)
{
P1DIR |=0x03; //简化端口配置,P1_1、P1_0为输出通用IO
}
void main(void)
{
IO_Init(); //调用初始化程序配置IO
while(1)
{
LED1=0; //点亮LED1
LED2=0; //点亮LED2
}
}
【源程序代码】
/*************************************************************************
按键KEY:S1依次控制LED1亮和灭,S2依次控制LED2亮和灭,有键按下时蜂鸣器鸣叫
**************************************************************************/
#include<ioCC2530.h>
#define uint unsigned int
#define uchar unsigned char
#define LED1 P1_0 //定义LED1为P1_0
#define LED2 P1_1 //定义LED2为P1_1
#define KEY1 P0_4 //定义KEY1为P0_4
#define KEY2 P0_5 //定义KEY2为P0_5
#define SP P0_7 //定义SP为P0_7
void Delay(uint); //延时函数,单位为mS
void IO_Init(); //IO配置及初始化
uchar Keyscan(); //按键扫描
void Delay(uint m)
{
uint i,j;
for(i=m;i>0;i--)
for(j=160;j>0;j--); //大概时间为1mS
}
void IO_Init()
{
P1DIR |=0x03; //LED2、LED1的P1_1、P1_0为输出通用IO,默认不亮
LED1=1;
LED2=1;
P0DIR |=0x80; //蜂鸣器的P0.7为输出通用IO,默认不响
SP=1;
}
uchar Keyscan()
{
if(KEY1==0) //扫描是否S1按下
{Delay(100); //按下,延迟100mS防抖动
if(KEY1==0) //确定S1按下,返回1
return 1;
}
if(KEY2==0) //扫描是否S2按下
{Delay(100); //按下,延迟100mS防抖动
if(KEY2==0) //确定S2按下,返回2
return 2;
}
return 0; //无键按下,返回0
}
void main()
{
IO_Init(); //调用初始化
while(1)
{
if(Keyscan()==1) //S1按下时改变LED1状态,并鸣叫1S
{
LED1=~LED1;
SP=~SP;
Delay(1000);
SP=~SP;
}
if(Keyscan()==2) //S2按下时改变LED2状态,并鸣叫1S
{
LED2=~LED2;
SP=~SP;
Delay(1000);
SP=~SP;
}
}
}
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论