Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

klawiatura ps/2 własny sterownik c.d - scankody na ascii

16 Paź 2010 16:25 1124 2
  • Poziom 11  
    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:
    Code:
    #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.
    Darmowe szkolenie: Ethernet w przemyśle dziś i jutro. Zarejestruj się za darmo.
  • Pomocny post
    Poziom 24  
    Piszę z głowy, ale
    Code:
    return pgm_read_byte(&keys[getkey()]);
    Oczywiście załączamy odpowiedni nagłówek.
  • Poziom 11  
    Dzięki, działa, tylko teraz dokończyć funkcję i będzie ok. Mam jeszcze takie pytanie co do scankodów, dobrym pomysłem byłoby trzymanie tej tablicy w EEPROM? Szkoda troszkę ponad 200 bajtów Flash.