作者共发了16篇帖子。 内容转换:不转换▼
 
点击 回复
535 15
【程序】TinyOS节点控制Nokia5110液晶显示
一派护法 十九级
1楼 发表于:2016-8-5 15:23
注:这是一款不带字库的液晶。
【运行效果】
一派护法 十九级
2楼 发表于:2016-8-5 15:24
一派护法 十九级
3楼 发表于:2016-8-5 15:25
【程序文件列表】

一派护法 十九级
4楼 发表于:2016-8-5 15:26
【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();
        }
    }
}
一派护法 十九级
5楼 发表于:2016-8-5 15:27
【MyAppC.nc】
configuration MyAppC
{
}
implementation
{
    components MyC, MainC;
    MyC -> MainC.Boot;
}
【Makefile】
COMPONENT = MyAppC
include $(MAKERULES)
一派护法 十九级
6楼 发表于:2016-8-5 15:30
【命令】
编译:make telosb
烧写:make telosb reinstall
编译并烧写:make telosb install
一派护法 十九级
7楼 发表于:2016-8-5 15:32
【接线】


一派护法 十九级
8楼 发表于:2016-8-5 15:34
也可以直接用杜邦线连接,并通过USB接口接到电脑上,可边下载边运行程序。
不过,液晶屏上的内容可能会因为USB电压问题而不能正常显示,例如下图中奇数行的像素就完全无法显示:


一派护法 十九级
9楼 发表于:2016-8-5 15:51
编译时有一个关于const的警告,在LCDWriteChar函数的参数里加上const关键词即可消除:
// 显示字符A
void LCDWriteChar(const unsigned char *ch)
不过这个问题不大,因为在函数里面没有对ch进行操作。
一派护法 十九级
10楼 发表于:2016-8-5 15:54
把液晶的电源线接到电源模块的5V引脚上,并把显示亮度改为0xa7,也可以提高显示质量:
LCDWriteCmd(0xa7); // 设置显示亮度
一派护法 十九级
11楼 发表于:2016-8-5 16:02
一派护法 十九级
12楼 发表于:2016-8-5 16:03
中间那个白点是膜上的,不是液晶屏上的。
一派护法 十九级
13楼 发表于:2016-8-5 17:02
【显示图片】
一派护法 十九级
14楼 发表于:2016-8-5 17:05
【程序】
const unsigned char img[][84] = {
    {0xdc, 0x32, 0x3a, 0xdc, 0x20, 0xa0, 0xa0, 0xc0, 0x0e, 0x30, 0x7e, 0x00, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00, 0x60, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xa0, 0x90, 0x88, 0xd4, 0xe4, 0x70, 0x72, 0xbc, 0x78, 0x38, 0x38, 0x3e, 0x7c, 0xf8, 0xf8, 0xf8, 0xf0, 0xf0, 0xf0, 0xe0, 0xc0, 0xc0, 0x40, 0x20, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xfa, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfc, 0xfe, 0xfe, 0x1e, 0x02},
    {0x47, 0x41, 0x41, 0xd1, 0x23, 0x1d, 0x81, 0x40, 0x20, 0x98, 0x04, 0x83, 0x3c, 0x90, 0xf1, 0x3e, 0xce, 0x77, 0x63, 0xc3, 0xc3, 0x27, 0x3f, 0xfe, 0xfe, 0xfc, 0xf0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x07, 0xf1, 0xfc, 0xfe, 0xff, 0xff, 0xfc, 0xf8, 0x98, 0x98, 0xe4, 0xe7, 0xff, 0xdc, 0xfc, 0xcf, 0xcf, 0xff, 0xbf, 0xff, 0xef, 0x1e, 0xf8, 0x10, 0x00, 0x40, 0x3f, 0x8f, 0x43, 0x71, 0x49, 0x49, 0x89, 0x01, 0x03, 0x0f, 0xf3, 0x00, 0x00, 0x88},
    {0xf8, 0xf0, 0xf0, 0xf8, 0x77, 0xd1, 0x30, 0x90, 0x00, 0xaa, 0x00, 0x88, 0x00, 0x21, 0x8e, 0x70, 0x1f, 0xfe, 0xfe, 0xff, 0xff, 0x3f, 0x3f, 0x3f, 0x7f, 0x9f, 0xff, 0x3f, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0xc0, 0x00, 0x03, 0x0f, 0x3f, 0x7f, 0x7f, 0xff, 0xbf, 0x3f, 0x1f, 0x0f, 0x0f, 0x0f, 0x8f, 0x8f, 0xcf, 0xe3, 0xf7, 0x79, 0x1f, 0x07, 0x00, 0x00, 0x00, 0x80, 0x60, 0x80, 0x87, 0x04, 0x01, 0x00, 0x84, 0x83, 0x40, 0x30, 0x8c, 0x03, 0xa8, 0x00, 0x88},
    {0x77, 0x65, 0xe3, 0xea, 0xc1, 0xca, 0x00, 0x88, 0x00, 0xaa, 0x00, 0x88, 0x00, 0xa0, 0x0f, 0xb0, 0x40, 0x82, 0x11, 0x2b, 0x4a, 0x4a, 0x72, 0x0a, 0x13, 0x01, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x1e, 0xfe, 0xfe, 0xfe, 0xfe, 0xff, 0x7f, 0x7f, 0x7f, 0x3f, 0x3f, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x03, 0x03, 0x1b, 0x23, 0x23, 0x23, 0x23, 0x23, 0x25, 0x15, 0x0c, 0x80, 0x80, 0x40, 0x20, 0x70, 0x28, 0x46, 0x81, 0xca, 0x40, 0x28, 0x21, 0x39, 0x45, 0x82, 0x82, 0x82, 0x44, 0x78, 0x40, 0x4a, 0x40, 0x88},
    {0x9a, 0x9d, 0x65, 0x65, 0x1a, 0x2d, 0x00, 0x88, 0x00, 0x2a, 0x00, 0x88, 0x00, 0x22, 0x00, 0x88, 0x00, 0x2a, 0x01, 0x8a, 0x02, 0x24, 0x04, 0x88, 0x08, 0x10, 0x10, 0x10, 0x20, 0xa0, 0xa0, 0x60, 0x40, 0x20, 0x21, 0x23, 0x25, 0x24, 0x24, 0x24, 0x44, 0x44, 0x42, 0xc1, 0xa0, 0xa0, 0x60, 0x20, 0x20, 0x30, 0x10, 0x10, 0x10, 0x18, 0x18, 0x18, 0x14, 0x14, 0x12, 0x22, 0x21, 0x40, 0x40, 0x40, 0x80, 0x80, 0x80, 0x80, 0x00, 0x03, 0x04, 0x04, 0x3c, 0xc4, 0x82, 0x83, 0x83, 0x47, 0xf8, 0x08, 0x08, 0x08, 0x18, 0x27},
    {0x7f, 0x7f, 0x3e, 0x0e, 0x08, 0x0a, 0x00, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x0a, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x0a, 0x08, 0x0c, 0x0c, 0x0a, 0x0a, 0x09, 0x0d, 0x08, 0x10, 0x10, 0x20, 0x20, 0x20, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x1e, 0x21, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x20, 0x20, 0x20, 0x10, 0x08, 0x0c, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x0a, 0x0a, 0x0d, 0x08, 0x08, 0x08, 0x08, 0x09, 0x0e, 0x08, 0x08, 0x08, 0x08}
};

