物联网之ZIGBEE学习(3) GPIO点灯

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_41212307/article/details/81773983

我们要学习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.P0DIRP1DIR相同):设置各个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灯就可以用按键来控制了。

展开阅读全文

没有更多推荐了,返回首页