文章目录

  • 前言
  • 一、实验相关电路图
  • 二、实验相关寄存器
  • 三、源码分析

前言

本实验用于学习CC2530芯片GPIO 的配置方法,Led 驱动电路及开关 Led 的原理,按键的使用,实现简单的人机交互。


一、实验相关电路图


由于发光二级管单向导电性,即只有在正向电压(二极管的正极接正,负极接负)下才能导通发光。所以 P1.0、P1.1、P1.4 引脚输出低电平 LED 亮,引脚输出亮电平 LED 熄灭,当 引脚(P0_1 )为低电平时说明按键被按下,高电平时为抬起状态。

TI官方的开发板是高电平点亮LED,但实验板子是低电平亮,更符合国人习惯。

二、实验相关寄存器

由于P0、P1配置方法相同,所以只列出P1寄存器的相关信息:

寄存器 作用 描述
P1 (0x90) 端口 1 端口 1。通用 I / O 端口。可以从 SFR 位寻址。
P1SEL(0xF4) 端口 1 功能选择 P1.7 到 P1.0 的功能选择
0: 通用 I / O
1: 外设功能
P1DIR(0xFE) 端口 1 方向 P1.7 到 P1.0 的 I/O 方向
0: 输入
1: 输出
P1INP(0xF6) 端口 1 输入模式 P1.7 到 P1.2 的 I/O 输入模式。由于 P1.0 和 P1.1 没有上拉/下拉功能,,P1INP 暂时不需要配置,了解一下为后面的实验打下基础
0: 上拉/下拉(见 P2INP (0xF7)–端口 2 输入模式)
1: 三态

按照表格寄存器的内容,对 P1.0、P1.1、P1.4 口进行配置,简化配置指令如下:

P1DIR |= 0x13; // P1.0、P1.1、P1.4 定义为输出,只改变最低位的值而不影响其他位

嵌入式中位运算只修改要修改的位,不要影响到其他位,否则在基础实验中功能单一,感觉不出来,如果在协议栈中就有严重问题了。

P1DIR赋值的对应关系:P1DIR(P1 Direction)是P1口方向控制寄存器,给它赋值就是改变P1对应位的状态
P1DIR(P0DIR相同):设置各个I/O口方向,0为输入,1为输出

Bit7 Bit6 Bit5 Bit4 Bit3 Bit2 Bit1 Bit0
P1.7方向 P1.6方向 P1.5方向 P1.4方向 P1.3方向 P1.2方向 P1.1方向 P1.0方向

举例:P1DIR |= 0x13;转换成二进制为 0001 0011
也就是让bit0、bit1、bit4设置为1,状态为输出。把开发板P1端口上的P1.0、P1.1、P1.4为输出。即改变哪个IO就操作其对应的位。

0 0 0 1 0 0 1 1

按键 S1 配置如下:

P0SEL &= ~0x02; //设置 P0.1 为普通 IO 口
P0DIR &= ~0x02; //按键接在 P0.1 口上,设 P0.1 为输入模式
P0INP &= ~0x02; //打开 P0.1 上拉电阻

三、源码分析

