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 件のコメント:
コメントを投稿