This adds an I2C interface to a specific LCD harvested from an unknown Philips CD/Radio system. The interface is based upon an ATTINY85 and uses the Arduino core.
The LCD is equiped with an ET8861S driver. Though there's no public documentation available it appears to be compatible with the well-known HT1621 chip.
The display itself contains:
- Seven 13-segment digits
- Two segments representing a dot (
.
) and a colon (:
) right before the last two digits. - A number of segments representing system state like "MP3", "AUX",
"CD", "TRACK", "SLEEP" etc.
Those are not fully covered by this I2C interface.
So we basically have seven (more or less) alphanumeric digits plus dot and colon symbols at a fixed position.
- ATTINY board configuration from
https://github.com/SpenceKonde/ATTinyCore - VSCode with the "official" Arduino extension
(vsciot-vscode.vscode-arduino)
The main file, "ET8861S_I2C.ino", provides some options as CPP definitions:
- I2C_ADDRESS
Default: 0x14 - SHOW_GREETING
1 = Shows some greeting upon power on - ET8861_PIN_CS, ET8861_PIN_WR and ET8861_PIN_DATA
PIN definitions for display PCB connection.
I2C is implemented using the default "SCL" and "DI" pins. It uses hardware based serial and is tested with ATTINY85 and ATTINY4313 (ATTINY2313 does not provide enough Flash and RAM space).
The ET8861S shares pins with I2C and flashing. Disconnecting the I2C bus during flash operation is recommended.
The implementation only provides write access, no read or write/read.
command | data bytes | description |
---|---|---|
0x0 | 0 | Clears the display |
0x1 | 7 | Shows an ASCII string. Not all characters are supported, see ET8861.cpp . |
0x2 | 2 | Shows an ASCII character at a given position. The first data byte represents the position (0-6), the second one the character. |
0x3 | 1 | Enables / disables the dot and colon symbols (at their fixed position). The data byte is bit-coded: Bit 0 represents colon, bit 1 dot. |
0x4 | 3 | Sets arbitrary segments at a given digit position. The first data byte represents the position, the second and third contain the bit-coded segments (MSB first). See ET8861.cpp for segment mapping. |
As long as segments are individually set by command 0x4, the according digit position will not be used by the commands 0x1 and 0x2. Setting the segment data to zero enables character access to that digit position. Example:
- Set a single segment at position 2.
- Send a string (command 0x1) "HELLO".
Result: "HE LO
" with the enabled segment at position 2.
- TinyWireS from
https://github.com/rambo/TinyWire