2011年5月1日日曜日

NetduinoでLCD

using System.Threading;
using Microsoft.SPOT.Hardware;

namespace NetduinoApplication1
{
    class LCD
    {
        private OutputPort pinRS;
        private OutputPort pinRW;
        private OutputPort pinE;
        private TristatePort[] pinDB;

        public LCD(
            Cpu.Pin RS, Cpu.Pin RW, Cpu.Pin E,
            Cpu.Pin DB4, Cpu.Pin DB5, Cpu.Pin DB6, Cpu.Pin DB7)
        {
            pinRS = new OutputPort(RS, false);
            pinRW = new OutputPort(RW, false);
            pinE = new OutputPort(E, false);
            pinDB = new TristatePort[4];
            pinDB[0] = new TristatePort(DB4, false, false, Port.ResistorMode.PullUp);
            pinDB[1] = new TristatePort(DB5, false, false, Port.ResistorMode.PullUp);
            pinDB[2] = new TristatePort(DB6, false, false, Port.ResistorMode.PullUp);
            pinDB[3] = new TristatePort(DB7, false, false, Port.ResistorMode.PullUp);
            pinDB[0].Active = true;
            pinDB[1].Active = true;
            pinDB[2].Active = true;
            pinDB[3].Active = true;

            Thread.Sleep(100);

            init();
        }

        private void init()
        {
            Thread.Sleep(100);
            S4B(0x30);
            Thread.Sleep(5);
            S4B(0x30);
            Thread.Sleep(1);
            S4B(0x30);
            Thread.Sleep(1);
            S4B(0x20);
            Thread.Sleep(1);
            S8B(0x28);
            Thread.Sleep(1);
            S8B(0x08);
            Thread.Sleep(1);
            S8B(0x01);
            Thread.Sleep(1);
            S8B(0x06);
            Thread.Sleep(1);

            S8B(0x0C);
            Thread.Sleep(1);
            S8B(0x41, true);

            Clear();
            Thread.Sleep(10);
            Print("hello");
        }

        public void Clear()
        {
            S8B(0x01);
        }

        public void Print(string text)
        {
            byte[] da = new byte[text.Length];

            for (int i = 0; i < text.Length; i++)
            {
                da[i] = (byte)text[i];
            }

            Write(da, 0, da.Length);
        }

        private void Write(byte[] buffer, int offset, int count)
        {
            for (int i = offset; i < count; i++)
            {
                S8B(buffer[i], true);
            }
        }

        public void S8B(byte cmd, bool RS = false, bool RW = false)
        {
            pinRS.Write(RS);
            pinRW.Write(RW);
            pinDB[0].Write((cmd & 0x10) != 0);
            pinDB[1].Write((cmd & 0x20) != 0);
            pinDB[2].Write((cmd & 0x40) != 0);
            pinDB[3].Write((cmd & 0x80) != 0);
            pinE.Write(true);
            pinE.Write(false);

            pinDB[0].Write((cmd & 0x01) != 0);
            pinDB[1].Write((cmd & 0x02) != 0);
            pinDB[2].Write((cmd & 0x04) != 0);
            pinDB[3].Write((cmd & 0x08) != 0);
            pinE.Write(true);
            pinE.Write(false);
        }

        private void S4B(byte cmd,bool RS = false,bool RW = false)
        {
            pinRS.Write(RS);
            pinRW.Write(RW);
            pinDB[0].Write((cmd & 0x10) != 0);
            pinDB[1].Write((cmd & 0x20) != 0);
            pinDB[2].Write((cmd & 0x40) != 0);
            pinDB[3].Write((cmd & 0x80) != 0);
            pinE.Write(true);
            pinE.Write(false);
        }
    }
}

NetduinoおよびNetduino Plusで動作可能
Mainとかで

LCD lcd = new LCD(
                Pins.GPIO_PIN_D4, Pins.GPIO_PIN_D5, Pins.GPIO_PIN_D6,
                Pins.GPIO_PIN_A2, Pins.GPIO_PIN_A3, 
                Pins.GPIO_PIN_A4, Pins.GPIO_PIN_A5);
とかを実行してやれば
4ビットモードのリードライト対応です
ただまだリードは実装してない
new LCDの時点でピンを設定してやって自動的に初期化もされるので
Print("hello world");
とか実行してやれば文字表示ができます

もうちょっと機能追加して回路図とうpするかな
需要があるなら…

0 件のコメント:

コメントを投稿