2017-03-29 5 views
0

Ich schreibe einen Code, wo der Benutzer eine Taste drücken kann, die den Informationen entspricht, die der Benutzer wissen möchte, und es auf dem LCD-Display ausdrucken. Bis jetzt bin ich in der Lage, den Code zu schreiben, um auf LCD zu drucken, aber ich kann nicht herausfinden, wie man MCU bittet, auf einen Tastenanschlag zu warten und dann zu drucken. Kann mir jemand vorschlagen, was ist die Logik, es zu tun?Tastendruck-Interrupt für PIC-Mikrocontroller

Mikrocontroller: PIC18F4550; MPLAB X IDE, XC8 mit PICkit3. Ich bin mit Windows 7. Tastatur: 3x4 Matrix Tastatur - MCAK304NBWB

Mein Code ist:

#define C1_DAT LATBbits.LATB4 //Column 1 is set portB4 as output 
#define C2_DAT LATBbits.LATB5 //Column 2 is set portB5 as output 
#define C3_DAT LATBbits.LATB6 //Column 3 is set portB6 as output 

#define C1_DIR TRISBbits.TRISB4 //Column 1 is set portB4 as output 
#define C2_DIR TRISBbits.TRISB5 //Column 2 is set portB5 as output 
#define C3_DIR TRISBbits.TRISB6 //Column 3 is set portB6 as output 
..... 

C1_DIR = 0; //drive column 1 low 
     rows[0] = PORTB & 0x0f; //read all four rows1 buttons 
     rows[1] = 0x0f; 
     rows[2] = 0x0f; 
     DelayXLCD(); 

     if ((rows[0] & 0b0001) == 0) // will be zero if the "0" button is currently pressed. 
      putrsXLCD("key 1 is pressed"); 
     DelayXLCD(); 
     //break; 

     if ((rows[0] & 0b0010) == 0) // will be zero if the "0" button is currently pressed. 
      putrsXLCD("key 4 is pressed"); 
     DelayXLCD(); 
     //break; 
     if ((rows[0] & 0b0100) == 0) // will be zero if the "0" button is currently pressed. 
      putrsXLCD("key 7 is pressed"); 
     DelayXLCD(); 

     if ((rows[0] & 0b1000) == 0) // will be zero if the "0" button is currently pressed. 
      putrsXLCD("key * is pressed"); 
     DelayXLCD(); 
     //break; 
     if ((rows[1] & 0b0001) == 0) // will be zero if the "0" button is currently pressed. 
      putrsXLCD("key 2 is pressed"); 
     DelayXLCD(); 

     if ((rows[1] & 0b0010) == 0) // will be zero if the "0" button is currently pressed. 
      putrsXLCD("key 5 is pressed"); 
     DelayXLCD(); 
     //break; 
     if ((rows[1] & 0b0100) == 0) // will be zero if the "0" button is currently pressed. 
      putrsXLCD("key 8 is pressed"); 
     //break; 
     if ((rows[1] & 0b1000) == 0) // will be zero if the "0" button is currently pressed. 
      putrsXLCD("key 0 is pressed"); 
     DelayXLCD(); 
     //break; 
     if ((rows[2] & 0b0001) == 0) // will be zero if the "0" button is currently pressed. 
      putrsXLCD("key 3 is pressed"); 
     DelayXLCD(); 
     //break; 
     if ((rows[2] & 0b0010) == 0) // will be zero if the "0" button is currently pressed. 
      putrsXLCD("key 6 is pressed"); 
     DelayXLCD(); 
     //break; 
     if ((rows[2] & 0b0100) == 0) // will be zero if the "0" button is currently pressed. 
      putrsXLCD("key 9 is pressed"); 
     DelayXLCD(); 
     //break; 
     if ((rows[2] & 0b1000) == 0) // will be zero if the "0" button is currently pressed. 
      putrsXLCD("key # is pressed"); 
     DelayXLCD(); 
     Delay_s(20); 
     //if ((rows[0] & rows[1] & rows[2]) == 0x0F) // will be 0x0F if all three values are 0x0F 
      //putrsXLCD("no keys are pressed"); 
     //DelayXLCD(); 

    } while((rows[0] & rows[1] & rows[2]) != 0x0F); // wait for keys release 
    {putrsXLCD("no keys are pressed"); 
     Delay_s(50); 
     LCD_Clear();} //end of main loop 
+0

Haben Sie versucht zu google zB Knopfunterbrechung? – Attila

+0

tat ich. Meistens war die Idee, die ich erhielt, weg zu bleiben von Interrupts, wenn ich keine Erfahrungsperson bin, die ich nicht bin Die Alternative zu ihr war Timer Ich untersuche das. Nur neugierig, wie kann ich Timer als Interrupts verwenden? Kann ich 2 Timer gleichzeitig benutzen? – EEE

Antwort

0

Mit Timer in diesem Zusammenhang (regelmäßige Abfrage der Tastatur) nicht wirklich helfen, weil sie auch Interrupts . Sie könnten genauso gut darin tauchen und sich selbst beibringen, Interrupts zu benutzen. Im Grunde ist ein Interrupt ein SHORT-Code, der ausgeführt wird, wenn ein Ereignis eintritt.

Verwenden Sie für Ihre Tastatur einen Interrupt-on-Change. Wenn der Interrupt ausgelöst wird, lesen Sie die Tastatur und stellen Sie ein globales Semaphor (Flag) ein, das Ihr Hauptprogramm während der Ausführung anderer Aufgaben (z. B. in einer Ereignisschleife in der Hauptroutine) überprüfen kann Sie haben nicht viel anderes zu tun, aber ständig die Tastatur-Eingabezeilen abzufragen, um zu sehen, ob es irgendeine Aktivität gibt.

Verwandte Themen