Выкладываю альфа-версию прошивки под Вектор-06Ц
Подключение: PA - J3, PB - J2, J1: 1 - УС, 3 - РУС/ЛАТ, 4 - СС.
Раскладка пока только ЙЦУКЕН.
Сам, к сожалению, протестировать не могу.
Код:#include <PS2KeyRaw.h> #define AX0 4 #define AX1 5 #define AX2 6 #define AX3 7 #define AY0 8 #define AY1 9 #define AY2 10 #define SS 11 #define US 12 #define RUS 13 #define RSTMT 14 #define CSMT 15 #define DATMT 16 #define STBMT 17 #define DATAPIN 2 #define IRQPIN 3 volatile boolean d = HIGH; volatile boolean ss = HIGH; volatile boolean us = HIGH; volatile boolean rus = HIGH; uint8_t table[128] = {127,127,127,112,80,48,64,127,127,127,127,127,96,127,127,127,127,1,127,127,127,37,18,127,127,127,22,23, 100,52,34,127,127,54,103,118,86,66,50,127,127,119,85,20,84,53,82,127,127,70,21,38,6,101,98,127,127,127,7,117,116,114,3,127, 127,36,69,55,87,2,19,127,127,4,115,68,102,39,83,127,127,127,71,127,5,127,127,127,127,17,33,87,127,71,127,127,127,127,127,127, 127,127,49,127,127,65,127,0,48,127,127,127,32,16,113,81,112,64,32,127,127,96,97,127,127,80,127,127}; PS2KeyRaw keyboard; void setup() { //Инициализация портов pinMode(AX0, OUTPUT); //AX0 pinMode(AX1, OUTPUT); //AX1 pinMode(AX2, OUTPUT); //AX2 pinMode(AX3, OUTPUT); //AX3 pinMode(AY0, OUTPUT); //AY0 pinMode(AY1, OUTPUT); //AY1 pinMode(AY2, OUTPUT); //AY2 pinMode(SS, OUTPUT); //SS pinMode(US, OUTPUT); //US pinMode(RUS, OUTPUT); //RUS pinMode(RSTMT, OUTPUT); //RES pinMode(CSMT, OUTPUT); //CS pinMode(DATMT, OUTPUT); //DAT pinMode(STBMT, OUTPUT); //STB //Инициализация клавиатуры keyboard.begin( DATAPIN, IRQPIN ); digitalWrite(SS, HIGH); digitalWrite(US, HIGH); digitalWrite(RUS, HIGH); //Инициализация MT8816 SetAddr(0); digitalWrite(RSTMT, LOW); digitalWrite(CSMT, LOW); digitalWrite(DATMT, LOW); digitalWrite(STBMT, LOW); //инициализация digitalWrite(CSMT, HIGH); //выбор чипа digitalWrite(RSTMT, HIGH); digitalWrite(RSTMT, LOW); //сброс digitalWrite(CSMT, LOW); } void SetAddr(uint8_t addr) { digitalWrite(AX0,bitRead(addr,0)); digitalWrite(AX1,bitRead(addr,1)); digitalWrite(AX2,bitRead(addr,2)); digitalWrite(AX3,bitRead(addr,3)); digitalWrite(AY0,bitRead(addr,4)); digitalWrite(AY1,bitRead(addr,5)); digitalWrite(AY2,bitRead(addr,6)); } void SetKey(boolean data){ digitalWrite(CSMT, HIGH); //выбор чипа digitalWrite(STBMT, HIGH); //строб on digitalWrite(DATMT, data); //данные digitalWrite(STBMT, LOW); //строб off digitalWrite(CSMT, LOW); } void loop() { if( keyboard.available() ){ int c = keyboard.read(); //чтение кода switch (c) { case 0xE0: //если считался префикс 0xE0 break; case 0x12: //если считался префикс 0x12 SS ss = !ss; digitalWrite(SS, ss); d = HIGH; break; case 0x14: //если считался префикс 0x14 RUS if (d == HIGH) rus = !rus; digitalWrite(RUS, rus); d = HIGH; break; case 0x58: //если считался префикс 0xE0 US us = !us; digitalWrite(US, us); d = HIGH; break; case 0xF0: //если считался префикс 0xF0 (отпускание клавиши) d = LOW; break; default: SetAddr(table[c]); SetKey(d); d = HIGH; } } }
crackintosh(19.12.2021), KACTET(07.12.2021)
Всем привет.
Собираюсь купить сей девайс для УКНЦ, но нужна помощь клуба сделать под УКНЦ прошивку и развести шлейф.
Объясните, что нужно для разведения шлейфа? В идеале, хочу взять шлейф и колодку IDC-34 и развести нужные пины (пропуская ненужные на J2) на 2 шлейфа в линию для МС-7007.
УКНЦ, ДВК-3, Ленинград-1 (48 кб)
Arseny, нужно схему клавиатуры, прошивку сделать помогу.
В сообщении #53 есть ссылка на схемы для Алесты aleste_keyboard.zip. Там есть и распиновка матрицы и даже картинка как будут распределены кнопки :-)
УКНЦ, ДВК-3, Ленинград-1 (48 кб)
Так никто и не захотел сделать кнопки сброс и nmi? Я всё ещё надеюсь, а то привык, руки тянутся.
Скрытый текст
https://drive.google.com/drive/folde...xZ83juCuaBe32I
Scorpion ZS 256 Turbo+/GMX 2MB/SMUC v1.3 OP/CF-IDE 2GB/TS ARM/Covox #DD/FDD 5'25/FDD 3'5/AT Kbrd & Mouse Ctrl v2.5/Universal PS/2 Kbrd Ctrl/ZX WiFi
Leningrad 1/Sega Joy Adapter
DivGMX
ZX Spectrum +2A
ZX Evolution rev. C
TCK Computer 486DX2-66/512K Tridend 9000i/8MB SIMM72/CF-IDE 512MB/ESS 1869/CNet CN200/FDD 5'25/FDD 3'5
[свернуть]
izzx,
Планирую, в принципе написал (хотя в С я и не ахти как разбираюсь) но еще отлаживать надо, а у меня самодельная клава пока не полностью запустилась. Однако потребуется доработка платы (хотя если только RESET и NMI) можно обойтись и без доработок, можно будет использовать пины программирования меги, надо будет просто в прошивке поправить пины) для вывода наружу не используемых пинов меги.
izzx(14.12.2021)
nemo, еще один выход можно попробовать взять с вывода CS матрицы, а ее прицепить к +5в.
izzx, Пример реализации можно взять из кода для Ветора - там таким образом переключаются кнопки СС, УС, РУС.
Xrust, спасибо. Если не дождусь готового варианта, буду сам делать.
Скрытый текст
https://drive.google.com/drive/folde...xZ83juCuaBe32I
Scorpion ZS 256 Turbo+/GMX 2MB/SMUC v1.3 OP/CF-IDE 2GB/TS ARM/Covox #DD/FDD 5'25/FDD 3'5/AT Kbrd & Mouse Ctrl v2.5/Universal PS/2 Kbrd Ctrl/ZX WiFi
Leningrad 1/Sega Joy Adapter
DivGMX
ZX Spectrum +2A
ZX Evolution rev. C
TCK Computer 486DX2-66/512K Tridend 9000i/8MB SIMM72/CF-IDE 512MB/ESS 1869/CNet CN200/FDD 5'25/FDD 3'5
[свернуть]
izzx, попробуйте. Сам не испытывал еще, но компилируется без ошибок.
Начальное состояние выходов определяется переменными res и nmi. Они расположены на J1 1 и 4. В качестве клавиши Res- Scroll Lock, в качестве NMI - F12. Если на клавиатуре есть Power, Sleep и Wake, наверное удобнее их использовать. С сочетаниями чуть сложнее, но тоже можно сделать. Давайте пока так испытаем.Код:#include <PS2KeyRaw.h> #define AX0 4 #define AX1 5 #define AX2 6 #define AX3 7 #define AY0 8 #define AY1 9 #define AY2 10 #define RES 11 #define NMI 12 #define RSTMT 14 #define CSMT 15 #define DATMT 16 #define STBMT 17 #define DATAPIN 2 #define IRQPIN 3 volatile boolean d = HIGH; volatile boolean res = HIGH; volatile boolean nmi = HIGH; uint8_t table[128] = {127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,0,127,127,32,48,127,127,127,1,17,16,33,49,127, 127,3,2,18,34,51,50,127,127,112,4,19,36,35,52,127,127,115,116,100,20,84,68,127,127,127,114,99,83,67,66,127, 127,127,98,82,81,64,65,127,127,127,127,97,127,80,127,127,127,127,127,127,127,127,127,127,127,113,96,127,127,127,127,127, 127,127,127,127,127,127,64,127,127,127,127,52,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127}; PS2KeyRaw keyboard; void setup() { //Инициализация портов pinMode(AX0, OUTPUT); //AX0 pinMode(AX1, OUTPUT); //AX1 pinMode(AX2, OUTPUT); //AX2 pinMode(AX3, OUTPUT); //AX3 pinMode(AY0, OUTPUT); //AY0 pinMode(AY1, OUTPUT); //AY1 pinMode(AY2, OUTPUT); //AY2 pinMode(RES, OUTPUT); //Reset pinMode(NMI, OUTPUT); //NMI pinMode(RSTMT, OUTPUT); //RES pinMode(CSMT, OUTPUT); //CS pinMode(DATMT, OUTPUT); //DAT pinMode(STBMT, OUTPUT); //STB //Инициализация клавиатуры keyboard.begin( DATAPIN, IRQPIN ); //Инициализация MT8816 SetAddr(0); digitalWrite(RSTMT, LOW); digitalWrite(CSMT, LOW); digitalWrite(DATMT, LOW); digitalWrite(STBMT, LOW); //инициализация digitalWrite(CSMT, HIGH); //выбор чипа digitalWrite(RSTMT, HIGH); digitalWrite(RSTMT, LOW); //сброс digitalWrite(CSMT, LOW); digitalWrite(RES, res); digitalWrite(NMI, nmi); SetAddr(table[0x12]); SetKey(LOW); } void SetAddr(uint8_t addr) { digitalWrite(AX0,bitRead(addr,0)); digitalWrite(AX1,bitRead(addr,1)); digitalWrite(AX2,bitRead(addr,2)); digitalWrite(AX3,bitRead(addr,3)); digitalWrite(AY0,bitRead(addr,4)); digitalWrite(AY1,bitRead(addr,5)); digitalWrite(AY2,bitRead(addr,6)); } void SetKey(boolean data){ digitalWrite(CSMT, HIGH); //выбор чипа digitalWrite(STBMT, HIGH); //строб on digitalWrite(DATMT, data); //данные digitalWrite(STBMT, LOW); //строб off digitalWrite(CSMT, LOW); } void loop() { if( keyboard.available() ){ int c = keyboard.read(); //чтение кода switch (c) { case 0xE0: //если считался префикс 0xE0 break; case 0x7E: //если считался код 0x7E RES (значит клавишу сброса нажали или отпустили - не важно) res = !res; //просто инвертируем состояние переменной digitalWrite(RES, res); //и записываем d = HIGH; //даже если было отпускание клавиши, эта клавиша (Reset) не писалась в матрицу, так что LOW записывать в нее точно не надо. break; case 0x07: //если считался код 0x07 NMI nmi = !nmi; digitalWrite(NMI, nmi); d = HIGH; break; case 0xF0: //если считался префикс 0xF0 (отпускание клавиши) d = LOW; //значит при следующей записи кода в матрицу нужно будет записать LOW, если это не будет какое-то сочетание или NMI/Reset break; case 0x66: //если считался код 0x66 [BS] SetAddr(table[0x12]); SetKey(d); SetAddr(table[0x45]); SetKey(d); d = HIGH; break; case 0x6B: //если считался код 0x6B [Left] SetAddr(table[0x12]); SetKey(d); SetAddr(table[0x2E]); SetKey(d); d = HIGH; break; case 0x72: //если считался код 0x72 [Down] SetAddr(table[0x12]); SetKey(d); SetAddr(table[0x36]); SetKey(d); d = HIGH; break; case 0x75: //если считался код 0x75 [Up] SetAddr(table[0x12]); SetKey(d); SetAddr(table[0x3D]); SetKey(d); d = HIGH; break; case 0x74: //если считался код 0x74 [Right] SetAddr(table[0x12]); SetKey(d); SetAddr(table[0x3E]); SetKey(d); d = HIGH; break; case 0x76: //если считался код 0x76 [Edit] SetAddr(table[0x12]); SetKey(d); SetAddr(table[0x16]); SetKey(d); d = HIGH; break; case 0x58: //если считался код 0x58 [Caps lock] SetAddr(table[0x12]); SetKey(d); SetAddr(table[0x1E]); SetKey(d); d = HIGH; break; case 0x0D: //если считался код 0x0D [Ext mode] SetAddr(table[0x12]); SetKey(d); SetAddr(table[0x59]); SetKey(d); d = HIGH; break; case 0x41: //если считался код 0x41 [,] SetAddr(table[0x59]); SetKey(d); SetAddr(table[0x31]); SetKey(d); d = HIGH; break; case 0x49: //если считался код 0x49 [.] SetAddr(table[0x59]); SetKey(d); SetAddr(table[0x3A]); SetKey(d); d = HIGH; break; case 0x4C: //если считался код 0x4C [;] SetAddr(table[0x59]); SetKey(d); SetAddr(table[0x44]); SetKey(d); d = HIGH; break; case 0x52: //если считался код 0x52 ["] SetAddr(table[0x59]); SetKey(d); SetAddr(table[0x4D]); SetKey(d); d = HIGH; break; default: SetAddr(table[c]); //Тут мы по таблице определяем адрес в матрице SetKey(d); //Записываем состояние ключа в матрицу d = HIGH; //Мы ведь могли и LOW записать, если ранее был считан префикс отпускания 0xF0. Так что теперь приготовимся записать HIGH. } } }
izzx(15.12.2021)
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)