Да, на плате PLCC не предусмотрены контакты для подключения отладочного порта.
Выкладываю альфа-версию прошивки под Вектор-06Ц
Подключение: PA - J3, PB - J2, J1: 1 - УС, 3 - РУС/ЛАТ, 4 - СС.
Раскладка пока только ЙЦУКЕН.
Сам, к сожалению, протестировать не могу.
https://i.ibb.co/wcRW23K/sdr.jpg
Код:#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;
}
}
}
Всем привет.
Собираюсь купить сей девайс для УКНЦ, но нужна помощь клуба сделать под УКНЦ прошивку и развести шлейф.
Объясните, что нужно для разведения шлейфа? В идеале, хочу взять шлейф и колодку IDC-34 и развести нужные пины (пропуская ненужные на J2) на 2 шлейфа в линию для МС-7007.
Arseny, нужно схему клавиатуры, прошивку сделать помогу.
В сообщении #53 есть ссылка на схемы для Алесты aleste_keyboard.zip. Там есть и распиновка матрицы и даже картинка как будут распределены кнопки :-)
Так никто и не захотел сделать кнопки сброс и nmi? Я всё ещё надеюсь, а то привык, руки тянутся.
izzx,
Планирую, в принципе написал (хотя в С я и не ахти как разбираюсь) но еще отлаживать надо, а у меня самодельная клава пока не полностью запустилась. Однако потребуется доработка платы (хотя если только RESET и NMI) можно обойтись и без доработок, можно будет использовать пины программирования меги, надо будет просто в прошивке поправить пины) для вывода наружу не используемых пинов меги.
nemo, еще один выход можно попробовать взять с вывода CS матрицы, а ее прицепить к +5в.
izzx, Пример реализации можно взять из кода для Ветора - там таким образом переключаются кнопки СС, УС, РУС.
Xrust, спасибо. Если не дождусь готового варианта, буду сам делать.
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.
}
}
}