2.1 实验说明<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
按键控制开关试验是在自动闪烁基础之上完成的。主要是让用户掌握CC2430的按键应用这一常用的人机交互方法,本实验是用两个按键分别控制小灯的亮灭。在这个实验里用到的寄存器分别是P0,P1,P0SEL,P0DIR,P1DIR和P0INP。设置这几个按键的管脚的步骤分别是:功能选择(P0SEL),方向选择(P0DIR),输入模式选择(P0INP)。
位 名 | 位号 | 复位值 | 操作性 | 功能描述 |
P0 | 7:0 | 0x00 | R/W | P0端口,通用I/O口,可以位寻址 |
P0SEL(SELP0_x) | 7:0 | 0 | R/W | P0口功能选择:0-通用I/O,1-外设功能 |
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_4和P0_5,所以进行了修改(080913)
void InitKey(void)
{
P1SEL &= ~0X<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />0C;//作用是将P12 P13设为普通I/O口,但默认就是,不知道为什么还要加此语句
P1DIR &= ~0X0C; //按键在P12 P13
P1INP |= 0x0c; //上、下拉
}
*****************************************/
void InitKey(void)
{
//P0SEL &= ~0X30;
P0DIR &= ~0x30; //将连接按键的P0_4、P0_5口设置为输入
P0INP |= 0x30; //将P0_4、P0_5口的输入状态设置为三态,以读取按键的状态
}
/****************************
//初始化程序
*****************************/
void Initial(void)
{
P1DIR |= 0x03; //将连接LED的P1_0、P11定义为输出
RLED = 1;
GLED = 1; //将LED置高电平,LED灭
}
/*****************************************
//按键扫描函数,检测按键是否按下,若有键按下,则返回相应的值
//如K1键按下,则返回1;K2键按下,则返回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
,有些接口和我的板子不一样,所以做了一些改动。
用户1623276 2009-7-16 19:02
用户221364 2009-7-1 10:49
用户163410 2008-9-26 18:31
用户162876 2008-9-25 13:58
用户168210 2008-9-25 12:35