Guten Abend, bin neu hier und habe auch noch keine Erfahrungen mit Microkontrollern. Habe am Port B Ein LCD und zwei Taster angeschlossen, die Taster an RB0 und RB1. Ich möchte den Taster an RB1 benutzen. Ich weiß nun aber nicht wie ich das einzelne Bit abfragen kann, einen ganzen Port ist kein Problem. Möchte mit den Taster eine "else if-Abfrage" realisieren. Konkret soll mit dem taster von Celsius in Fahrenheit umgeschaltet werden (Mit einem KTY nehme ich eine Spannung über den ADW auf, rechne die Spannung in einem Widerstandswert um, daraus resultiert dann die Temperatur, die ich auf einem LCD ausgebe) Die Temperatur wird in Celsius angezeigt, möchte aber mit einem drücken des Tasters auf Fahrenheit umschalten. Wie kann ich das am besten realisieren? Hier mal bis jetzt erarbeiteter Quelltext: //Temperaturmessung mit einem KTY81-210 //Jede Sekunde eine Messung, 100 Messungen gesamt //Rote LED soll bei jeder Messung aufleuchten void main () { unsigned int uiUT; //Variable für Analogeingang char cT[7]; //Variable für die Ausgabe des Displays [7] 6 Zeichen und 1bit fürs Ende float fT; //Variable für die Temperatur in Celsius //float fF; //Variable für die Temperatur in Fahrenheit float fUT; //Variable für die Berechnung UT float fRT; //Variable für die Berechnung RT short sSchleife; //Variable für die Schleife LCD_Init(&PORTB); //LCD initialisieren TRISB = 0b00000011; // Port deklarieren Port B = LCD und Taster 0=Ausgang 1=Eingang PORTD = 0; TRISD = 0b11111100; // 6 Eingänge 2 Ausgänge für KTY // AD-Wandler Konfiguration ADCON1 = 0*80; //0B1000 0000 <--AN7, Uref = Ub // Schleifenfunktion für die 100 Messungen for (sSchleife=0,sSchleife;sSchleife<=99; sSchleife++) { uiUT = Adc_Read(7); //Auslesen des Analogeingangs fUT = uiUT * 5; //Formel: UT=UTdig*5V(Ub)/1024 fUT = fUT / 1024; // " " fRT = 5 - fUT; //Formel: RT=2,2k*UT/5V-UT fRT = fUT / fRT; // " " fRT = fRT * 2.2; // " " fT = 64.1 * fRT; //Formel: T=m*RT+b m=64,1C/kOhm b=-103,21 fT = fT + (-103.21); // " " //Celsius in Fahrenheit //fF = fT * 9; //fF = fF / 5; //fF = fF * 32; FloatToStr(fT, cT); // Umwandlung Float zu Char fürs Display Lcd_Out(1, 1, cT); Lcd_Out(2, 1, "Grad Celsius"); // blinken der LED if (PORTD == 0b00000001) { PORTD = 0b00000000; } else { PORTD = 0b00000001; } delay_ms (1000); } } Benutze den mikroC compiler Hoffe Ihr könnt und wollt mir helfen =)
Jens S. wrote: > Habe am Port B Ein LCD und zwei Taster angeschlossen, die Taster an RB0 > und RB1. Ich möchte den Taster an RB1 benutzen. Hast Du an Pull-Up Widerstände gedacht? > Ich weiß nun aber nicht wie ich das einzelne Bit abfragen kann, einen > ganzen Port ist kein Problem. Du musst mit einer Bit-Operation das gewünschte Bit herausfiltern (genau: maskieren) und dann prüfen http://www.roboternetz.de/wissen/index.php/C-Tutorial#Bit-Operatoren
1 | if (PORTB & 0b00000001) // falls Bit 0 in Port B gesetzt ist |
2 | {
|
3 | ...
|
4 | }
|
Sind die Taster aktiv low (was sinnvoll wäre wegen der Pull-Ups) oder aktiv high? Ich würde es mit BTFSS PortB,0 GOTO ZurnächstenAbfrage ... Tastenaktionsroutine ... versuchen. Das ist allerdings Assembler. In C sollte es aber ähnliche Befehle geben.
Danke erstmal für die Antworten! Ich habe es wie Severino R. es beschrieben hat gelöst, klappt auch wunderbar! OPTION_REG &=0b01111111; So gebe ich ja die Pullups frei. Naja, is ja eigentlich auch nicht so schwer. Hätte einfach mal in der Hilfe nach "button" suchen müßen, aber man lernt nie aus =) Nochmal kurz eine andere frage, ich habe in meinem Code ja eine For-Schleife. Die hat absolut nicht funktioniert, also er hat nie die Variable sSchleife hochgezählt. Hab nach ein paar Stunden dann durch nen dummen Zufall rausgefunden das es daran lag, dass ich die Variable zwar global aber als letzte Variable deklariert habe (siehe Quelltext). Wenn ich die Variable als erstes deklariere funktioniert das Programm einwandfrei. Woran liegt das? MfG Jens
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.