由浅入深,蓝牙4.0/BLE协议栈开发攻略大全(1)
P1.1和P1.0两个IO口,为了不影响其他引脚的使用,我们这里巧妙使用与或控制其功能。比如:P1 = (P1 & 0XFC) | 0X01; P1与上1111 1100,这样不影响其他引脚的基础上,清除了P1.0和P1.1的输出,再或上0X01,这样将P1.0设置为高电平,根据原理图,高电平是点亮LED2.
第四节 控制LED
上一节点亮了单个LED灯,我们这堂课接着控制LED灯。这堂课我们要完成的是LED闪烁10次,蜂鸣器响1s钟。这里我们先使用延时函数进行。
我们的程序一定要做到结构清晰,可移植性强,阅读性高。程序设计不仅仅是实现了功能,如果那样的代码,那只有你自己可以看懂,是一手垃圾。真正的漂亮代码具有阅读性高、可移植性强、代码规范性好。
delay.h:
#ifndef __DELAY_H__
#define __DELAY_H__
extern void Delay1ms(unsigned int uiDelay);
#endif
/* end file */
延时函数的执行程序delay.c:
#include "delay.h"
void Delay1ms(unsigned int uiDelay)
{
unsigned int i;
for ( ; uiDelay > 0; uiDelay--)
{
/* 大约延时1ms */
for (i = 0; i <320; i++);
}
}
/* end file */
主函数其实也很简单:
int main(void)
{
/* 控制LED灯闪烁 */
unsigned char i;
/* 驱动无源蜂鸣器 */
unsigned int j;
/* 将P1.0、P1.1设置为IO口 */
P1SEL &= ~0x03;
/* 将P1.0、P1.1设置为IO口的输出 */
P1DIR |= 0x03;
/* 将P2.0设置为IO口 */
P2SEL &= ~0x01;
/* 将P2.0设置为IO口输出 */
P2DIR |= 0x01;
/* 主循环 */
while(1)
{
/* LED1,LED2闪烁10次 */
for (i = 0; i <10; i++)
{
/* P1.0----LED2,P1.1----LED1 */
/* P1.0,P1.1输出高电平,即点亮LED2,LED1 */
/* FC : 1111 1100*/
P1 = (P1 & 0xFC) | 0x03;
Delay1ms(1000);
/* P1.0,P1.1输出低电平,即熄灭LED2,LED1 */
/* FC : 1111 1100*/
P1 = (P1 & 0xFC) & (~0x03);
Delay1ms(1000);
}
/* 给出500HZ的方波驱动 */
for(j = 0; j <1000; j++)
{
/* P2.0----蜂鸣器 */
P2 = (P2 & 0xFE) & (~0x01);
Delay1ms(1);
P2 = (P2 & 0xFE) | 0x01;
Delay1ms(1);
}
}
}
/* end file */
这里需要注意的是,MT254X蓝牙4.0开发板使用的无源蜂鸣器,那么我们需要产生一个方波来驱动。如这代码:
/* 给出500HZ的方波驱动 */
for(j = 0; j <1000; j++)
{
/* P2.0----蜂鸣器 */
P2 = (P2 & 0xFE) & (~0x01);
Delay1ms(1);
P2 = (P2 & 0xFE) | 0x01;
Delay1ms(1);
}
如果是有缘蜂鸣器,则没有那么麻烦,直接给出低电平驱动。为什么是低电平,我们看下原理图:
使用的PNP三极管,并且使用续流二极管保护蜂鸣器。
第五节 LCD12864显示
上一节我们成功控制了LED和蜂鸣器,这一节我们马不停蹄接着LCD12864的控制。
为了系统能够稳定的工作,首先我们将系统时钟切换到32M的外部晶振,为了自由配置所需要的时钟,主要借助于CLKCONCMD.OSC选择系统主时钟,而借助于CLKCONCMD.OSC32K则用于选择芯片32K时钟源!而低功耗模式设置时,需要借助于SLEEPCMD寄存器,在《CC253x- CC2540-41Applications User‘s Guide.pdf>中并没有说明SLEEPCMD第二位功能,如下所示:
但是参考cc2430芯片的说明书可以发现,对应的SLEEP寄存器则有说明,如下所示,这个是TI有意隐藏芯片细节,当SLEEPCMD.OSC_PD为0时,32MHz晶振与16MHz RC振荡器都会起振:
对于SLEEPSTA寄存器中BIT6/BIT5说明在cc2530说明书中也并没有说明,可以参考cc2430说明书中内容,其中第6位 XOSC_STB表明外部高速32M晶振是否上电并稳定起振,当稳定时该位为1;同样对于第5位HFRC_STB则表明内部16MHz高速RC振荡器是否起振,并是否稳定,当16MHz RC振荡器稳定时该位为1。
void SysStartXOSC(void)
{
SLEEPCMD &= ~0x04; // 启动所有晶振
while (!(SLEEPSTA & 0x40)); // 等待晶振稳定
CLKCONCMD = (CLKCONCMD & 0x80) | 0x49; // 使用16M晶振作为主时钟
while ((CLKCONSTA & ~0x80) != 0x49 ); // 等待主时钟切换到16M晶振
CLKCONCMD = (CLKCONCMD & ~0x80) ; // 使用外部32K晶振作为休眠时钟
while ( (CLKCONSTA & 0x80) != 0 )
- 主流蓝牙BLE控制芯片详解(3):创杰 IS1685S(07-18)
- 苹果光环加持,蓝牙Beacon技术成室内定位应用最大黑马(08-02)
- 主流蓝牙BLE控制芯片详解(4):Nordic nRF51822(07-20)
- 蓝牙BLE之室内定位iBeacon应用测验(08-02)
- 由浅入深,蓝牙4.0/BLE协议栈开发攻略大全(5)(08-02)
- 由浅入深,蓝牙4.0/BLE协议栈开发攻略大全(2)(07-18)