/****************************************************************************
* 文 件 名: main.c
* 描    述: 按下按键S1控制LED1.LED2.LED3实现跑马灯效果
****************************************************************************/
#include <ioCC2530.h>
typedef unsigned char uchar;
typedef unsigned int  uint;
#define LED1 P1_0        // 定义P1.0口为LED1控制端
#define LED2 P1_1        // 定义P1.1口为LED2控制端
#define LED3 P1_4        // 定义P1.4口为LED3控制端
#define KEY1 P0_1        // 定义P0.1口为S1控制端
#define ON      0
#define OFF     1//以毫秒为单位延时,系统时钟不配置时默认为16M(用示波器测量相当精确)
//入口参数: msec 延时参数,值越大,延时越久
void DelayMS(uint msec)
{ uint i,j;for (i=0; i<msec; i++)for (j=0; j<535; j++);
}//点亮或熄灭所有LED灯:mode为0时LED灯亮  mode为1时LED灯灭
void LedOnOrOff(uchar mode)
{LED1 = mode;LED2 = mode;LED3 = mode; //由于P1.4与仿真器共用,必须拔掉仿真器的插头才能看到LED3的变化
}// 设置LED相应的IO口
void InitLed(void)
{P1DIR |= 0x13;  // P1.0、P1.1、P1.4定义为输出LedOnOrOff(1);  // 使所有LED灯默认为熄灭状态
}//设置按键相应的IO口
void InitKey(void)
{P0SEL &= ~0x02;     //设置P0.1为普通IO口  P0DIR &= ~0x02;     //按键接在P0.1口上,设P0.1为输入模式 P0INP &= ~0x02;     //打开P0.1上拉电阻
}//读取按键状态,0为抬起 1为按键按下
uchar KeyScan(void)
{if (KEY1 == 0){DelayMS(10);      //延时10MS去抖if (KEY1 == 0){while(!KEY1); //松手检测return 1;     //有按键按下}}return 0;             //无按键按下
}//程序入口函数
void main(void)
{InitLed();           //设置LED灯相应的IO口InitKey();            //设置按键S1相应的IO口while(1){DelayMS(2);if (KeyScan())    //扫描按键当前状态,按下时执行跑马灯效果{LED1 = ON;    //点亮LED1      DelayMS(500); LED1 = OFF;   //熄灭LED1 LED2 = ON;                DelayMS(500); LED2 = OFF;            LED3 = ON;           DelayMS(500); LED3 = OFF; }}
}

为什么单片机编程要尽量使用无符号类型的数据?
主要原因:多数情况下不需要用到负数,而单片机内存有限,用无符号类型的数据可以节省内存。

char型可以表示数的范围是-128到127,所占位数是8位
int型可以表示数的范围是-32768到32767,所占位数是16位
假如用有符号的数据类型表示,如果要表示的数是128,那就需要定义int型,用了16位。
unsigned char型可以表示数的范围是0到255,所占位数是8位
int型可以表示数的范围是0到65535,所占位数是16位
假如用无符号的数据类型表示,如果要表示的数是128,那就定义unsigned char型就可以了,只用了8位。

while(1)的作用
while语句的原型是while(表达式),当表达式为非0值时,执行while语句中的嵌套语句,while(1)则一直执行嵌套语句,代码不再向下执行。

在单片机中使用while(1),大部分情况是为了防止程序跑飞。因为很多时候执行完某段程序后,单片机的程序指针PC并不会停止,仍然会从ROM中读取指令来执行,从而出现不确定的结果,加个while(1)就能让程序在执行完后在原地循环,防止跑飞。
调试代码时,为了检测一部分代码是否OK,防止后面的代码干扰执行结果,也会在观测点加上while(1);

CC2530基础实验:(1)按键控制LED跑马灯相关推荐

  1. 按键控制LED跑马灯(CC2530)

    一.实验目的 通过S1P0_1控制P1_0.P1_1.P1_4来开关LED灯 二.实现相关电路图 三.配置相关寄存器 P1DIR |= 0x13:将P0DIR(P0端口的方向寄存器)上P1_0.P1_ ...

  2. 【嵌入式】按键中断控制 LED 跑马灯实验

    [嵌入式]按键中断控制 LED 跑马灯实验 1. 操作内容 2. 原理解释 2.1 实验箱按键电路 2.2 实验箱LED电路 2.3 寄存器说明 3. 操作步骤 3.1 编写键控制 LED 代码,将代 ...

  3. 定时器控制led跑马灯

    定时器控制led跑马灯 概述 1.1 资源概述 开发板:正点原子STM32F103zet6精英开发板 控芯片型号:STM32F103ZET6 开发板资料下载地址:http://www.openedv. ...

  4. zigbee CC2530 系列教程 4 按键控制LED实验

    所有课程见此链接: zigbee CC2530 系列教程 0 课程介绍 4.3按键控制LED实验 4.3.1 实验目的 了解使用按键方法,使用按键切换LED的状态. 4.3.2 实验讲解 首先根据开发 ...

  5. CC2530的中断操作----按键控制led灯亮灭

    中断使能主要有四个步骤: (1)使.EA 位为 1,开中断. (2)设置寄存器 IEN0.IEN1和IEN2中相应中断使能位为1. (3)如果需要,则设置P0.P1.P2各引脚对应的各中断使能位为1. ...

  6. CC2530基础实验:(8)串口通讯-发送字符串控制LED

     目录 前言 一.实验相关电路图 二.实验相关理论与寄存器 1.并行通信与串行通信 2.URAT 3.同步通信与异步通信 4.外设I/O 5.CC2530 的串口通信模块 6.相关寄存器 三.源码分析 ...

  7. led计数电路实验报告_「正点原子FPGA连载」第八章 按键控制LED灯实验

    1)实验平台:正点原子开拓者FPGA开发板 2)本实例源码下载:请移步正点原子官网 第八章 按键控制LED灯实验 按键是常用的一种控制器件.生活中我们可以见到各种形式的按键,由于其结构简单,成本低廉等 ...

  8. ZYNQ学习笔记(五)---按键控制LED灯亮灭实验

    这个实验其实很早就做了,但是由于这段时间自己一直在忙一些其他的事所以没有及时更新.今天抽出个空来更新一下.本次实验是关于按键控制LED亮灭.其中涉及到的内容有计数器.按键消抖以及一些简单的逻辑. 1. ...

  9. 基于FPGA的两位按键控制LED数码管加减计数实验

    两位按键控制LED数码管加减计数实验 这是一篇拖了一个多月的文章,主要是基于FPGA利用按键消抖原理与动态数码管驱动原理相结合,来实现一个利用两位按键来控制数码管实现0-99的加法计数或者减法计数功能 ...

