赞
踩
本文讲述如何将一款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); }
显示结果:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。