Help me identify this old 16-pin LCD display

Came out of a 2012 toyota 76/78/79series instrument cluster.
It already has the "odo" graphic - the 6-digits following are 7-segment.
I'd like to drive this with an arduino and use it as odometer for the solar car project.
No markings on the display but the socket and board can hint to getting a pinout to drive this thing independently.



Can the board be powered up?

I'd love to give it a crack. But no idea what voltage it runs or which pins are gnd & vcc.

Is there a part number on this part?

Looks like it could be a voltage regulator.

GAC135 4274V50 - is what i can make out on that one.

However. All the traces from the connector seem to run to the large chip on the backside


The large chip is a Fujitsu MB91247 microcontroller. The datasheet for it says:

MB91245/S series is Fujitsu Microelectronics’s general-purpose 32-bit RISC microcontroller, which is designed for embedded control applications that require high-speed real-time processing of consumer appliances. This microcontroller uses FR60Lite as its CPU, compatible with other products in the FR family. This series incorporates an LCD controller and stepping motor controller.

I've added the bold emphasis to highlight the problem you have. The display you have pulled out is literally just the display. There's no display controller built into it so you can't control it via SPI or I2C etc.

You will need an LCD controller chip connected to that display in order to use it.

MB91245.PDF (956.5 KB)

Many thanks for your breakdown.
And yes you are correct. Its only the display. It's all i need. (Reason for wanting this display is that it has the "odo" graphic, call me pedantic. But it'll look nicer in the instrument cluster of our solar car) The cluster/main board will be tossed in the bin. Was only for identification purposes.

So yes you are correct. Ill need an LCD controller chip if i want to drive this with an arduino. I'm just fairly in the dark about what pins are what and thus how to even connect a controller to it and what controller to use even.

Kind regards

You might find this helpfull.

https://tangoofthegeeks.blogspot.com/2020/08/control-bare-lcd-with-just-arduino.html

pretty helpful indeed. going through that now. thanks for the tip!

Also very interesting.
I am very tempted to experiment with the same type of LCD no COG that's just lying there in a corner , taken out of an old Solar charger.

Right. Mucked around. Traced back from legs 140 on the microcontroller to the LCD.
Continuity shows us that our COMS on the LCD display are PIN 16'15'14'13

And our SEGS everything else.

Now to figure out how to drive. Beci'm doing this of a nano. And this is a 2nd display.. i suppose i'll be needing a controller.

Any input is again.. greatly appreciated


Maybe the LCD is build like a 7 segment multiplex 4 digits.

It’s a 5V regulator.

There are two connectors. What does the white one seem to go to?

There are three connectors; one for the display and two for off-board connections. The one nearer the regulator (black) probably brings power to the board. If you can wring out the traces between the regulator and the black connector you should be able to power up the board. Failing that you might try connecting ~12v directly to the regulator legs - see data sheet for pin names/locations.

Now that you have identified four COM pins, I think that you are in a position to do some tests to identify the other pins.

There is a video from EEV blog at https://youtu.be/ZP0KxZl5N2o that shows you how to drive/test a single Liquid Crystal Display.
A brief synopsis is that you need to drive each segment with a square wave signal.

I suggest that you program an Arduino to produce two 100Hz square waves that are in anti-phase.

Code.
unsigned long previousMicros = 0;
int interval = 5000;  // half period in microseconds
int outputA = 8;
int outputB = 9;

void setup() {
  pinMode(outputA, OUTPUT);
  pinMode(outputB, OUTPUT);
  digitalWrite(outputA, HIGH);
  digitalWrite(outputB, LOW);
}

void loop() {
  unsigned long currentMicros = micros();
  if (currentMicros - previousMicros >= interval) {
    previousMicros = currentMicros;
    PORTB = PORTB ^ B00000011;  // Toggle D8 and D9
  }
}
Oscilloscope trace.

Using jumper wires connect one square wave to a COM pin, and connect the other square wave to each of the segment pins in turn.
Record the pin number and segment results whenever you see a segment activated.
Then repeat for the other three COM pins.

This should enable you to find which pin connects to which segment of the LCD.

So that's how they're wired up internally (well similar) mine only has 4 coms. So not sure how that translates to each segment of a digit. But i'll do some probing today.

Legend. I was playing around with chatGPT and it recommend a very similar solution. With a 50hz wave. But it warned never to energise a COM without having the inverted square wave on a SEG.
Feeling a tad nervous. But i'll have a crack at it today and i'll report back!



Played around a bit. Using this code i turned an arduino nano into a suitable test rig.

// =======================================
// Toyota Odometer LCD Segment Mapper
// Arduino Nano test jig
// Drives raw LCD glass with 50 Hz AC waveforms
// COM0..3 vs SEG0..11 mapping
// =======================================

