First of all apologies for resurrecting this old thread.
I just wanted to add that I recently got an Arduino Uno board and I connected the scoreboard to it in order to test it.
It worked perfectly, so I can rule out a problem with the scoreboard itself.
I'll have to check the computers/software I used.
In case anyone is interested, I've found someone online, from Germany (
https://www-user.tu-chemnitz.de/~heha/b ... C/USB2LPT/), who has designed and sells USB-To-Parallel Port boards which are recognised and function as full parallel ports. The commersial converters which are commonly available are not full parallel ports. They act as some form of printer emulator and they are not meant to be used as a full printer port.
I haven't puchased one because the price with shipping is 20Euros.
Btw I can now verify that the voltage divider on pins 9 can be ommited. On the ICM7218D chips there is basically an internal divider inside the chips for the same purpose.
The purpose is to set pin 9 to around half the voltage of 5V which sets the character encoding to "Code B".
In case somebody looks for a way to do the same I'll include below the code I used for the Arduino.
It only controls one of the chips so you must switch pin 7 to the other chip in order to test it.
I found online examples for the ICM7218A and B chips but these operate quite differently from the C and D versions of the ICM7218. So I had to make some changes.
The code only supports "Code B" encoding.
/// Pin usage
#define ID0_PIN 3
#define ID1_PIN 2
#define ID2_PIN 1
#define ID3_PIN 0
#define DA2_PIN 4
#define DA1_PIN 5
#define DA0_PIN 6
#define NOT_WRITE_PIN 7
void setup()
{
// All pins are output
pinMode(ID0_PIN, OUTPUT);
pinMode(ID1_PIN, OUTPUT);
pinMode(ID2_PIN, OUTPUT);
pinMode(ID3_PIN, OUTPUT);
pinMode(DA2_PIN, OUTPUT);
pinMode(DA1_PIN, OUTPUT);
pinMode(DA0_PIN, OUTPUT);
pinMode(NOT_WRITE_PIN, OUTPUT);
// A couple of tests
// 1- Fill with 00000000 to 99999999
for (int i = 0; i < 10; i++) {
write8Digits(i * 11111111);
delay(1000);
}
}
unsigned long counter = 0;
void loop()
{
// Display an infinite counter
write8Digits(counter++);
delay(1000); // If you don't wait at least 2 microseconds, the display doesn't have the time to refresh the 8 digits
}
// Function to write the 8 digits
// Uses Code B encoding in the ICM
void write8Digits(unsigned long num)
{
// Control Mode
digitalWrite(NOT_WRITE_PIN, HIGH);
// Send the 8 digits, starting by the least significant
unsigned long digit = num;
for (byte i = 0; i < 8; i++){
writeDigit(i, digit % 10);
digit /= 10;
}
}
void writeDigit(byte address, byte data)
{
//set digit address
digitalWrite(DA0_PIN, B00000001 & address);
digitalWrite(DA1_PIN, B00000010 & address);
digitalWrite(DA2_PIN, B00000100 & address);
delay(1);
digitalWrite(NOT_WRITE_PIN, LOW);
delay(1);
// I'm using CodeB, so I only need the 4 least significant pins
digitalWrite(ID0_PIN, B00000001 & data);
digitalWrite(ID1_PIN, B00000010 & data);
digitalWrite(ID2_PIN, B00000100 & data);
digitalWrite(ID3_PIN, B00001000 & data);
delay(1);
digitalWrite(NOT_WRITE_PIN, HIGH);
delay(1);
}