最新文章

  1. Oracle XQuery 过滤XML查询SQL
  2. shiro系列二、身份验证和授权
  3. KiCAD初学者指南
  4. Shell分析HardSoft-Viewer结果文件并插入数据库
  5. 简单分析synchronized不会锁泄漏的原因
  6. shell获取当前进程pid和上一个进程pid
  7. layui和jquery冲突:Syntax error, unrecognized expression: +
  8. mysql建表用的什么语句_mysql建表常用sql语句个人经验分享
  9. why get_expanded_entityset is not called but works in Ke's laptop
  10. c语言中字符占用的存储单元,C语言知识点第1章.doc
  11. [转]UIWebView 监控 XMLHttpRequest
  12. 学python lesson2
  13. Swift 4.2进入最后开发阶段,为Swift 5铺平道路
  14. 程序员首选编程电脑【火爆来袭】
  15. html5捕鱼达人源码分享!!!
  16. 众数和中位数的应用题_什么是众数和中位数
  17. 转载关于后端开发需要学习的内容
  18. 测试经理必知必会-Kanban和Scrum区别
  19. 小米 未检测到任何互联网连接 因此不会自动重新连接
  20. 35.给定的字符串中字母顺序前移,其他字符顺序后移。

热门文章

  1. RS485调试的几个要点
  2. GPS研究---GPS卫星信号
  3. Oracle索引与where
  4. 【Python爬虫系列教程 28-100】小姐姐带你入门爬虫框架Scrapy、 使用Scrapy框架爬取糗事百科段子
  5. element UI dialog点击dialog区域外会关闭dialog
  6. mysql添加多个字段删除多个字段
  7. tf15: 中文语音识别
  8. android控制中心实现,基于Android平台的智能家居系统控制中心的设计与实现
  9. SSH服务器CBC加密模式漏洞(CVE-2008-5161)
  10. Error 1718. File was rejected by digital signature policy错误,文件的数字签名被你的本地软件策略给拒绝了,来看看解决方法