// --- COMs (your wiring) ---
const uint8_t COM_PINS[4] = {
  2,  // COM0 -> LCD Pin16 (TP32 / PD4)
  3,  // COM1 -> LCD Pin15 (TP33 / PD5)
  4,  // COM2 -> LCD Pin14 (TP34 / PD6)
  5   // COM3 -> LCD Pin13 (TP35 / PD7)
};

// --- SEGs (LCD Pin1..Pin12 in order) ---
const uint8_t SEG_PINS[12] = {
  6,   // SEG0 -> LCD Pin1  (TP47)
  7,   // SEG1 -> LCD Pin2  (TP46)
  8,   // SEG2 -> LCD Pin3  (TP45)
  9,   // SEG3 -> LCD Pin4  (TP44)
  10,  // SEG4 -> LCD Pin5  (TP43)
  11,  // SEG5 -> LCD Pin6  (TP42)
  12,  // SEG6 -> LCD Pin7  (TP41)
  13,  // SEG7 -> LCD Pin8  (TP40)
  A0,  // SEG8 -> LCD Pin9  (TP39)
  A1,  // SEG9 -> LCD Pin10 (TP38)
  A2,  // SEG10 -> LCD Pin11 (TP37)
  A3   // SEG11 -> LCD Pin12 (TP36)
};

// --- State ---
volatile bool phase = false;   // toggled at ~50 Hz
uint8_t selCOM = 0;            // active COM index (0..3)
int selSEG = 0;                // active SEG index (0..11)

// =======================================
// Setup
// =======================================
void setup() {
  Serial.begin(115200);
  for (uint8_t p : COM_PINS) pinMode(p, OUTPUT);
  for (uint8_t p : SEG_PINS) pinMode(p, OUTPUT);

  // Timer1 -> ~50 Hz interrupt
  noInterrupts();
  TCCR1A = 0; TCCR1B = 0;
  TCCR1B |= (1 << WGM12);                  // CTC mode
  TCCR1B |= (1 << CS12) | (1 << CS10);     // prescaler /1024
  OCR1A = 312;                             // ~50.1 Hz
  TIMSK1 |= (1 << OCIE1A);                 // enable compare A
  interrupts();

  Serial.println("Commands: cN (COM 0..3), sN (SEG 0..11), h (help)");
  announce();
}

// Timer1 ISR toggles phase
ISR(TIMER1_COMPA_vect) { phase = !phase; }

// =======================================
// Main loop
// =======================================
void loop() {
  // 1) Put all COMs in Hi-Z
  for (uint8_t i = 0; i < 4; i++) pinMode(COM_PINS[i], INPUT);

  // 2) Enable only the selected COM
  pinMode(COM_PINS[selCOM], OUTPUT);
  digitalWrite(COM_PINS[selCOM], phase ? HIGH : LOW);

  // 3) Drive SEGs: selected SEG = inverted; others = same as COM
  for (uint8_t i = 0; i < 12; i++) {
    pinMode(SEG_PINS[i], OUTPUT);
    if (i == selSEG) {
      digitalWrite(SEG_PINS[i], phase ? LOW : HIGH);   // lit
    } else {
      digitalWrite(SEG_PINS[i], phase ? HIGH : LOW);   // off
    }
  }

  // --- Serial control ---
  if (Serial.available()) {
    char cmd = Serial.read();
    if (cmd == 'c') {
      long n = Serial.parseInt();
      if (n >= 0 && n <= 3) { selCOM = n; announce(); }
    } else if (cmd == 's') {
      long n = Serial.parseInt();
      if (n >= 0 && n <= 11) { selSEG = n; announce(); }
    } else if (cmd == 'h' || cmd == '?') {
      help();
    }
  }
}

// =======================================
// Helpers
// =======================================
void announce() {
  // Human-readable
  Serial.print("COM="); Serial.print(selCOM);
  Serial.print(" (LCD pin "); Serial.print(16 - selCOM);
  Serial.print(")  SEG="); Serial.print(selSEG);
  Serial.print(" (LCD pin "); Serial.print(selSEG + 1);
  Serial.println(")");

  // CSV line
  Serial.print("CSV,COM"); Serial.print(selCOM);
  Serial.print(",SEG"); Serial.print(selSEG);
  Serial.print(",LCDpin"); Serial.println(selSEG + 1);
}

void help() {
  Serial.println("Commands:");
  Serial.println("  cN  -> select COM (0..3)  (LCD pins 16,15,14,13)");
  Serial.println("  sN  -> select SEG (0..11) (LCD pins 1..12)");
  Serial.println("  h/? -> this help");
}

Next up.. WIring table to drive this puppy through a HT1621.

Found another example that shows how to only use an Arduino.
https://forum.arduino.cc/t/demo-of-controlling-a-bare-lcd-with-an-arduino-no-driver-no-library/1384936