CC2530 IO口输入_按键实验
实验内容
- 使用
IAR Embedded Workbench
编写程序,要求在LED模块按下相应按键后,按键对应的LED状态翻转,S1、S2、S3和S4分别对应四个LED灯。
实验目的
- 了解按键的工作原理;
- 掌握CC2530上的IO口作为输入端口的配置方法;
- 加深对编程思想理解。
实验环境
实验所需硬件
序号 | 名称 | 数量 | 备注 |
---|---|---|---|
1 | 电脑 | 1台 | 系统Windows7及以上 |
2 | CC2530底座模块 | 1个 | · |
3 | LED模块 | 1个 | · |
4 | CC Debugger 仿真器和连接线 | 1套 | · |
5 | USB线 | 1根 | · |
6 | 配套按键实验代码 | 1份 | · |
实验所需软件
- IAR 驱动安装步骤
- CC Debugger 驱动安装步骤
- Git 软件下载(可选)
CC2530底座 & LED模块 & CC Debugger 仿真器和连接线
USB线
实验要求
- 掌握PxDIR、PxSEL和PxINP三个寄存器的功能以及配置方法;
- 掌握按键编程的方法,能够编程读取按键的状态,并根据按键动作编程实现相关模块的控制。
实验原理
输入口简介
CC2530的IO口需要配置三个寄存器PxSEL、PxDIR和PxINP,功能如下表所示:
寄存器 | 备注 |
---|---|
P0SEL(0XF3) | P0[7:0] 功能设置寄存器,默认设置为普通IO口 |
P0INP(0X8F) | P0[7:0] 作输入口时的电路模式寄存器 |
P0DIR(0XFD) | P0口输入输出设置寄存器,0:输入,1:输出 |
- PxSEL (0:普通 IO口,1:第二功能);
- PxDIR (0:输入,1:输出 );
- PxINP (0:上拉/下拉,1:三态 )。
按照表格寄存器内容,对LED和按键进行初始化。按键对应LED:按键S1开关LED1、S2开关LED2、S3开关LED3、S4开关LED4。
硬件设计
连接原理图
实验步骤
① CC2530底座模块安装LED模块,用CC Debugger连接底座与计算机:
② 轻按CCDebugger复位按键,指示灯变绿,表示连接正常。如下图:
③ 访问github,进入github界面后点击Code,Clone HTTPS安全链接,如下图所示:
④ 打开电脑终端,进入工作目录workspace (workspace 为工程文件夹所在目录):
cd workspace
⑤ 运行clone
命令:
git clone https://github.com/aiotcom/eps.git
下载目录至指定文件夹下。
如果提示“command not found”表示电脑没有安装Git,请至Git官网下载。
如果电脑没有安装 Git 软件,也可以进入Github,点击 Code
-> DownLoad ZIP
下载所有工程代码。如下图所示:
如果电脑没有公网,可以进:D盘\实验教程与代码选择相应的代码。
⑥ 打开 IAR Embedded Workbench 工程软件,点击工具栏: File
-> Open
-> Workspace
,选择工程文件:CC2530基础实验\2.按键\KEY.eww
并打开。
⑦ 点击Make
按钮,重新编译文件,显示没有错误。
⑧ 点击Download and Debug
按钮,将程序下载到模块中。
⑨ 点击X
退出仿真模式。
⑩ 移除CC Debugger
仿真器,采用USB线供电。
⑪ 观察实验:
按下S1,LED1灯亮,再次按下S1熄灭;
按下S2,LED2灯亮,再次按下S2熄灭;
按下S3,LED3灯亮,再次按下S3熄灭;
按下S4,LED4灯亮,再次按下S4熄灭。
代码讲解
① 程序目录结构,如下图。主要的工程文件是delay.c、KEY.c、LED.c、main.c。
② main.c代码,完成整个代码的逻辑控制:
void main(void)
{
static uint8_t key = 0;
Hal_Init_32M();//初始化系统32M时钟
LED_Init();//初始化LED模块的LED灯控制接口
KEY_Init();//初始化LED模块的按键控制接口
while(1)
{
key = KEY_Scan(0);//获取按键
switch(key)
{
case S1_PRES://按键S1按键下
LED1 = ~LED1;
break;
case S2_PRES://按键S2按键下
LED2 = ~LED2;
break;
case S3_PRES://按键S3按键下
LED3 = ~LED3;
break;
case S4_PRES://按键S4按键下
LED4 = ~LED4;
break;
default:break;
}
}
}
③ LED.c为LED驱动代码,代码实现对LED灯控制的IO进行初始化设置IO口输出模式。
void LED_Init(void)
{
P0DIR |= 0x0C;//P0.2、P0.3定义为输出
P1DIR |= 0xC0;//P1.6、P1.7定义为输出
LED1=1;LED2=1;LED3=1;LED4=1;
}
④ KEY.c为LED模块上的按键驱动,在Key_Init()函数中初始化按键的IO为输入上拉。
void KEY_Init(void)
{
P0SEL &= ~0x03;//设置P0.0、P0.1为普通IO口
P0DIR &= ~0x03;//按键接在P0.0、P0.1口上,设P0.0、P0.1为输入模式
P0INP &= ~0x03;//打开P0.0、P0.1上拉电阻
P1SEL &= ~0x30;//设置P1.4、P1.5为普通IO口
P1DIR &= ~0x30;//按键接在P1.4、P1.5口上,设P1.4、P1.5为输入模式
P1INP &= ~0x30;/打开P1.4、P1.5上拉电阻
}
⑤ 按键扫描函数Key_Scan(),完成按键的扫描,当按键按下,返回按键的键值。
uint8_t KEY_Scan(uint8_t mode)
{
static uint8_t key_up=1;//按键松开标志
if(mode==1){
key_up=1;//支持连按
}
if(key_up&&(S1_Read()==0||S2_Read()==0||S3_Read()==0||S4_Read()==0))
{
delay_ms(10);
key_up=0;
if(S1_Read()==0){
return S1_PRES;
}
else if(S2_Read()==0){
return S2_PRES;
}
else if(S3_Read()==0){
return S3_PRES;
}
else if(S4_Read()==0){
return S4_PRES;
}
}else if(S1_Read()==1&&S2_Read()==1&&S3_Read()==1&&S4_Read()==1){
key_up=1;
}
return 0;//无按键按下
}
常见问题
-
弹出警告窗口,不能下载程序。
- 请确认CCDebugger驱动否安装。
- 轻按CCDebugger仿真器的按键,指示灯不是绿色连接有问题。
- CCDebugger仿真器是否正常接入到底座,参考实验步骤第一步。
-
下载代码后程序没观察到实验现象。
- 请重新上电,或者按下底座上的复位按键。
- 模块没有安装稳妥。
实验思考
-
实现按键S1按下后,LED1亮1秒后熄灭。
-
实现按键S1按下后,LED1常亮,按键S2按键下LED1熄灭。