Depois de algum tempo estudando e fazendo alguns experimentos com o roteamento da placa cheguei ao circuito básico do emulador de teclado para ser colocado sobre a PPI.
Esta disposição de pinos permitiu fazer ligações praticamente retas entre o AVR e a PPI de forma que a placa de circuito impressso possa ser de face simples
As linhas PC0..PC3 da PPI foram direto aos pinos PINC0..3 do AVR. Com isso apenas as colunas trocaram um pouco de lugar (PB3 foi para o bit 0, etc)
Assim a matriz de teclado mudou para
// Matrix columns reorganized for optimizing PCB layout
7 6 5 4 3 2 1 0 BIT
+-----------------------------------------------+
¦ 4 ¦ 3 ¦ 2 ¦ 1 ¦ 0 ¦ 5 ¦ 6 ¦ 7 ¦ Row 0
+-----+-----+-----+-----+-----+-----+-----+-----¦
¦ \ ¦ = ¦ - ¦ 9 ¦ 8 ¦ ´ ¦ ¨ ¦ Ç ¦ Row 1
+-----+-----+-----+-----+-----+-----+-----+-----¦
¦ / ¦ . ¦ , ¦ [ ¦ ~ ¦ < ¦ A ¦ B ¦ Row 2
+-----+-----+-----+-----+-----+-----+-----+-----¦
¦ G ¦ F ¦ E ¦ D ¦ C ¦ H ¦ I ¦ J ¦ Row 3
+-----+-----+-----+-----+-----+-----+-----+-----¦
¦ O ¦ N ¦ M ¦ L ¦ K ¦ P ¦ Q ¦ R ¦ Row 4
+-----+-----+-----+-----+-----+-----+-----+-----¦
¦ W ¦ V ¦ U ¦ T ¦ S ¦ X ¦ Y ¦ Z ¦ Row 5
+-----+-----+-----+-----+-----+-----+-----+-----¦
¦CODE ¦ CAP ¦GRAPH¦CTRL ¦SHIFT¦ F1 ¦ F2 ¦ F3 ¦ Row 6
+-----+-----+-----+-----+-----+-----+-----+-----¦
¦STOP ¦ TAB ¦ ESC ¦ F5 ¦ F4 ¦ BS ¦ SEL ¦ CR ¦ Row 7
+-----+-----+-----+-----+-----+-----+-----+-----¦
¦LEFT ¦ DEL ¦ INS ¦HOME ¦SPACE¦ UP ¦DOWN ¦RIGHT¦ Row 8
+-----------------------------------------------+
4 3 2 1 0 5 6 7 Column
E o endereço das teclas ficou:
// ROW 0 Hexa
#define _0 0x03
#define _1 0x04
#define _2 0x05
#define _3 0x06
#define _4 0x07
#define _5 0x02
#define _6 0x01
#define _7 0x00
// ROW 1
#define _8 0x0B
#define _9 0x0C
#define _MINUS 0x0D
#define _EQUAL 0x0E
#define _BACKSLASH 0x0F
#define _ACUTE 0x0A
#define _UBER 0x09
#define _CCEDIL 0x08
// ROW 2
#define _TILDE 0x13
#define _OPENBRACKET 0x14
#define _COMMA 0x15
#define _DOT 0x16
#define _SLASH 0x17
#define _LESSTHAN 0x12
#define _A 0x11
#define _B 0x10
// ROW 3
#define _C 0x1B
#define _D 0x1C
#define _E 0x1D
#define _F 0x1E
#define _G 0x1F
#define _H 0x1A
#define _I 0x19
#define _J 0x18
// ROW 4
#define _K 0x23
#define _L 0x24
#define _M 0x25
#define _N 0x26
#define _O 0x27
#define _P 0x22
#define _Q 0x21
#define _R 0x20
// ROW 5
#define _S 0x2B
#define _T 0x2C
#define _U 0x2D
#define _V 0x2E
#define _W 0x2F
#define _X 0x2A
#define _Y 0x29
#define _Z 0x28
// ROW 6
#define _SHIFT 0x33
#define _CONTROL 0x34
#define _GRAPH 0x35
#define _CAPS 0x36
#define _CODE 0x37
#define _F1 0x32
#define _F2 0x31
#define _F3 0x30
// ROW 7
#define _F4 0x3B
#define _F5 0x3C
#define _ESC 0x3D
#define _TAB 0x3E
#define _STOP 0x3F
#define _BACKSPACE 0x3A
#define _SELECT 0x39
#define _ENTER 0x38
// ROW 8
#define _SPACE 0x43
#define _HOME 0x44
#define _INSERT 0x45
#define _DELETE 0x46
#define _LEFT 0x47
#define _UP 0x42
#define _DOWN 0x41
#define _RIGHT 0x40
Finalmente, as tabelas de caracteres sem e com shift ficaram assim:
// Keys ordered by PS/2 Scancode
const uint8_t PS2Keymap_Normal[] PROGMEM = {
_NONE , // 0x00
_F9 , // 0x01 F9
_NONE , // 0x02
_F5 , // 0x03 F5
_F3 , // 0x04 F3
_F1 , // 0x05 F1
_F2 , // 0x06 F2
_STOP , // 0x07 F12
_NONE , // 0x08
_F10 , // 0x09 F10
_F8 , // 0x0A F8
_F6 , // 0x0B F6
_F4 , // 0x0C F4
_TAB , // 0x0D TAB
_APOSTROPHE , // 0x0E APOSTROPHE '
_NONE , // 0x0F
_NONE , // 0x10
_GRAPH , // 0x11 L ALT
_SHIFT , // 0x12 L SHFT
_NONE , // 0x13
_CONTROL , // 0x14 L CTRL
_Q , // 0x15 Q
_1 , // 0x16 1
_NONE , // 0x17
_NONE , // 0x18
_NONE , // 0x19
_Z , // 0x1A Z
_S , // 0x1B S
_A , // 0x1C A
_W , // 0x1D W
_2 , // 0x1E 2
_NONE , // 0x1F
_NONE , // 0x20
_C , // 0x21 C
_X , // 0x22 X
_D , // 0x23 D
_E , // 0x24 E
_4 , // 0x25 4
_3 , // 0x26 3
_NONE , // 0x27
_NONE , // 0x28
_SPACE , // 0x29 SPACE
_V , // 0x2A V
_F , // 0x2B F
_T , // 0x2C T
_R , // 0x2D R
_5 , // 0x2E 5
_NONE , // 0x2F
_NONE , // 0x30
_N , // 0x31 N
_B , // 0x32 B
_H , // 0x33 H
_G , // 0x34 G
_Y , // 0x35 Y
_6 , // 0x36 6
_NONE , // 0x37
_NONE , // 0x38
_NONE , // 0x39
_M , // 0x3A M
_J , // 0x3B J
_U , // 0x3C U
_7 , // 0x3D 7
_8 , // 0x3E 8
_NONE , // 0x3F
_NONE , // 0x40
_COMMA , // 0x41 COMMA ,
_K , // 0x42 K
_I , // 0x43 I
_O , // 0x44 O
_0 , // 0x45 0
_9 , // 0x46 9
_NONE , // 0x47
_NONE , // 0x48
_DOT , // 0x49 DOT .
_SEMICOLON , // 0x4A SEMICOLON ;
_L , // 0x4B L
_CCEDIL , // 0x4C CCCEDIL Ç
_P , // 0x4D P
_MINUS , // 0x4E MINUS -
_NONE , // 0x4F
_NONE , // 0x50
_SLASH , // 0x51 SLASH /
_TILDE , // 0x52 TILDE ~
_NONE , // 0x53
_ACUTE , // 0x54 ACUTE `
_EQUAL , // 0x55 EQUAL =
_NONE , // 0x56
_NONE , // 0x57
_CAPS , // 0x58 CAPS
_SHIFT , // 0x59 R SHFT
_ENTER , // 0x5A ENTER
_OPENBRACKET, // 0x5B OPENBRACKET [
_NONE , // 0x5C
_CLOSEBRACKET, // 0x5D CLOSEBRACKET ]
_NONE , // 0x5E
_NONE , // 0x5F
_NONE , // 0x60
_BACKSLASH , // 0x61 BACKSLASH
_NONE , // 0x62
_F7 , // 0x63 F7 (relocated from 0x83 to keep table under 128 chars
_NONE , // 0x64
_NONE , // 0x65
_BACKSPACE , // 0x66 BKSP
_NONE , // 0x67
_NONE , // 0x68
_1 , // 0x69 KP1
_NONE , // 0x6A
_4 , // 0x6B KP4
_7 , // 0x6C KP7
_DOT , // 0x6D KPDOT .
_NONE , // 0x6E
_NONE , // 0x6F
_0 , // 0x70 KP0
_COMMA , // 0x71 KPCOMMA ,
_2 , // 0x72 KP2
_5 , // 0x73 KP5
_6 , // 0x74 KP6
_8 , // 0x75 KP8
_ESC , // 0x76 ESC
_NONE , // 0x77 NUM
_SELECT , // 0x78 F11
_PLUS , // 0x79 KPPLUS +
_3 , // 0x7A KP3
_MINUS , // 0x7B KPMINUS -
_ASTERISK , // 0x7C KPTIMES *
_9 , // 0x7D KP9
_NONE , // 0x7E SCROLL
_NONE , // 0x7F
};
/*
_NONE , // 0x80
_NONE , // 0x81
_NONE , // 0x82
_F7 // 0x83 F7
};
*/
const uint8_t PS2Keymap_Shifted[] PROGMEM = {
_NONE , // 0x00
_F9 , // 0x01
_NONE , // 0x02
_F5 , // 0x03
_F3 , // 0x04
_F1 , // 0x05
_F2 , // 0x06
_SELECT , // 0x07
_NONE , // 0x08
_F10 , // 0x09
_F8 , // 0x0A
_F6 , // 0x0B
_F4 , // 0x0C
_TAB , // 0x0D
_QUOTE , // 0x0E QUOTE "
_NONE , // 0x0F
_NONE , // 0x10
_GRAPH , // 0x11
_SHIFT , // 0x12
_NONE , // 0x13
_CONTROL , // 0x14
_Q , // 0x15
_EXCLAMATION, // 0x16 EXCLAMATION !
_NONE , // 0x17
_NONE , // 0x18
_NONE , // 0x19
_Z , // 0x1A
_S , // 0x1B
_A , // 0x1C
_W , // 0x1D
_AT , // 0x1E AT @
_NONE , // 0x1F
_NONE , // 0x20
_C , // 0x21
_X , // 0x22
_D , // 0x23
_E , // 0x24
_DOLLAR , // 0x25 DOLLAR $
_NUMBER , // 0x26 NUMBER #
_NONE , // 0x27
_NONE , // 0x28
_SPACE , // 0x29
_V , // 0x2A
_F , // 0x2B
_T , // 0x2C
_R , // 0x2D
_PERCENT , // 0x2E PERCENT %
_NONE , // 0x2F
_NONE , // 0x30
_N , // 0x31
_B , // 0x32
_H , // 0x33
_G , // 0x34
_Y , // 0x35
_UBER , // 0x36 UBER ¨
_NONE , // 0x37
_NONE , // 0x38
_NONE , // 0x39
_M , // 0x3A
_J , // 0x3B
_U , // 0x3C
_AMPERSAND , // 0x3D AMPERSAND &
_ASTERISK , // 0x3E ASTERISK *
_NONE , // 0x3F
_NONE , // 0x40
_LESSTHAN , // 0x41 LESSTHAN <
_K , // 0x42
_I , // 0x43
_O , // 0x44
_CLOSEBRACE , // 0x45 CLOSEBRACE )
_OPENBRACE , // 0x46 OPENBRACE (
_NONE , // 0x47
_NONE , // 0x48
_GREATERTHAN, // 0x49 GREATERTHAN >
_COLON , // 0x4A COLON :
_L , // 0x4B
_CCEDIL , // 0x4C
_P , // 0x4D
_UNDERSCORE , // 0x4E UNDERSCORE _
_NONE , // 0x4F
_NONE , // 0x50
_QUESTION , // 0x51 QUESTION ?
_CIRCUMFLEX , // 0x52 CIRCUMFLEX ^
_NONE , // 0x53
_GRAVE , // 0x54 GRAVE `
_PLUS , // 0x55 PLUS +
_NONE , // 0x56
_NONE , // 0x57
_CAPS , // 0x58
_SHIFT , // 0x59
_ENTER , // 0x5A
_OPENKEY , // 0x5B OPENKEY {
_NONE , // 0x5C
_CLOSEKEY , // 0x5D CLOSEKEY }
_NONE , // 0x5E
_NONE , // 0x5F
_NONE , // 0x60
_PIPE , // 0x61 PIPE |
_NONE , // 0x62
_F7 , // 0x63 F7 (relocated from 0x83 to keep table under 128 chars
_NONE , // 0x64
_NONE , // 0x65
_BACKSPACE , // 0x66
_NONE , // 0x67
_NONE , // 0x68
_1 , // 0x69
_NONE , // 0x6A
_4 , // 0x6B
_7 , // 0x6C
_DOT , // 0x6D
_NONE , // 0x6E
_NONE , // 0x6F
_0 , // 0x70
_COMMA , // 0x71
_2 , // 0x72
_5 , // 0x73
_6 , // 0x74
_8 , // 0x75
_ESC , // 0x76
_NONE , // 0x77
_SELECT , // 0x78
_PLUS , // 0x79
_3 , // 0x7A
_MINUS , // 0x7B
_ASTERISK , // 0x7C
_9 , // 0x7D
_NONE , // 0x7E
_NONE , // 0x7F
};
2 comentários:
Mais uma vez parabéns pelo empenho em desenvolver esse adaptador de teclad Danjovic. E aproveitando a mensagem, vc pretende compartilhar esse adaptador de teclado?
Obrigado. Compartilhar o projeto é o que tenho feito em meu blog.
Postar um comentário