Forum: Compiler & IDEs Ps2 Tastatur Entertaste


von Stefan (Gast)


Lesenswert?

Hallo,
ich habe vor einen Befehl über die Tastatur an einen Atmega32 zu senden.
Momentan leite ich die Tasteneingabe direkt an den Uart um eine Ausgabe 
zu erhalten. Was mich ein bisschen stutzig machte war die Ausgabe zur 
Enter-Taste: " ,_/" Stimmt die Ausgabe ? Wenn ja was könnte in der 
überprüfung Enter ja/nein in der zeile 192 falsch sein. Bitte nicht über 
das schlechte coding ärgern...ich programmiere noch nicht so lange und 
möchte es gerne besser machen. Also: Danke für jeden Tipp!

Mfg Stefan
1
/* this keyboard interface is based on avr appnote 313 
2
   changes are made for using avr-gcc and atmega8 processors
3
   beck@informatik.htw-dresden.de
4
*/
5
6
#include <avr/pgmspace.h>
7
#include "kb.h"
8
#include "uart.h"
9
#include "gpr.h"
10
#include "pindefs.h"
11
#define BUFF_SIZE 64
12
#include <string.h>
13
14
void decode(unsigned char sc);
15
void put_kbbuff(unsigned char c);
16
17
volatile unsigned char edge, bitcount;                // 0 = neg.  1 = pos.
18
19
unsigned char kb_buffer[BUFF_SIZE];
20
volatile unsigned char *inpt, *outpt;
21
volatile unsigned char buffcnt;
22
23
24
void init_kb(void)
25
{
26
    inpt =  kb_buffer;                        // Initialize buffer
27
    outpt = kb_buffer;
28
    buffcnt = 0;
29
    GIMSK=(1<<INT0);
30
    MCUCR = 2;                                // INT0 interrupt on falling edge
31
    edge = 0;                                // 0 = falling edge  1 = rising edge
32
    bitcount = 11;
33
    sei();
34
}
35
36
ISR (INT0_vect)
37
{
38
    static unsigned char data;                // Holds the received scan code
39
    if (!edge)                                // Routine entered at falling edge
40
    {
41
        if(bitcount < 11 && bitcount > 2)    // Bit 3 to 10 is data. Parity bit,
42
        {                                    // start and stop bits are ignored.
43
            data = (data >> 1);
44
            if((PORT_KB & (1<<DATAPIN)))
45
            {
46
                data = data | 0x80;            // Store a '1'
47
            }
48
        }
49
50
        MCUCR = 3;                            // Set interrupt on rising edge
51
        edge = 1;
52
    } 
53
    else
54
    {                                // Routine entered at rising edge
55
        
56
        MCUCR = 2;                            // Set interrupt on falling edge
57
        edge = 0;
58
        bitcount-=1;
59
        if(bitcount == 0)                    // All bits received
60
        {
61
            decode(data);
62
            bitcount = 11;
63
        }
64
    }
65
}
66
67
void decode(unsigned char sc)
68
{
69
// Coding us-keyboard, geman keyboard contains multi-byte chars 
70
// Vector ist indexed by scancode and contains the ascii code at
71
// the indexed position
72
   static char CodingUnshifted[]=
73
   {/*  0   1   2  3   4   5   6  7   8   9   a   b   c   d   e   f*/
74
/*0*/   0   ,0   ,0   ,0   ,0   ,0   ,0   ,0   ,0   ,0   ,0   ,0   ,0   ,0   ,'^' ,0   ,
75
/*1*/   0   ,0   ,0   ,0   ,0   ,'q' ,'1' ,0   ,0   ,0   ,'y' ,'s' ,'a' ,'w' ,'2' ,0   ,
76
/*2*/   0   ,'c' ,'x' ,'d' ,'e' ,'4' ,'3' ,0   ,0   ,' ' ,'v' ,'f' ,'t' ,'r' ,'5' ,0   ,
77
/*3*/   0   ,'n' ,'b' ,'h' ,'g' ,'z' ,'6' ,0   ,0   ,',' ,'m' ,'j' ,'u' ,'7' ,'8' ,0   ,
78
/*4*/   0   ,',' ,'k' ,'i' ,'o' ,'0' ,'9' ,0   ,0   ,'.' ,'?' ,'l' ,':' ,'p' ,'-' ,0   ,
79
/*5*/   0   ,0   ,'\'',0   ,'[' ,'+' ,0   ,0   ,0   ,0   ,13  ,']' ,0   ,'|', 0   ,0   ,
80
/*6*/   0   ,'<' ,0   ,0   ,0   ,0   ,8   ,0   ,0   ,'1' ,0   ,'4' ,'7' ,0   ,0   ,0   ,
81
/*7*/   '0' ,',' ,'2' ,'5' ,'6' ,'8' ,0   ,0   ,0   ,'+' ,'3' ,'-' ,'*' ,'9' ,0   ,0   
82
   };
83
   static char CodingShifted[]=
84
   {
85
/*0*/   0   ,0   ,0   ,0   ,0   ,0   ,0   ,0   ,0   ,0   ,0   ,0   ,0   ,9   ,0   ,0   ,
86
/*1*/   0   ,0   ,0   ,0   ,4   ,'Q' ,'!' ,0   ,0   ,0   ,'Y' ,'S' ,'A' ,'W' ,'@' ,0   ,
87
/*2*/   0   ,'C' ,'X' ,'D' ,'E' ,'$' ,'#' ,0   ,0   ,' ' ,'V' ,'F' ,'T' ,'R' ,'%' ,0   ,
88
/*3*/   0   ,'N' ,'B' ,'H' ,'G' ,'Z' ,'^' ,0   ,0   ,',' ,'M' ,'J' ,'U' ,'&' ,'*' ,0   ,
89
/*4*/   0   ,'<' ,'K' ,'I' ,'O' ,')' ,'(' ,0   ,0   ,'>' ,'/' ,'L' ,';' ,'P' ,'_' ,0   ,
90
/*5*/   0   ,0   ,'"' ,0   ,'{' ,'=' ,0   ,0   ,0   ,0   ,13  ,'}' ,0   ,'\\',0   ,0   ,
91
/*6*/   0   ,'>' ,0   ,0   ,0   ,0   ,8   ,0   ,0   ,'1' ,0   ,'4' ,'7' ,0   ,0   ,0   ,
92
/*7*/   '0' ,';' ,'2' ,'5' ,'6' ,'8' ,0   ,0   ,0   ,'+' ,'3' ,'-' ,'*' ,'9' ,0   ,0   
93
   };
94
95
    static unsigned char is_up=0, shift = 0, mode = 0;                           
96
97
    if (!is_up)                // Last data received was the up-key identifier   
98
    {                                                                            
99
        switch (sc)
100
        {
101
          case 0xF0 :        // The up-key identifier
102
            is_up = 1;
103
            break;
104
105
          case 0x12 :        // Left SHIFT
106
            shift = 1;
107
            break;
108
109
          case 0x59 :        // Right SHIFT
110
            shift = 1;
111
            break;
112
113
          case 0x05 :        // F1
114
            if(mode == 0)
115
                mode = 1;    // Enter scan code mode
116
            if(mode == 2)
117
                mode = 3;    // Leave scan code mode
118
            break;
119
120
          default:
121
            if((mode == 0) || (mode == 3))        // If ASCII mode
122
            {
123
              if (sc<128)
124
              {
125
                if(!shift)                    // If shift not pressed,
126
                      put_kbbuff(CodingUnshifted[sc]);
127
                else
128
                        put_kbbuff(CodingShifted[sc]);
129
              }
130
            }
131
            else{                            // Scan code mode
132
        print_hexbyte(sc);            // Print scan code
133
                put_kbbuff(' ');
134
                put_kbbuff(' ');
135
            }
136
137
            break;
138
        }
139
    } else {
140
        is_up = 0;                            // Two 0xF0 in a row not allowed
141
        switch (sc)
142
        {
143
          case 0x12 :                        // Left SHIFT
144
            shift = 0;
145
            break;
146
147
          case 0x59 :                        // Right SHIFT
148
            shift = 0;
149
            break;
150
151
          case 0x05 :                        // F1
152
            if(mode == 1)
153
                mode = 2;
154
            if(mode == 3)
155
                mode = 0;
156
            break;
157
          case 0x06 :                        // F2
158
            //clr();
159
            break;
160
        }
161
    }
162
}
163
164
void put_kbbuff(unsigned char c)
165
{
166
    if (buffcnt<BUFF_SIZE)                        // If buffer not full
167
    {
168
        *inpt = c;                                // Put character into buffer
169
        inpt++;                                    // Increment pointer
170
171
        buffcnt++;
172
173
        if (inpt >= kb_buffer + BUFF_SIZE)        // Pointer wrapping
174
            inpt = kb_buffer;
175
    }
176
}
177
178
int getchar(void)
179
{
180
    int byte;
181
182
    while(buffcnt == 0);                        // Wait for data
183
184
    byte = *outpt;                                // Get byte
185
    outpt++;                                    // Increment pointer
186
187
    if (outpt >= kb_buffer + BUFF_SIZE)            // Pointer wrapping
188
        outpt = kb_buffer;
189
    buffcnt--;                                    // Decrement buffer count
190
191
  
192
  if(strcmp(""+byte , " ,_/")==0){
193
194
  uputs("asdfasdf\n\r");
195
196
  }
197
  
198
    return byte;
199
}
200
201
char* gets(char *pBuf,int n)
202
{
203
   int count=1;
204
   char c;
205
   char *p=pBuf;
206
   *pBuf=0; // init with terminating null
207
   while(count<n)
208
   {
209
     c=getchar();
210
     if (c==0x8)             // if Backspace
211
     {
212
        if (count>1)
213
        {
214
          putchar(c);        // echo backspace
215
          p--;*p=0;count--;  //delete one char
216
        }
217
     }
218
     else
219
     {
220
       putchar(c);// Echo to rs232 or lcd
221
    *p=c;       // put char to buffer
222
       p++;       // increment
223
      *p=0;       // put a new terminating null behind the last char
224
       count++;   // count chars
225
       if (*(p-1)==0xd || *(p-1)==0xa) // End of line
226
       {
227
         *(p-1)='\n';
228
         return pBuf;
229
       }
230
      }
231
   }
232
   return pBuf;
233
}

