Сообщение от
Serg6845
есть один момент - в случае когда для опроса клавиш одновременно падают в 0 больше одного адреса - в такой схеме возникнет конфликт выходных уровней у активных регистров. чтобы этого избежать - нужно либо регисиры с выходами ОК, либо по диоду в разрыв каждого выхода каждого регистра (40 штук).
Не очень понятно к каким последствиям это ведёт. Если я правильно понимаю, то в этом случае при наличии на одном регистре 1, а на другом 0 на том же разряде, ток просто потечёт через OD вход (или не потечёт, по идее там встроенный диод в самом полевом транзисторе на выходе есть). Я эту схему на макетке собрал и проверил на самопальном клоне, ничего не греется вроде и видимых глюков нет. 596 от 595 отличается только тем, что 595 есть 3 состояние, а по даташиту от TI выходы у них по одной и той же схеме сделаны.
Сообщение от
andykarpov
А как работает джойстик?
Это на перспективу было, вообще-то, но сел - припаял 5 проводов к джойстику от Dendy и его тоже завёл. Просто вычитываю 8 бит состояния кнопок и подмешиваю их при выводе в регистры, на кнопки 6,7,8,9,0,Enter,L,SPC. Точно так же можно джойстик от Super Nintendo подключить, там внутренний регистр на 16 бит.
Код:
void init_gamepad(int pin_data, int pin_latch, int pin_clock)
{
pinMode(pin_data, INPUT_PULLUP);
pinMode(pin_clock, OUTPUT);
pinMode(pin_latch, OUTPUT);
digitalWrite(pin_clock, HIGH);
}
int get_gamepad_state(int pin_data, int pin_latch, int pin_clock)
{
digitalWrite(pin_latch, HIGH);
delayMicroseconds(JDELAY);
digitalWrite(pin_latch, LOW);
int keys_state = 0;
for (int i = 0; i < JSER_COUNT; ++i) {
delayMicroseconds(JDELAY);
digitalWrite(pin_clock, LOW);
keys_state <<= 1;
keys_state |= digitalRead(pin_data);
delayMicroseconds(JDELAY);
digitalWrite(pin_clock, HIGH);
}
return keys_state;
}
void fill_gamepad_matrix(int jstate)
{
gamepad_matrix[GP_K_A] = (jstate & 0x80)>0 ? false : true;
gamepad_matrix[GP_K_B] = (jstate & 0x40)>0 ? false : true;
gamepad_matrix[GP_K_SEL] = (jstate & 0x20)>0 ? false : true;
gamepad_matrix[GP_K_START] = (jstate & 0x10)>0 ? false : true;
gamepad_matrix[GP_K_U] = (jstate & 0x08)>0 ? false : true;
gamepad_matrix[GP_K_D] = (jstate & 0x04)>0 ? false : true;
gamepad_matrix[GP_K_L] = (jstate & 0x02)>0 ? false : true;
gamepad_matrix[GP_K_R] = (jstate & 0x01)>0 ? false : true;
}