 |
注:这是一款不带字库的液晶。 【运行效果】 
|
 |
【程序文件列表】 
|
 |
【MyC.nc】 module MyC { uses interface Boot; } implementation { #define _BV(n) (1 << (n)) #define RST_0 P2OUT &= ~_BV(0) #define RST_1 P2OUT |= _BV(0) #define CE_0 P2OUT &= ~_BV(1) #define CE_1 P2OUT |= _BV(1) #define DC_0 P2OUT &= ~_BV(3) #define DC_1 P2OUT |= _BV(3) #define DIN_0 P2OUT &= ~_BV(6) #define DIN_1 P2OUT |= _BV(6) #define BL_1 P6OUT |= _BV(6) // 接ADC6接线柱即可 #define SCLK_0 P6OUT &= ~_BV(7) // 接ADC7接线柱即可 #define SCLK_1 P6OUT |= _BV(7) const unsigned char chA[] = {0x00, 0x7c, 0x12, 0x11, 0x12, 0x7c}; // 字符'A' void LCDWrite(unsigned char dat) { unsigned char i; CE_0; for (i = 0; i < 8; i++) { if (dat & 0x80) DIN_1; else DIN_0; SCLK_0; dat <<= 1; SCLK_1; } CE_1; } // 写入命令 void LCDWriteCmd(unsigned char cmd) { DC_0; LCDWrite(cmd); } // 写入数据 void LCDWriteData(unsigned char dat) { DC_1; LCDWrite(dat); } // 设置显示位置 void LCDSetPos(unsigned char x, unsigned char y) { LCDWriteCmd(0x40 | y); LCDWriteCmd(0x80 | x); } // 清屏 void LCDClear(void) { unsigned char i, j; LCDSetPos(0, 0); for (i = 0; i < 6; i++) { for (j = 0; j < 84; j++) LCDWriteData(0x00); } } // 初始化LCD void LCDInit(void) { // 复位 RST_0; _NOP(); _NOP(); _NOP(); _NOP(); RST_1; LCDWriteCmd(0x21); // 使用扩展命令设置LCD模式 LCDWriteCmd(0xc8); // 设置显示亮度 LCDWriteCmd(0x06); // 温度校正 LCDWriteCmd(0x13); // 1:48 LCDWriteCmd(0x20); // 使用基本命令, 且水平寻址 LCDClear(); /* 设定显示模式 */ LCDWriteCmd(0x0c); // 正常显示 //LCDWriteCmd(0x0d); // 反色显示 //LCDWriteCmd(0x08); // 显示空白 //LCDWriteCmd(0x09); // 显示全黑 CE_0; BL_1; // 开背光 } // 显示字符A void LCDWriteChar(unsigned char *ch) { unsigned char i; for (i = 0; i < 6; i++) LCDWriteData(ch[i]); } void delay(void) { unsigned int i; for (i = 0; i < 40000u; i++); } event void Boot.booted(void) { LCDInit(); LCDSetPos(8, 0); LCDWriteChar(chA); // 显示字符A // 逐渐填满剩下的区域 while (1) { LCDWriteData(0xff); delay(); } } }
|
 |
【MyAppC.nc】 configuration MyAppC { } implementation { components MyC, MainC; MyC -> MainC.Boot; } 【Makefile】 COMPONENT = MyAppC include $(MAKERULES)
|
 |
【命令】 编译:make telosb 烧写:make telosb reinstall 编译并烧写:make telosb install
|
 |
|
 |
也可以直接用杜邦线连接,并通过USB接口接到电脑上,可边下载边运行程序。 不过,液晶屏上的内容可能会因为USB电压问题而不能正常显示,例如下图中奇数行的像素就完全无法显示:   
|
 |
编译时有一个关于const的警告,在LCDWriteChar函数的参数里加上const关键词即可消除: // 显示字符A void LCDWriteChar(const unsigned char *ch) 不过这个问题不大,因为在函数里面没有对ch进行操作。
|
 |
把液晶的电源线接到电源模块的5V引脚上,并把显示亮度改为0xa7,也可以提高显示质量: LCDWriteCmd(0xa7); // 设置显示亮度 
|