Описание
Индикаторная панель МС6205 на основе индикатора ГИП10000
- Рабочая область экрана 119*119мм
- Разрешение 100*100 точек
- Конфигурация - 10 строк по 16 символов с подчеркиванием
ГИП10000 по умолчанию - графический индикатор. Однако контроллер дисплея конфигурирует его как текстовый, с постоянно горящими символами подчеркивания. Кодовая таблица - "чережопный" КОИ-7 - зашита непосредственно в ПЗУ индикаторной панели. "Черезжопный" потому что октеты символов инвертированы.
Индикаторная панель требует два типа питания - +5В и +12В. Все остальные напряжения необходимые для работы - вырабатываются самой панелью.
Интерфейс - параллельный. 8 линий адреса, 7 линий данных. Можно мультиплексировать шину адреса и шину данных, указывая на отдельном пине что сейчас подается.
Происхождение
Конкретно моя панель стояла на советском счетчике банкнот "Банкнота-1"
Подарил Андрей М. За что ему спасибо. У панели родной шлейф, который был прозвонен, к нему были подпаяны две колодки и индикатор был подключен к плате ардуино.
Индикатор исправен и будет использоваться в эмуляторе лампового компьютера на ПЛИС
Код для Arduino
шина данных и шина адреса смультиплексированы, к пинам 11 10 и 12 подключены Wr, Addr, и Rst - исходя из нумерации дефиниций.
#define WR (11)
#define RST (10)
#define ADR (12)
void setup() {
Serial.begin(38400);
// put your setup code here, to run once:
for (uint8_t i = 2; i <= 20; ++i )
{
pinMode(i, OUTPUT);
digitalWrite(i, LOW);
}
digitalWrite(WR, HIGH);
digitalWrite(ADR, HIGH);
digitalWrite(RST, HIGH);
strobeRst(20);
}
void strobeWr()
{
PORTB &= ~(1 << PB3);
delayMicroseconds(2);
PORTB |= (1 << PB3);
}
void strobeAddr()
{
PORTB &= ~(1 << PB4);
delayMicroseconds(2);
PORTB |= (1 << PB4);
}
void strobeRst(uint8_t row)
{
uint8_t startPos = row < 10 ? row * 16 : 0;
uint8_t endPos = row < 10 ? row * 16 + 16 : 160;
for (uint8_t i = startPos; i < endPos; ++i)
{
sendAddr(i);
sendData(0x5F);
}
sendAddr(0);
}
void sendPort(uint8_t data)
{
PORTC &= ~0x3F;
PORTC |= data & 0x3F;
PORTB &= ~0x03;
PORTB |= (data >> 6) & 0x03;
}
void sendAddr(uint8_t addr)
{ sendPort(addr); strobeAddr();}
void sendData(uint8_t data)
{ sendPort(data); strobeWr();}
uint8_t pos = 0;
unsigned long previousMillis = 0; // will store last time LED was updated
const long interval = 1; // interval at which to blink (milliseconds)
uint8_t convertChar(uint8_t data)
{
uint8_t high = 0x70 - (data & 0xf0);
uint8_t low = (0x0f - (data & 0x0f)) & 0x0f;
return high | low;
}
void loop() {
while (1)
{ // put your main code here, to run repeatedly:
if (Serial.available() > 0)
{
uint8_t symbol = Serial.read();
if (symbol == 0xff)
pos = 1;
else
{
if ((symbol & 0xf0) == 0xf0)
{
strobeRst(symbol & 0x0f);
pos = 0;
}
switch (pos)
{
case 1:
sendAddr(symbol);
pos = 2;
break;
case 2:
sendData(symbol);
pos = 0;
break;
}
}
}
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= 1) {
previousMillis = currentMillis;
Serial.write(0xfd);
}
}
}
Видео
Ссылки