|
|
1.1 ! root 1: // ! 2: // nono ! 3: // Copyright (C) 2018 [email protected] ! 4: // ! 5: ! 6: #include "lcd.h" ! 7: ! 8: LCDDevice *gLCD; ! 9: ! 10: LCDDevice::LCDDevice() ! 11: { ! 12: logname = "lcd"; ! 13: devname = "LCD(HD44780)"; ! 14: monitor.Init(16, 2); ! 15: } ! 16: ! 17: LCDDevice::~LCDDevice() ! 18: { ! 19: } ! 20: ! 21: bool ! 22: LCDDevice::PowerOff() ! 23: { ! 24: // オフをどう表現するかはあるが、とりあえずモニタ画面での表示を消すのが ! 25: // 主目的なので空白で埋める。 ! 26: memset(ddram, 0x20, sizeof(ddram)); ! 27: return true; ! 28: } ! 29: ! 30: void ! 31: LCDDevice::SetRW(bool val) ! 32: { ! 33: rw = val; ! 34: putlog(2, "R/W = %c", val ? 'R' : 'W'); ! 35: } ! 36: ! 37: void ! 38: LCDDevice::SetRS(int val) ! 39: { ! 40: rs = val; ! 41: putlog(2, "RS = %d", rs); ! 42: } ! 43: ! 44: void ! 45: LCDDevice::SetE(bool val) ! 46: { ! 47: en = val; ! 48: putlog(2, "E = %d", en); ! 49: } ! 50: ! 51: // E, RS, R/W 線の状態を取得する (PIO1 のポートC 読み込み用) ! 52: uint8 ! 53: LCDDevice::Get() const ! 54: { ! 55: return (en ? 0x80 : 0) ! 56: | (rs >> 6) ! 57: | (rw ? 0x20 : 0); ! 58: } ! 59: ! 60: uint8 ! 61: LCDDevice::Read() ! 62: { ! 63: if (en == false || rw == false) { ! 64: // XXX どうなるんだろ ! 65: return 0xff; ! 66: } ! 67: if (rs == 0) { ! 68: // ステータスレジスタの読み込み ! 69: // B A A A A A A A ! 70: // | +-+-+-+-+-+-+-- アドレスカウンタ ! 71: // +---------------- ビジーフラグ %1=BUSY ! 72: ! 73: // XXX ビジーは未実装 ! 74: return addr; ! 75: } else { ! 76: putlog(0, "未実装データ読み込み"); ! 77: } ! 78: return 0xff; ! 79: } ! 80: ! 81: void ! 82: LCDDevice::Write(uint8 data) ! 83: { ! 84: if (en == false || rw == true) { ! 85: // どうなるんだろ ! 86: return; ! 87: } ! 88: if (rs == 0) { ! 89: // コマンド書き込み ! 90: if ((data & 0x80)) { ! 91: addr = data & 0x7f; ! 92: putlog(1, "DDRAM アドレスセット $%02x", addr); ! 93: } else if ((data & 0x40)) { ! 94: putlog(0, "コマンド書き込み $%02x CGRAM アドレスセット(未実装)", ! 95: data); ! 96: } else if ((data & 0x20)) { ! 97: // ファンクション・セット ! 98: // 0x38 (8ビットバス、2行表示、8ライン/行)モードのみサポート ! 99: if (data != 0x38) { ! 100: putlog(0, "コマンド書き込み $%02x ファンクションセット(未実装)", ! 101: data); ! 102: } ! 103: } else if ((data & 0x10)) { ! 104: // カーソル移動 ! 105: putlog(0, "コマンド書き込み $%02x カーソル移動(未実装)", data); ! 106: } else if ((data & 0x08)) { ! 107: // 表示ON/OFF ! 108: // 文字表示 ON/OFF のみサポート ! 109: disp_char = (data & 0x04); ! 110: // XXX それ以外は未サポート ! 111: } else if ((data & 0x04)) { ! 112: // エントリモード ! 113: addr_inc = (data & 0x02); ! 114: // XXX 表示シフトは未サポート ! 115: } else if ((data & 0x02)) { ! 116: // カーソルホーム ! 117: addr = 0; ! 118: } else if ((data & 0x01)) { ! 119: // 表示クリア ! 120: memset(ddram, 0x20, sizeof(ddram)); ! 121: addr = 0; ! 122: } else { ! 123: // $00 が書き込まれるんだけど、データシートにはないんだよね。 ! 124: // 無視していいかな。 ! 125: putlog(2, "未定義書き込み $%02x", data); ! 126: } ! 127: } else { ! 128: putlog(1, "データ書き込み $%02x (x=%2d,y=%d)", data, ! 129: (addr & 0x3f), (addr / 0x40)); ! 130: ddram[addr] = data; ! 131: // アドレス更新 ! 132: // 1行0x40バイト分あるが実際には0x27までしか存在していない ! 133: if (addr_inc) { ! 134: addr++; ! 135: if (addr == 0x28) ! 136: addr = 0x40; ! 137: if (addr == 0x68) ! 138: addr = 0; ! 139: } else { ! 140: addr--; ! 141: if (addr == -1) ! 142: addr = 0x67; ! 143: if (addr == 0x3f) ! 144: addr = 0x27; ! 145: } ! 146: } ! 147: } ! 148: ! 149: bool ! 150: LCDDevice::MonitorUpdate() ! 151: { ! 152: char buf[17]; ! 153: ! 154: monitor.Clear(); ! 155: ! 156: for (int y = 0; y < 2; y++) { ! 157: memcpy(buf, &ddram[y * 0x40], 16); ! 158: buf[16] = '\0'; ! 159: monitor.Print(0, y, "%s", buf); ! 160: } ! 161: return true; ! 162: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.