von Stefan (Gast)


Lesenswert?

Sorry ich dachte Linennummer würden angezeigt. Es handelt sich um diesen 
Teil hier:
1
  if(strcmp(""+byte , " ,_/")==0){
2
3
  uputs("asdfasdf\n\r");
4
5
  }

von Karl H. (kbuchegg)


Lesenswert?

> Wenn ja was könnte in der
überprüfung Enter ja/nein in der zeile 192 falsch sein.

So ziemlich alles.
Das ergibt keinen Sinn

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?


von Karl H. (kbuchegg)


Lesenswert?

Du hast hier


    byte = *outpt;                                // Get byte

nur 1 Byte geholt. Das ist der (ein?) Code einer Taste. Mir ist nicht 
klar, was du da mit Stringvergleichen willst. Du hast keinen String. 
(Abgesehen davon macht ""+byte mit 99% Sicherheit nicht das, was du 
denkst das es macht.)

Schritt zurückgehen:
Dein Problem ist im eigentlichen Sinn nicht irgendetwas Spezielles im 
Code, sondern das dir nicht klar ist, wie du dein Problem lösen willst 
und welche Nebenbedingungen dazu im Code existieren.

von Stefan (Gast)


Lesenswert?

Danke für die Antworten!

Ja immoment bin ich mir auch nicht so sicher wie ich das lösen soll. Die 
Sache da oben ist mehr oder weniger aus Verzweiflung entstanden.

Ich schaue mir die Links mal ganz in ruhe an und versuche damit eine 
Lösung zu "basteln".

Danke erstmal an euch!

Mfg Stefan

von khmweb (Gast)


Lesenswert?

Hallo,

suche mal nach "avr313.pdf" bei Google. Ich denke, das hilft Dir weiter? 
Aber auch viell. die Software zu einem Buch:
http://www.oldenbourg-verlag.de/wissenschaftsverlag/mikrocomputertechnik-controllern-atmel-avr-risc-familie/9783486589887

und dort Zusatzmaterial, Beispielprogramme wählen (in Assembler und C).

LG khmweb

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.