Первый эмулятор я делал для дисплея на автомобиле Hover , через LPT порт, теперь это газдо проще сделать на arduino (Arduino).
Для чего он нужен?
Эмулятор нужен для того чтобы расшифровать какими битами включаются сегменты псевдографического дисплея, чтобы на основе этой дешифровки можно было бы подключить головное устройство к компьютеру , а родной дисплей заменить на VGA. Мои исследования показали что принцип работы всех псевдографических дисплеев одинаков, за исключением колличества сегментов и используемых чипов.
Также можно дешифровать данные идущие на дисплей климат контроля и прочие устройства с псевдоргафическими дисплеями.
Линия шины CLK подключается к пину 13 на arduino
Линия шины DI подключается к пину 12 на arduino
Линия шины CE подключается к пину 11 на arduino
Скачать программу.
Код для эмулятора на Arduino
PHP код:
//http://compcar.ru
int CLK = 13;
int DI = 12;
int CE = 11;
int ADDR = 130;
byte ReadByte[20];
int i;
void setup()
{
pinMode(CLK, OUTPUT);
pinMode(DI, OUTPUT);
pinMode(CE, OUTPUT);
Serial.begin(115200);
digitalWrite(CLK, LOW);
digitalWrite(DI, LOW);
digitalWrite(CE, LOW);
delay(1000);
}
//===================================================
void loop()
{
if (Serial.available() > 19)
{
for (i = 0; i < 20; i++)
{
(ReadByte[i]) = Serial.read() ; // принимаем данные с компа в массив
}
Serial.flush(); //очистить входной буфер USB
Send_Adress(); // отправляем адрес устройства
for (i = 0; i < 20; i++)
{
Byte_Out(DI, CLK, ReadByte[i]); //отправляем данные в шину в шину
}
digitalWrite(CE, LOW); // запретить прием данных подчиненым
}
delay(500);
}
//==================================================
void Send_Adress()
{
Byte_Out(DI, CLK, ADDR);
delayMicroseconds(5);
digitalWrite(CE, HIGH);
}
//==================================================
void Byte_Out(uint8_t DI, uint8_t CLK, byte val)
{
int idx;
for (idx = 0; idx < 8; idx++)
{
delayMicroseconds(10);
if (((val << idx) & B10000000) == 128) digitalWrite(DI, HIGH); else digitalWrite(DI, LOW);
// digitalWrite(DI, val & (1 << idx)); /
digitalWrite(CLK, HIGH); // педний фронт синхроимульса
delayMicroseconds(15);
digitalWrite(CLK, LOW); // задний фронт синхроимульса
}
}