Hiho,
ich habe mal wieder ein Problem....
folgender Code ist als Programmierbeispiel vorhanden
1 | ROUTINE NAME : STLED316_Byte_Read
|
2 | INPUT/OUTPUT : Variable Read loaded with the data read from the device
|
3 |
|
4 | DESCRIPTION : Get a data byte from STLED316 (mainly KEy1 and KEY2)
|
5 |
|
6 | *****************************************************************************/
|
7 |
|
8 | STLED316_Byte_Read(void)
|
9 | {
|
10 | u8 i;
|
11 |
|
12 | PBDDR &= 0x7f; // Set DIO as input with pull-up
|
13 |
|
14 | for (i=0; i<8; i++)
|
15 | {
|
16 | CLK_LOW; // CLK falling
|
17 | Read = Read >> 1; // Shift Read right
|
18 | Read |= PBDR & 0x80; // write PBDR-b7 to Read
|
19 | CLK_HIGH; // CLK rising
|
20 | }
|
21 |
|
22 | PBDDR |= 0x80; // DIO as output push pull
|
23 | }
|
24 |
|
25 | *****Aufgerufen von dieser Funktion:
|
26 |
|
27 | ROUTINE NAME : STLED316_Keyboard
|
28 | INPUT/OUTPUT : None
|
29 |
|
30 | DESCRIPTION : STLED keyboard scan
|
31 |
|
32 | *****************************************************************************/
|
33 |
|
34 | STLED316_Keyboard(void)
|
35 | {
|
36 | u8 i;
|
37 | u8 Key[2];
|
38 |
|
39 | STB_LOW;
|
40 | STLED316_Byte_Write(0x49);
|
41 |
|
42 | STLED316_Byte_Read();
|
43 | Key[0] = Read;
|
44 |
|
45 | STLED316_Byte_Read();
|
46 | Key[1] = Read;
|
47 |
|
48 | STB_HIGH;
|
49 | }
|
Nun habe ich dass in Bascom umgesetzt, wobei ich key[0] - Key[1]
getrennt Anfrage und nicht wie in C nacheinander (Autoincrement off)
1 | Declare Sub Key
|
2 | Dim Keydata_1 As Byte
|
3 | Dim Keydata_2 As Byte
|
4 | Const Rd_1 = &B01101001
|
5 | Const Rd_2 = &B01101010
|
6 |
|
7 | Sub Key
|
8 | Dstrb_1 = 0
|
9 | Displaydata = Rd_1 'Lesebefehl Key_1
|
10 | Call Dispout_1
|
11 | Dstrb_1 = 1
|
12 |
|
13 | Config Pina.3 = Input 'pin = Eingang
|
14 | Porta.3 = 1 'pullup ein
|
15 | Dstrb_1 = 0
|
16 | Waitus 10
|
17 | For I2 = 0 To 7
|
18 | Dclk_1 = 0
|
19 | Waitus 1
|
20 | Keydata_1.i2 = Pina.3
|
21 | Waitus 1
|
22 | Dclk_1 = 1
|
23 | Waitus 1
|
24 | Next I2
|
25 | Dstrb_1 = 1
|
26 |
|
27 | Config Pina.3 = Output 'pin = Ausgang
|
28 | ' --------------------------------------------
|
29 | Dstrb_1 = 0
|
30 | Displaydata = Rd_2 'Lesebefehl Key_2
|
31 | Call Dispout_1
|
32 | Dstrb_1 = 1
|
33 |
|
34 | Config Pina.3 = Input 'pin = Eingang
|
35 | Porta.3 = 1 'pullup ein
|
36 | Dstrb_1 = 0
|
37 | For I2 = 0 To 7
|
38 | Dclk_1 = 0
|
39 | Waitus 1
|
40 | Keydata_2.i2 = Pina.3
|
41 | Waitus 1
|
42 | Dclk_1 = 1
|
43 | Waitus 1
|
44 | Next I2
|
45 | Dstrb_1 = 1
|
46 |
|
47 | Config Pina.3 = Output 'pin = Ausgang
|
48 |
|
49 | End Sub Key
|
Hier bekomme ich immer den Wert 255 in der Keydata_x zurückgeliefert.
Dass Datenblatt ist unter
http://www.st.com/stonline/products/literature/ds/14307.pdf zu finden.
Wobei mir hier auffällt dass unter Punkt 11.3 (Anschlusschema) die
Dioden zur Keymatrix mit den Anoden an Seg.x hängen.
Dies irritiert mich ein wenig wo doch Common Anode Anzeigen verbaut
werden...
any hints?
Gruß Anselm
p.S.: Die Zeile "call Dispout_1" funktioniert einwandfrei, hier steuer
ich 2x3 7-Segment mit.
Dispout_1 macht dass Bitgewackel um die Daten rauszuschieben..