物联网之ZIGBEE学习(3) GPIO点灯
我们要学习ZSTACK之前,我们先要学一下,不用ZSTACK的裸机CC2530,先在上面跑跑外设,熟悉一下寄存器和操作再来使用ZSTACK来控制。
宇宙惯例,学新单片机先点个灯。先来看一下我手上这款单片机的原理图
我们就使用按键来控制LED灯实现,按下按键LED灯的状态反转,实现灯的亮灭。
首先看一下我们需要配置的寄存器。 我们在这里主要用到三个寄存器 1.PxSEL 2.PxDIR 3.PxINP
1.P0SEL(P1SEL相同):各个I/O口的功能选择,0为普通I/O功能,1为外设功能
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
P0_7功能 |
P0_6功能 |
P0_5 功能 |
P0_4 功能 |
P0_3 功能 |
P0_2 功能 |
P0_1功能 |
P0_0 功能 |
我们使用的都是普通IO口因此,全部都使用的是0,1可以理解为使用的复用功能,如内部ADC、串口等。
4.P0DIR(P1DIR相同):设置各个I/O的方向,0为输入,1为输出
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
P0_7方向 |
P0_6方向 |
P0_5方向 |
P0_4方向 |
P0_3方向 |
P0_2方向 |
P0_1方向 |
P0_0方向 |
再然后确立了IO口的使用后我们就需要确认IO是输入还是输出,当然LED是IO口输出而,KEY是输入。
6.P0INP(P1INP意义相似) :设置各个I/O口的输入模式,0为上拉/下拉,1为三态模式
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
P0_7模式 |
P0_6模式 |
P0_5模式 |
P0_4模式 |
P0_3模式 |
P0_2模式 |
P0_1模式 |
P0_0模式 |
需要注意的是:P1INP中,只有D7~D2分别设置对应I/O口的输入模式。D1D0两位无作用。
我们要设置KEY是输入时,就必须确定输入的状态,上拉、上拉或者三太、其实三态这个翻译的不太好,应该说时第三种状态即为高阻态(个人理解,如不对请大家指出),那当设置为0时到底是上拉还是下拉呢?
7.P2INP: D0~D4控制P2_0~P2_4的输入模式,0为上拉/下拉,1为三态;
D5~D7设置对P0、P1和P2的上拉或下拉的选择。0为上拉,1为下拉;
D7 |
D6 |
D5 |
D4 |
D3 |
D2 |
D1 |
D0 |
端口2选择 |
端口1选择 |
端口0选择 |
P2_4模式 |
P2_3模式 |
P2_2模式 |
P2_1模式 |
P2_0模式 |
我们看 P2只有5个IO口那P2INP有8位D5~D7设置对P0、P1和P2的上拉或下拉的选择,当然这个设置是针对这一组。
OK,我们了解之后下面就可以编程了。
#include<iocc2530.h>
#define led P1_0
#define key P0_1
typedef unsigned int uint;
typedef unsigned char uchar;
uchar keyval,keyflag;
void Delay(uint n);
void GPIO_INIT();
uchar key_scan();
void main()
{
GPIO_INIT();
while(1)
{
if (key_scan()&0x02)
led = ~led;
Delay(5000);
}
}
void Delay(uint n)
{z
uint i;
for(i=0;i<n;i++);
for(i=0;i<n;i++);
for(i=0;i<n;i++);
for(i=0;i<n;i++);
for(i=0;i<n;i++);
}
void GPIO_INIT()
{
P0SEL &= ~0x02;
P1SEL &= ~0x01;
P0DIR &= ~0x02;
P1DIR |= 0x01;
P1INP |= ~0x01;
led = 0;
// P2INP &= ~0x20;
}
uchar key_scan()
{
if( key == 0 )
{
if(keyflag < 10)
keyflag++;
else
keyflag = 5;
if(keyflag == 2)
keyval |= 0x02;
else
keyval &= ~0x02;
}
else
{
keyflag = 0;
keyval &= ~0x02;
}
return keyval;
}
这个实例中防抖算法写的挺好的可以借鉴,经过这个过程,我们的led灯就可以用按键来控制了。