3 Probleme, die mir auffallen:
1. keine Kommentare
2. Du willst einzelne Tasten prüfen, vergleichst aber immer den ganzen
Port.
Hier mal eine funktionierende Scanroutine:
1 | #include <avr\io.h>
|
2 |
|
3 | typedef unsigned char u8;
|
4 | typedef unsigned short u16;
|
5 | #define NOP(); asm volatile("nop"::);
|
6 |
|
7 |
|
8 | #define KEY_PIN PINB
|
9 | #define KEY_PORT PORTB
|
10 | #define KEY_DDR DDRB
|
11 |
|
12 |
|
13 | u8 keyscan( void )
|
14 | {
|
15 | u8 col = 0, row = 0;
|
16 |
|
17 | KEY_PORT = 0xFF; // all pullups on
|
18 | KEY_DDR = 0xF0; // pin 7..4 = output
|
19 | KEY_PORT = 0x0F; // pin 7..4 = output low
|
20 | NOP(); // wait until inputs sampled
|
21 | if( ~KEY_PIN & 1<<0 ) // if pin 0 = low
|
22 | col = 4;
|
23 | if( ~KEY_PIN & 1<<1 )
|
24 | col = 3;
|
25 | if( ~KEY_PIN & 1<<2 )
|
26 | col = 2;
|
27 | if( ~KEY_PIN & 1<<3 )
|
28 | col = 1;
|
29 | row = col;
|
30 | if( col ){ // if column found, check row
|
31 | KEY_PORT = 0xFF; // all pullups on
|
32 | KEY_DDR = 0x0F; // pin 3..0 = output
|
33 | KEY_PORT = 0xF0; // pin 3..0 = output low
|
34 | NOP(); // wait until inputs sampled
|
35 | if( ~KEY_PIN & 1<<4 )
|
36 | row = 5;
|
37 | if( ~KEY_PIN & 1<<5 )
|
38 | row = 9;
|
39 | if( ~KEY_PIN & 1<<6 )
|
40 | row = 13;
|
41 | if( ~KEY_PIN & 1<<7 ) // if pin 7 = low
|
42 | row = 17;
|
43 | } // 0 = no key
|
44 | return row - col; // 1..16 = key
|
45 | }
|
3.
Ich sehe nirgends ne Flankenerkennung, d.h. Du flutest Deinen Puffer,
solange ne Taste gedrückt wird.
Du darfst nur bei ner Flanke von losgelassen nach gedrückt die Taste
übernehmen.
Peter