由浅入深,蓝牙4.0/BLE协议栈开发攻略大全(2)
本系列教程将结合TI推出的CC254x SoC 系列,讲解从环境的搭建到蓝牙4.0协议栈的开发来深入学习蓝牙4.0的开发过程。教程共分为六部分,本文为第二部分:
第二部分知识点:
第六节 独立按键之查询方式
第七节 独立按键之中断方式
第八节 CC254x内部温度传感器温度采集
第九节 五向按键
第十节 蜂鸣器
有关TI 的CC254x芯片介绍,可点击下面链接查看:
主流蓝牙BLE控制芯片详解(1):TI CC2540
同系列资料推荐:
由浅入深,蓝牙4.0/BLE协议栈开发攻略大全(1)
有关本文的工具下载,大家可以到以下这个地址:
朱兆祺ForARM第六节 独立按键之查询方式
在MT254xboard上有一个独立按键KEY1,如图 ,独立按键和复位键在整个班子的左上角。按键通过P0.0口和CPU连接,在没有按键时为高电平,按下后为低电平。下面我们通过LCD来显示独立按键的状态。
其对应的原理图如下:
我们先用查询的方式读取按键的状态。因为按键接入在P0.0口,所以我们读取P0.0口的电平即可知道按键的状态。
uint8 KeyValue(void) // 读取按键状态
{
if((P0&0X01) == 0X00 ) // 按下为低电平
{
return KEY_DOWN;
}
else
{
return KEY_UP;
}
}
这里我们在while循环中不断的读取按键状态,并且判断是否改变,如果改变则改变LCD的显示。
int main(void)
{
uint8 OldKeyValue = 0;
uint8 NewKeyValue = 0;
SysStartXOSC();
LCD12864_Init();
LCD12864_DisStr(1, " Key Test");
// 按键初始化
P0SEL &= ~0X01; // 设置为 IO功能
P0DIR &= ~0X01; // 设置为输入功能
while(1)
{
NewKeyValue = KeyValue(); // 读取按键状态
if(OldKeyValue != NewKeyValue) // 按键状态改变
{
OldKeyValue = NewKeyValue; // 保存当前按键状态
if(OldKeyValue == KEY_DOWN)
{
LCD12864_DisStr(3, " Key Down ");
}
else
{
LCD12864_DisStr(3, " Key Up ");
}
}
}
return 0;
}
运行程序,效果如图所示:
第七节 独立按键之中断方式
复制Key工程,重命名为KeyInterrupt。刚刚我们用查询的方式读取按键的状态。但是这种方式在实际的工程中没有实际的应用价值,下面我们采用外部中断的方式来读取按键的状态,每当按键按下时就会触发一次外部中断。为了P0.0口能够触发中断,我们需要进行如下配置:
P0IEN |= 0X01; // P00 设置为中断方式
PICTL &=~ 0X01; // 下降沿触发
IEN1 |= 0X20; // 允许P0口中断
P0IFG = 0x00; // 清除中断标志位
EA = 1; // 开总中断
然后就需要编写中断服务函数了。这里注意一点,在IAR中的中断函数有点特殊,格式为:
#pragma vector = 中断向量
__interrupt 函数
所以我们的中断函数为:
#pragma vector = P0INT_VECTOR
__interrupt void P0_ISR(void)
{
if(0x01&P0IFG)
{
NewKeyValue = KEY_DOWN; // 记录按键按下
}
P0IFG = 0; //清中断标志
P0IF = 0; //清中断标志
}
在中断中我们记录按键按下,等待应用程序处理。而在主函数中我们需要处理按键按下事件,主函数中我们对按键计数并且通过LCD显示。
int main(void)
{
char LCDBuf[21]={0}; // 显存
int KeyCnt = 0;
SysStartXOSC();
LCD12864_Init();
LCD12864_DisStr(1, " Key Test");
P0SEL &= ~0X01; // 设置为IO功能
P0DIR &= ~0X01; // 设置为输入功能
P0IEN |= 0X01; // P0.0 设置为中断方式
PICTL |= 0X01; // 下降沿触发
IEN1 |= 0X20; // 允许P0口中断
P0IFG = 0x00; // 清除中断标志位
EA = 1; // 开总中断
sprintf(LCDBuf, " Key Count : %d", KeyCnt++); // 按键计数
LCD12864_DisStr(3, LCDBuf);
while(1)
{
if(KEY_DOWN == NewKeyValue) // 按键按下
{
SoftWaitUs(25000); // 延时防抖
if((P0&0X01) == 0X00) // 再次确认按键是否按下
{
sprintf(LCDBuf, " Key Count : %d", KeyCnt++); // 按键计数
LCD12864_DisStr(3, LCDBuf);
}
else
{
NewKeyValue = KEY_UP; // 按键松开
}
}
}
return 0;
}
每按一次按键计数加1,效果如图所示:
第八节 CC254x内部温度
- 主流蓝牙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协议栈开发攻略大全(1)(07-13)