O ile w zeszłym tygodniu męczyłem się z samą obsługą klawiatury, teraz mam problem z zamianą scankodu na ascii. Te niby znaki ascii wysyłam na USART i w terminalu otrzymuję jakieś niestworzone rzeczy, nie wiem o co chodzi, oto kod:
Funkcję getchar próbowałem robić na wiele sposobów, ale nic to nie dało.
#define KCBIT PIND&_BV(6)
static unsigned char PROGMEM keys[256]={//są tylko litery i cyfry
0,//0x00
0,//0x01
0,//0x02
0,//0x03
0,//0x04
0,//0x05
0,//0x06
0,//0x07
0,//0x08
0,//0x09
0,//0x0a
0,//0x0b
0,//0x0c
0,//0x0d
0,//0x0e
0,//0x0f
0,//0x10
0,//0x11
0,//0x12
0,//0x13
0,//0x14
'Q',//0x15
'1',//0x16
0,//0x17
0,//0x18
0,//0x19
'Z',//0x1a
'S',//0x1b
'A',//0x1c
'W',//0x1d
'2',//0x1e
0,//0x1f
0,//0x20
'C',//0x21
'X',//0x22
'D',//0x23
'E',//0x24
'4',//0x25
'3',//0x26
0,//0x27
0,//0x28
' ',//0x29
'V',//0x2a
'F',//0x2b
'R',//0x2c
'T',//0x2d
0x35,//0x2e
0,//0x2f
'b',//0x30
'N',//0x31
'B',//0x32
'H',//0x33
'G',//0x34
'Y',//0x35
'6',//0x36
0,//0x37
0,//0x38
0,//0x39
'M',//0x3a
'J',//0x3b
'U',//0x3c
'7',//0x3d
'8',//0x3e
0,//0x3f
0,//0x40
0,//0x41
'K',//0x42
'I',//0x43
'O',//0x44
'0',//0x45
'9',//0x46
0,//0x47
0,//0x48
0,//0x49
0,//0x4a
'L',//0x4b
0,//0x4c
'P',//0x4d
0,//0x4e
0,//0x4f
0,//0x50
0,//0x51
0,//0x52
0,//0x53
0,//0x54
0,//0x55
0,//0x56
0,//0x57
0,//0x58
0,//0x59
'\n',//0x5a
0,//0x5b
0,//0x5c
0,//0x5d
0,//0x5e
0,//0x5f
0,//0x60
0,//0x61
0,//0x62
0,//0x63
0,//0x64
0,//0x65
'\b',//0x66
0,//0x67
0,//0x68
0,//0x69
0,//0x6a
0,//0x6b
0,//0x6c
0,//0x6d
0,//0x6e
0//0x6f
};
volatile unsigned char kdata=0, krecive=0, kbit=0;
SIGNAL(INT1_vect)
{
switch(kbit)
{
case 0:
kdata=0;
kbit+=1;
break;
case 1:
if(KCBIT) kdata|=0x01;
kbit+=1;
break;
case 2:
if(KCBIT) kdata|=0x02;
kbit+=1;
break;
case 3:
if(KCBIT) kdata|=0x04;
kbit+=1;
break;
case 4:
if(KCBIT) kdata|=0x08;
kbit+=1;
break;
case 5:
if(KCBIT) kdata|=0x10;
kbit+=1;
break;
case 6:
if(KCBIT) kdata|=0x20;
kbit+=1;
break;
case 7:
if(KCBIT) kdata|=0x40;
kbit+=1;
break;
case 8:
if(KCBIT) kdata|=0x80;
kbit+=1;
break;
case 9:
kbit+=1;
break;
case 10:
krecive=1;
kbit=0;
break;
}
}
void keyboard_init()
{
DDRD&=~_BV(3);//clock
DDRD&=~_BV(6);//data
PORTD|=_BV(3);
PORTD|=_BV(6);
GIMSK |= (1 << INT1); // zezwolenie na przerwanie INT1
MCUCR |= (1 << ISC11); // przerwanie INT1 wyzwalane zboczem opadającym
sei();
}
unsigned char getkey()
{
while(!krecive);
krecive=0;
return kdata;
}
unsigned char getchar()
{
return keys[getkey()];
}Funkcję getchar próbowałem robić na wiele sposobów, ale nic to nie dało.