ich versuche eine ausgabe auf einem LCD zu programmieren ! die displayansteuerrung funktioniert ohne probleme ! als µC verwende ich den PIC 16F877 was stimmt an diesem unterprogramm nicht ? ich möchte eine zahl ausgeben, alledings bekomme ich am display nur irgendwelche sonderzeichen ! void ADC_UMRECHNUNG(int16 x) { uns8 t, h, z, e; if (x.15 == 1) { LCD_1 = '-'; } else { LCD_1 = ' '; } h = x / 100; z = x % 100; z = z / 10; e = x % 100; e = e % 10; h = 0x30 + h; z = 0x30 + z; e = 0x30 + e; LCD_2 = h; LCD_3 = z; LCD_4 = e; }
vermutlich musst du zur zahl,die du ausgeben willst 48 dazuzählen damit das ganze im ascii - code wieder stimmt. schau mal auf http://www.asciitable.com
ich hab mir die zeichentabelle des LCD angeschaut und laut der mus ich 0x30 dazuzählen !
0x30 ist 48. Das eine ist Hex, das andere Dezimal. Du mußt Deinen Wert als BCD-Zahl darstellen. D.h. die einzelnen Werte von h,z,e dürfen nicht größer als 9 sein. Dann müßen hierzu 0x30 addiert werden. Überprüf doch mal, was in diesen drei Variablen steht bevor Du 0x30 addierst. Ansonsten kann ich mir nur vorstellen, daß die Zeichen zu schnell nacheinander ausgegeben werden und das Display hier nicht mitkommt. Ist aber nur eine Vermutung.
Hi chris, Wenn x zwischen 0 und 999 liegt, sind h,z,e richtig. Da mußt Du nichts überprüfen. Für x<0 (kann man in C auch so abfragen, statt x.15==1) solltest du allerdings noch ein x=-x; einfügen. t kann weg und mit e=x%10; ist das gleiche wie e=x%100; e=e%10; Peter
was bewirkt das x =-x ? das verstehe ich momentan nicht !
Hi Chris, vielleicht liegt das Problem in Deinem Datenformat. Du teilst eine 16bit-Zahl durch eine 8bit-Zahl. Ist x > 255 (ist doch der Wert aus dem AD-Wandler, oder?), dann funktioniert die Rechnung nicht mehr. Gruß Oliver
x ist der wert aus dem 10Bit ADC ! wie soll ich es deier meinung nach lösen ?
Bei 10 bit kann Deine Zahl maximal 3FFh groß sein. Dies ist dezimal 1023. D.h. zu deinen h,z,e muss noch ein t für die tausender dazu und entsprechend Deiner Umwandlung noch mitberücksichtigt werden. t = x / 1000; h = x % 1000; usw. . . . t = 0x30 + t; h = 0x30 + h; z = 0x30 + z; e = 0x30 + e; LCD_2 = t; LCD_3 = h; LCD_4 = z; LCD_5 = e;
Hi chris, mit x=-x; wird x positiv wenn es vorher kleiner 0 war. Sonst berechnest Du nur Mist... /* -9999 <= x <= 9999, immer 4 stellig, also z.B. 0012 */ void ADC_UMRECHNUNG(int16 x) { if(x<0) { LCD_1='-'; x=-x; } else LCD_1=' '; LCD_5=x%10+0x30; x/=10; /* 3 stellig bis 999, diese Zeile weg */ LCD_4=x%10+0x30; x/=10; LCD_3=x%10+0x30; x/=10; LCD_2=x+0x30; } Peter PS: bist Du sicher, das LCD_1,... korrekt auf dem Display ausgegeben wird? Du kannst ja mal probeweise am Ende der Funktion ein LCD_1=LCD_2=LCD_3=LCD_4=LCD_5='8'; einfügen, dann sollte 88888 erscheinen. wieso besitzt dies Forum eigentlich keinen Preview Knopf?
danke peter k. ! dein toller code funktioniert schon fast ! alle stellen ausßer LCD_2 funktionieren ! auf LCD_2 bekomme ich einen Buchstaben ausgegeben ! eine lösungsidee ?
dann ist deine Zahl vom Betrag zu groß.Also eine Stelle mehr benutzen: LCD_6=x%10+0x30; x/=10; vor die Zeile LCD_5=x%10+0x30; x/=10; schreiben. Peter
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.