Revision 0:2377890cc77a, committed 2016-09-10
- Comitter:
- og
- Date:
- Sat Sep 10 09:55:39 2016 +0000
- Commit message:
- HT1621(TS119-5, TS174) demo
Changed in this revision
diff -r 000000000000 -r 2377890cc77a HT1621.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/HT1621.cpp Sat Sep 10 09:55:39 2016 +0000
@@ -0,0 +1,132 @@
+#include "HT1621.h"
+
+#define ADDR_MAX 128
+
+#define TAKE_CS() _cs = 0
+#define RELEASE_CS() _cs = 1
+
+HT1621::HT1621(
+ PinName data, PinName wr, PinName rd, PinName cs
+ ):
+ _data(data), _wr(wr), _rd(rd), _cs(cs)
+{
+ _data.output();
+ _data = 1;
+ _wr = 1;
+ _rd = 1;
+ _cs = 1;
+ sendCommand(SYS_DIS);
+ wait_ms(500);
+ //if (! testMem())
+ // return false;
+
+ memset(0, 0, ADDR_MAX);
+ sendCommand(SYS_EN);
+ sendCommand(LCD_ON);
+}
+
+
+inline bool HT1621::testMem()
+{
+ uint8_t test = 10;
+ writeMem(0x5a, test);
+ if (readMem(0x5a) != test)
+ return false;
+ return true;
+}
+
+
+void HT1621::writeBits(uint8_t data, uint8_t cnt)
+{
+ while (cnt) {
+ _wr = 0;
+ uint8_t bitval = (data & (1 << (cnt - 1))) ? 1 : 0;
+ _data = bitval;
+ //wait_ms(1);
+ _wr = 1;
+ cnt--;
+ }
+}
+
+uint8_t HT1621::readBits(uint8_t cnt)
+{
+ uint8_t data = 0;
+ _data.input();
+ while (cnt) {
+ _rd = 0;
+ data += _data << (cnt - 1);
+ //wait_ms(1);
+ _rd= 1;
+ cnt--;
+ }
+ _data.output();
+ return data;
+}
+
+#define COMMAND_MODE 0b100
+void HT1621::sendCommand(uint8_t cmd, bool first /*= true*/, bool last /*= true*/)
+{
+ if (first) {
+ TAKE_CS();
+ writeBits(COMMAND_MODE, 3);
+ }
+ writeBits(cmd, 8);
+ writeBits(0, 1); //Last bit - don't care
+ if (last)
+ RELEASE_CS();
+}
+
+#define WRITE_MODE 0b101
+void HT1621::writeMem(uint8_t address, uint8_t data)
+{
+ TAKE_CS();
+ writeBits(WRITE_MODE, 3);
+ writeBits(address, 6);
+ writeBits(data, 4);
+ RELEASE_CS();
+}
+
+void HT1621::memset(uint8_t address, uint8_t data, uint8_t cnt)
+{
+ TAKE_CS();
+ writeBits(WRITE_MODE, 3);
+ writeBits(address, 6);
+ for (uint8_t i = 0; i < cnt; i++)
+ writeBits(data, 4);
+ RELEASE_CS();
+}
+
+//Write up to 256 values starting from address
+//Note: Data is 8-bit aligned. This is not vary efficient
+void HT1621::write(uint8_t address, uint8_t *data, uint8_t cnt)
+{
+ TAKE_CS();
+ writeBits(WRITE_MODE, 3);
+ writeBits(address, 6);
+ for (uint8_t i = 0; i < cnt; i++)
+ writeBits(data[i], 4);
+ RELEASE_CS();
+}
+
+#define READ_MODE 0b110
+uint8_t HT1621::readMem(uint8_t address)
+{
+ uint8_t data;
+ TAKE_CS();
+ writeBits(READ_MODE, 3);
+ writeBits(address, 6);
+ data = readBits(4);
+ RELEASE_CS();
+ return data;
+}
+
+#define READ_MODE 0b110
+void HT1621::read(uint8_t address, uint8_t *data, uint8_t cnt)
+{
+ TAKE_CS();
+ writeBits(READ_MODE, 3);
+ writeBits(address, 6);
+ for (uint8_t i = 0; i < cnt; i++)
+ data[i] = readBits(4);
+ RELEASE_CS();
+}
diff -r 000000000000 -r 2377890cc77a HT1621.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/HT1621.h Sat Sep 10 09:55:39 2016 +0000
@@ -0,0 +1,75 @@
+/* HT1621 - Holtek RAM Mapping 32x4 LCD Controller */
+/**
+ * TEST
+ * TS119-3
+ * TS119-5 http://www.aitendo.com/product/5152
+ * TS174 http://www.aitendo.com/product/5153
+ * http://www.holtek.com.tw/documents/10179/a33bf4b4-f0ef-4b77-94e4-3dd5d0c35f16
+ *
+ * HT1621 Library
+ * https://storage.googleapis.com/google-code-archive-source/v2/code.google.com/wirejungle/source-archive.zip
+ *
+ * reference
+ * http://jr4pdp.blog.enjoy.jp/myblog/2016/01/lcd-ts174nblpic-da92.html
+ * http://morecatlab.akiba.coocan.jp/lab/index.php/2015/10/segment-lcd/
+*/
+#ifndef MBED_HT1621_H
+#define MBED_HT1621_H
+#include "mbed.h"
+
+class HT1621 {
+public:
+ enum {
+ SYS_DIS = 0b00000000,
+ SYS_EN = 0b00000001,
+ LCD_OFF = 0b00000010,
+ LCD_ON = 0b00000011,
+ TIMER_DIS = 0b00000100,
+ WDT_DIS = 0b00000101,
+ TIMER_EN = 0b00000110,
+ WDT_EN = 0b00000111,
+ TONE_OFF = 0b00001000,
+ TONE_ON = 0b00001001,
+
+ //Set bias to 1/2 or 1/3 cycle
+ //Set to 2,3 or 4 connected COM lines
+ BIAS_HALF_2_COM = 0b00100000,
+ BIAS_HALF_3_COM = 0b00100100,
+ BIAS_HALF_4_COM = 0b00101000,
+ BIAS_THIRD_2_COM = 0b00100001,
+ BIAS_THIRD_3_COM = 0b00100101,
+ BIAS_THIRD_4_COM = 0b00101001,
+
+ //Don't use
+ TEST_ON = 0b11100000,
+ TEST_OFF = 0b11100011
+ } Commands;
+
+ HT1621(
+ PinName data, PinName wr, PinName rd, PinName cs
+ );
+ ~HT1621(){}
+
+
+ void sendCommand(uint8_t cmd, bool first = true, bool last = true);
+
+ void write(uint8_t address, uint8_t *data, uint8_t cnt);
+ void read(uint8_t address, uint8_t *data, uint8_t cnt);
+
+ void writeMem(uint8_t address, uint8_t data);
+ uint8_t readMem(uint8_t address);
+
+ void memset(uint8_t address, uint8_t data, uint8_t cnt);
+
+private:
+ DigitalInOut _data;
+ DigitalOut _wr, _rd, _cs;
+ void writeBits(uint8_t data, uint8_t cnt);
+ uint8_t readBits(uint8_t cnt);
+
+ inline void initControlBus();
+ inline bool testMem();
+
+};
+
+#endif //HT1621_H