-
Notifications
You must be signed in to change notification settings - Fork 0
/
teclado.c
70 lines (60 loc) · 1.76 KB
/
teclado.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include "pic18f4520.h"
#include "teclado.h"
#include "delay.h"
// TC0 PORTDbits.RD3 BitTst(PORTD,3)
// TC1 PORTDbits.RD2 BitTst(PORTD,2)
// TC2 PORTDbits.RD1 BitTst(PORTD,1)
// TC3 PORTDbits.RD0 BitTst(PORTD,0)
const unsigned char linha[4] = {TL1, TL2, TL3};
unsigned int atraso_min = 5;
unsigned int atraso = 15;
unsigned char tc_tecla(unsigned int timeout) {
unsigned int to = 0;
unsigned char i;
unsigned char ret = 0;
unsigned char tmp = PORTB;
while (((to < timeout) || (!timeout))&&(!ret)) {
for (i = 0; i < 3; i++) {
PORTB |= ~linha[i];
if (!BitTst(PORTD,3)) { //TC1
atraso_ms(atraso);
if (!BitTst(PORTD,3)) {
while (!BitTst(PORTD,3));
ret = 1 + i;
break;
}
};
if (!BitTst(PORTD,2)) {
atraso_ms(atraso);
if (!BitTst(PORTD,2)) {
while (!BitTst(PORTD,2));
ret = 4 + i;
break;
}
};
if (!BitTst(PORTD,1)) {
atraso_ms(atraso);
if (!BitTst(PORTD,1)) {
while (!BitTst(PORTD,1));
ret = 7 + i;
break;
}
};
if (!BitTst(PORTD,0)) {
atraso_ms(atraso);
if (!BitTst(PORTD,0)) {
while (!BitTst(PORTD,0));
ret = 10 + i;
break;
}
};
PORTB &= linha[i];
};
atraso_ms(atraso_min);
to += 5;
}
if (!ret)ret = 255;
if (ret == 11)ret = 0;
PORTB = tmp;
return ret;
}