МС6205: различия между версиями
Radiolok (обсуждение | вклад) |
Radiolok (обсуждение | вклад) |
||
Строка 27: | Строка 27: | ||
Индикатор исправен и будет использоваться в эмуляторе лампового компьютера на ПЛИС | Индикатор исправен и будет использоваться в эмуляторе лампового компьютера на ПЛИС | ||
<syntaxhighlight lang="c"> | |||
#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) { | |||
// save the last time you blinked the LED | |||
previousMillis = currentMillis; | |||
Serial.write(0xfd); | |||
} | |||
} | |||
} | |||
</syntaxhighlight> | |||
== Видео == | == Видео == |
Версия 20:31, 29 июня 2020
Описание
Индикаторная панель МС6205 на основе индикатора ГИП10000
- Рабочая область экрана 119*119мм
- Разрешение 100*100 точек
- Конфигурация - 10 строк по 16 символов с подчеркиванием
ГИП10000 по умолчанию - графический индикатор. Однако контроллер дисплея конфигурирует его как текстовый, с постоянно горящими символами подчеркивания. Кодовая таблица - "чережопный" КОИ-7 - зашита непосредственно в ПЗУ индикаторной панели. "Черезжопный" потому что октеты символов инвертированы.
Индикаторная панель требует два типа питания - +5В и +12В. Все остальные напряжения необходимые для работы - вырабатываются самой панелью.
Интерфейс - параллельный. 8 линий адреса, 7 линий данных. Можно мультиплексировать шину адреса и шину данных, указывая на отдельном пине что сейчас подается.
Происхождение
Конкретно моя панель стояла на советском счетчике банкнот "Банкнота-1"
Подарил Андрей М. За что ему спасибо. У панели родной шлейф, который был прозвонен, к нему были подпаяны две колодки и индикатор был подключен к плате ардуино.
Индикатор исправен и будет использоваться в эмуляторе лампового компьютера на ПЛИС
#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) {
// save the last time you blinked the LED
previousMillis = currentMillis;
Serial.write(0xfd);
}
}
}
Видео
Ссылки
- http://retropc.org/Indikator_Elektronika_MS6205_s_138.html - Внутренности
- Файл:Indikator elektronika ms6205.djvu - Технмческое описание и инструкция по эксплуатации