void LCDDisplayImage(void)
{
    unsigned char i, j;
    LCDSetPos(0, 0);
    for (i = 0; i < 6; i++)
    {
        for (j = 0; j < 84; j++)
            LCDWriteData(img[i][j]);
    }
}

event void Boot.booted(void)
{
    LCDInit();
    LCDDisplayImage();
}
一派护法 十九级
15楼 发表于:2016-8-5 17:13
【图像取码用的电脑端C语言程序】
https://zh.arslanbar.net/post.php?t=24309
一派护法 十九级
16楼 发表于:2016-8-11 18:03
引起液晶屏显示异常的原因主要还是因为VCC引脚上提供的电压不足。由于USB接口的电压接近5V,因此实际开发时可以直接将USB的正极接到液晶屏的VCC引脚上,而不是接MSP430单片机上的已经降压了的VCC。I/O端口的高电平电压可以保持3.3V不变,因为这并不影响数据的传输,只需要改变VCC一根引脚的电压就行了

回复帖子

内容:
用户名: 您目前是匿名发表
验证码:
(快捷键:Ctrl+Enter)
 

本帖信息

点击数:535 回复数:15
评论数: ?
作者:巨大八爪鱼
最后回复:巨大八爪鱼
最后回复时间:2016-8-11 18:03
 
©2010-2024 Arslanbar Ver2.0
除非另有声明,本站采用知识共享署名-相同方式共享 3.0 Unported许可协议进行许可。