設置 | 登錄 | 註冊

作者共發了16篇帖子。

【程序】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); // 设置显示亮度

內容轉換:

回覆帖子
內容:
用戶名: 您目前是匿名發表。
驗證碼:
看不清?換一張
©2010-2025 Purasbar Ver3.0 [手機版] [桌面版]
除非另有聲明,本站採用知識共享署名-相同方式共享 3.0 Unported許可協議進行許可。