设置 | 登录 | 注册

目前共有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许可协议进行许可。