本文讲述如何将一款0.96寸的OLED显示屏移植到CC2530上,并且使用ZSTACK的API来获取MAC地址和PANID,并将这样的16进制数转为字符串用于显示。
环境:ZStack-CC2530-2.5.1a
Oled图
ZSTACK自带有LCD屏的代码,所以协议栈中有Hal_lcd.C和Hal_lcd.h文件。我们可以直接替换这两个文件。
链接:Hal_lcd.c和Hal_lcd.h
我的原理图。使用了IIC总线,具体引脚的设置可以根据自己的硬件来。
头文件以及条件编译的设置
#ifdef LCD_SUPPORTED
#include "hal_lcd.h"
#endif
任务处理函数
case ZDO_STATE_CHANGE:
SampleApp_NwkState = (devStates_t)(MSGpkt->hdr.status);
if(SampleApp_NwkState == DEV_ZB_COORD) //判定当前设备类型
{
…………..
#ifdef LCD_SUPPORTED
LCD_P8x16Str(0, 0, "Chinasofti");
LCD_P8x16Str(0, 2, "Panid:0x");
showPANID();
showMacAddr();
LCD_P8x16Str(0, 6, "Chan:");
LCD_ShowNum(48,6,DEFAULT_CHANLIST,4);
#endif
…………..
}
break;
showPANID();和showMacAddr();的具体实现:
由于PANID和MAC地址都是16进制的数字,有AB…F这样的字符,所以不能按普通十进制数字显示,因此我将其拆分为4个二进制位,然后用显示字符的方法来显示。以下的实现方式可能不是很简便。。。。
_NIB.nwkPanId存储了PANID。即便是在f8wConfig设置-DZDAPP_CONFIG_PAN_ID=0xFFFF,也可以显示协调器建立起网络后得到的PANID。aExtendedAddress数组中直接存放了MAC地址。
uint8 HexToChar(uint8 temp)
{
uint8 dst;
if (temp < 10){
dst = temp + '0';
}else{
dst = temp -10 +'A';
}
return dst;
}
void showPANID()
{
uint8 tempStr[4];
uint8 dstPan[5] = {0};
uint8 i;
int tempPan = _NIB.nwkPanId;
tempStr[3] = tempPan&0xf;
tempStr[2] = (tempPan>>4)&0xf;
tempStr[1] = (tempPan>>8)&0xf;
tempStr[0] = (tempPan>>12)&0xf;
for(i = 0; i<4;i++)
{
dstPan[i] = HexToChar(tempStr[i]);
}
dstPan[4] = '\0';
LCD_P8x16Str(64, 2, dstPan);
}
void showMacAddr()
{
uint8 str[16];
uint8 dstPan[17] = {0};
uint8 i;
for(i = 0; i<8;i++)
{
str[2*i] = aExtendedAddress[i]>>4;
str[2*i+1] = aExtendedAddress[i]&0xf;
}
for(i = 0; i<16;i++)
{
dstPan[i] = HexToChar(str[i]);
}
dstPan[16] = '\0';
LCD_P8x16Str(0, 4, dstPan);
}
显示结果: