EDN首页   博客首页 用户登陆  |  注册

日志档案

发表于 2008/9/23 9:50:10

1

标签: 无标签

CC2430基础实验二:按键控制开关

2.1 实验说明

按键控制开关试验是在自动闪烁基础之上完成的。主要是让用户掌握CC2430的按键应用这一常用的人机交互方法,本实验是用两个按键分别控制小灯的亮灭。在这个实验里用到的寄存器分别是P0,P1,P0SEL,P0DIRP1DIRP0INP设置这几个按键的管脚的步骤分别是:功能选择(P0SEL),方向选择(P0DIR),输入模式选择(P0INP)。

   

位号

复位值

操作性

功能描述

P0

7:0

0x00

R/W

P0端口,通用I/O口,可以位寻址

P0SEL(SELP0_x)

7:0

0

R/W

P0口功能选择:0-通用I/O1-外设功能

P0DIR(DIRP0_x)

7:0

0

R/W

P0端口方向:0-输入,1-输出

P0INP(MDP0_x)

7:0

0

R/W

P0_x输入模式:0-上拉/下拉;1-三态

2.2 实验程序

#include <ioCC2430.h>

 

#define uint unsigned int

#define uchar unsigned char

#define ON 0          //定义LED状态,ON为亮,OFF为灭

#define OFF 1

 

//定义控制灯的端口

#define RLED P1_0   

/* 根据原理图,LD1(黄)为P1_0口控制;主扩展板为RLED;从扩展板为D2(红) */

#define GLED P1_1   

/* 根据原理图,LD2(红)为P1_1口控制;主扩展板为GLED;从扩展板为D3(黄) */

#define K1 P0_4         //K1为扩展板的CANCEL键,在P0_4

#define K2 P0_5         //K2为扩展板的OK键,在P0_5

 

//函数声明

void Delay(uint);         //延时函数

void Initial(void);          //LED初始化函数

void InitKey(void);             //按键初始化函数

uchar KeyScan(void);            //按键扫描函数

uchar Keyvalue = 0 ;        //用于存放按键值的变量,初值为0

/****************************

//延时函数

*****************************/

void Delay(uint n)

{

       uint tt;

       for(tt = 0;tt<n;tt++);

       for(tt = 0;tt<n;tt++);

       for(tt = 0;tt<n;tt++);

       for(tt = 0;tt<n;tt++);

       for(tt = 0;tt<n;tt++);

}

/*****************************************

//按键初始化函数,原理图中按键连在P0_4P0_5,所以进行了修改(080913

void InitKey(void)

{

  P1SEL &= ~0X0C;//作用是将P12 P13设为普通I/O口,但默认就是,不知道为什么还要加此语句

  P1DIR &= ~0X0C; //按键在P12 P13

  P1INP |= 0x0c; //上、下拉

}

*****************************************/

void InitKey(void)

{

  //P0SEL &= ~0X30;

P0DIR &= ~0x30; //将连接按键的P0_4P0_5口设置为输入

  P0INP |= 0x30; //P0_4P0_5口的输入状态设置为三态,以读取按键的状态

}

/****************************

//初始化程序

*****************************/

void Initial(void)

{

       P1DIR |= 0x03; //将连接LEDP1_0P11定义为输出

       RLED = 1;

       GLED = 1;     //LED置高电平,LED

}

/*****************************************

//按键扫描函数,检测按键是否按下,若有键按下,则返回相应的值

//K1键按下,则返回1K2键按下,则返回2;没有键按下,返回0

//不知道第二个if(K1 == 0)的作用,在实验三中进行了修改,也可以实现同样的功能

*****************************************/

uchar KeyScan(void)

{

  if(K1 == 0)

  {

    Delay(100);

    if(K1 == 0)

    {

      while(!K1);

      return(1);

    }

  };

 

  if(K2 == 0)

  {

    Delay(100);

    if(K2 == 0)

    {

      while(!K2);

      return(2);

    }

  };

  return(0);

}

/***************************

//主函数

***************************/

void main(void)

{

       Initial();          //调用初始化函数

    InitKey();

       RLED = ON;         //RLED

       GLED = OFF;             //GLED

       while(1)      //循环扫描按键值

       {

          Keyvalue = KeyScan();   //取按键值

          if(Keyvalue == 1)

          {

           RLED = !RLED;      //K1控制RLED

           Keyvalue = 0;      //清除键值

          }

          if(Keyvalue == 2)

          {

            GLED = !GLED;       //K2控制GLED

            Keyvalue = 0;           //清除键值

          }

       }

}

实验源程序来源于WXL的CC2430基础实验,我用的是C51RF-JKS-CC2430
,有些接口和我的板子不一样,所以做了一些改动。

系统分类: 嵌入式   |   用户分类: WXL实验手记   |   来源: 原创   |   【推荐给朋友】   |   【添加到收藏夹】

阅读(494)  |  评论(2)  |  收藏(3)  |  举报  

投一票您将和博主都有获奖机会!

最新评论

  • wobushixing

    2009/7/16 19:02:08

    你好请问你那里还有没有别的WXL的CC2430基础实验的例子了,能不能发给我啊,谢谢了,我的邮箱是wobushixing@126.com

  • zhuhongping320

    2009/7/1 10:49:30

    我是zigbeeCC2430的初学者,用的是smar tRF04EB板子,想知道SFR的用法,书上说的很笼统,看了还是不明白,你知道的话,给我发发资料吧,先谢谢了,我的是邮箱zhuhongping320@163.com。