Forum: Compiler & IDEs Datenrichtungsregister auswerten, aber einfacher!


von spence (Gast)


Lesenswert?

Hi,

ich gebe zu, dass c neuland für mich ist und ich früher nur mit bascom 
(schande über mich) gecodet habe. mein erstes programm wertet das ddrx 
aus und gibt diese auf dem lcd aus, z.b. EAEEAEAA. mein jetziger code 
ist mir jedoch zu groß und unhandlich. kann man folgendes noch 
vereinfachen?

1
int checkddrx(void){
2
3
if(DDRD& (1<<PD0)){
4
lcd_gotoxy(7,2);
5
lcd_puts("A");
6
}
7
else {
8
lcd_gotoxy(7,2);
9
lcd_puts("E");
10
}
11
12
13
if(DDRD& (1<<PD1)){
14
lcd_gotoxy(8,2);
15
lcd_puts("A");
16
}
17
else {
18
lcd_gotoxy(8,2);
19
lcd_puts("E");
20
}
21
22
usw...
23
24
}

mfg
spence

von Uwe .. (uwegw)


Lesenswert?

PD0 bis PD7 sind bloß Konstanten mit dem Werten von 0 bis 7. Du kannst 
also auch eine Schleife für alle acht Bits laufen lassen, und dann mit 
(1<<i) die einzelnen Bits abfragen.

von spence (Gast)


Lesenswert?

hm eigentlich müsste doch der folgende code funktionieren (ich seh 
jedenfalls keinen grund, warum nicht.) und dennoch kommt auf dem lcd 
garnix.
1
int checkddrx(void){
2
int dz  = 1;                 /* Durchlaufzähler */
3
int gt = 7;                 /* zeichen nummer */
4
while (dz >= 7)             /* Wenn dz = 7 dann hör auf */
5
{
6
if(DDRD& (1<<dz)){
7
lcd_gotoxy(gt,2);
8
lcd_puts("A");
9
}
10
else {
11
lcd_gotoxy(gt,2);
12
lcd_puts("E");
13
}
14
dz  += 1;                 /* +1 */
15
gt  += 1;
16
}
17
}

von Stefan E. (sternst)


Lesenswert?

> int dz  = 1;                 /* Durchlaufzähler */
> ...
> while (dz >= 7)             /* Wenn dz = 7 dann hör auf */
> ...

Die while-Schleife wird so lange ausgeführt, wie die Bedingung wahr 
ist. In diesem Beispiel also 0-mal.

Ist es Absicht, dass du den Inhalt des Registers quasi in umgekehrter 
Reihenfolge ausgibst, also LSB...MSB?

Hier mein Vorschlag (aber in der Reihenfolge MSB...LSB):
1
int i;
2
for (i=0;i<8;i++) {
3
  lcd_gotoxy(14-i,2);
4
  if (DDRD&&(1<<i))
5
    lcd_puts("A");
6
  else
7
    lcd_puts("E");
8
}


PS: Du solltest dir unbedingt Einrückungen angewöhnen.

von spence (Gast)


Lesenswert?

vielen herzlichen dank erstmal für den codefetzen! gleich ausprobiert 
und siehe da: ich habe EEEEEEEE auf dem LCD. freu. jetzt hab ich mal 
DDRD nach 0xAA geändert, was zufolge haben müsste, dass EAEAEAEA 
angezeigt werden sollte. tut es jedoch nicht. stattdessen: AAAAAAAA. bin 
gerade noch am grübeln, woran es liegen könnte.

von spence (Gast)


Lesenswert?

hab ihn gefunden!
if (DDRD&&(1<<i)) <--- ein "&" weniger, und es funzt!


vielen dank!!!

von Stefan E. (sternst)


Lesenswert?

Oh, ja, sorry, kleiner Flüchtigkeitsfehler. :)

von spence (Gast)


Lesenswert?

kein thema! hab ja dabei noch wat gelernt und so solls ja auch sein :)

von yalu (Gast)


Lesenswert?

Wenn du gerade am wat lernen bist:
1
  unsigned char p;
2
  lcd_gotoxy(7, 2);
3
  for(p=0x80; p; p>>=1)
4
    lcd_putc(DDRD&p ? 'A' : 'E');

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.