ZigBee开发(3)--基础实验按键
CC2530 的 IO 口配置我们需要配置三个寄存器 P1SEL 、 P1DIR 、 P1INP。功能如下表所示: (详细参考 CC2530 datasheet.pdf)
* P1SEL (0:普通 IO 口 1:第二功能)
* P1DIR (0:输入 1:输出 )
* P1INP (0:上拉/下拉 1:三态 )
按照表格寄存器内容,我们对 LED1 和按键 S1,也就是 P1.0 和 P0.0 口进行配置,
当 P1.0 输出高电平时 LED1 被点亮,S1 按下时 P0.0 被拉低。所以配置如下:
LED1 初始化:
1 P1SEL &=~0x01; //作为普通 IO 口 2 P1DIR |= 0x01; //P1_0 定义为输出 3 P1INP |= 0X01; //打开下拉
按键 S1 初始化:
1 P0SEL &= ~0X01; //设置 P00 为普通 IO 口 2 P0DIR &= ~0X01; //按键在 P00 口,设置为输入模式 3 P0INP &= ~0x01; //打开 P00 上拉电阻,不影响
由于 CC2530 寄存器初始化时默认是:
P1SEL = 0x00; P1DIR = 0x00 ; P1INP = 0X00;
所以 IO 口初始化我们可以简化初始化指令:
1 P1DIR |= 0x01; //P1_0 定义为输出 2 P1INP |= 0X01; //打开下拉 3 P0DIR &= ~0X10; //按键在 P00 口,设置为输入模式
实例程序源代码:
1 /************************************** 2 程序描述:依次按下按键 S1 控制 LED1 的亮和灭 3 **************************************/ 4 #include <ioCC2530.h> 5 #define uint unsigned int 6 #define uchar unsigned char 7 //定义控制 LED 灯的端口 8 #define LED1 P1_0 //LED1 为 P1.0 口控制 9 #define KEY1 P0_0 //KEY1 为 P0.0 口控制 10 //函数声明 11 void Delayms(uint); //延时函数 12 void InitLed(void); //初始化 LED1 13 void KeyInit(); //按键初始化 14 uchar KeyScan(); //按键扫描程序 15 /**************************** 16 延时函数 17 *****************************/ 18 void Delayms(uint xms) //i=xms 即延时 i 毫秒 19 { 20 uint I,j; 21 for(i=xms;i>0;i--) 22 for(j=587;j>0;j--);45 23 } 24 /**************************** 25 LED 初始化函数 26 *****************************/ 27 void InitLed(void) 28 { 29 P1DIR |= 0x01; //P1_0 定义为输出 30 P1INP |= 0X01; //打开下拉 31 LED1 = 0; //LED1 灯熄灭 32 } 33 /**************************** 34 按键初始化函数 35 *****************************/ 36 void InitKey() 37 { 38 P0SEL &= ~0X01; //设置 P00 为普通 IO 口 39 P0DIR &= ~0X01; //按键在 P00 口,设置为输入模式 40 P0INP &= ~0x01; //打开 P00 上拉电阻,不影响 41 } 42 /**************************** 43 按键检测函数 44 *****************************/ 45 uchar KeyScan(void) 46 { 47 if(KEY1==0) 48 { 49 Delayms(10); //去抖动 50 if(KEY1==0) 51 { 52 while(!KEY1); //松手检测46 53 return 1; //有按键按下 54 } 55 return 0; //无按键按下 56 } 57 } 58 /*************************** 59 主函数 60 ***************************/ 61 void main(void) 62 { 63 InitLed(); //调用初始化函数 64 InitKey(); 65 while(1) 66 { 67 if(KeyScan()) //按键改变 LED 状态 68 LED1=~LED1; 69 } 70 }
我的板子上有2两个按键:
#include<ioCC2530.h> #define LED1 P1_0 //定义P10口为LED1控制端 #define LED2 P1_1 //定义P11口为LED2控制端 #define LED3 P1_4 //定义P14口为LED3控制端 #define KEY1 P0_1 #define KEY2 P2_0 void IO_Init(void) { /* P1SEL (0:普通 IO 口 1:第二功能) P1DIR (0:输入 1:输出 ) P1INP (0:上拉/下拉 1:三态 ) */ P1SEL &= ~0x13; P0SEL &= ~0x02; P2SEL &= ~0x01; //P1DIR |= 0x01; //P1_0定义为输出 P1DIR |= 0x13; //P10、P11、P14定义为输出 P0DIR &= ~0x02; P2DIR &= ~0x01;//P01,P20定义为输入 P1INP &= ~0X13; //打开下拉 P0INP &= ~0X02; //打开下拉 P2INP &= ~0X01; //打开下拉 LED1 = 1; //关闭LED1 LED2 = 1; //关闭LED2 LED3 = 1; //关闭LED3 } void main(void) { IO_Init(); //调用初始化程序 while(1) { if(KEY1 == 0) { LED1 = !LED1; while(!KEY1); } if(KEY2 == 0) { LED2 = !LED2; while(!KEY2); } } }