/* Hämtar tangentkoden från ett tangentbord. Använder kod från www.elektronikutveckling.com, radera inte denna info om du modifierar eller kopierar delar från denna fil. Använd på egen risk, rätta felaktigheter. */ char getKey(void) { // getKey() returnerar keypad'ens kod för NEDtryckt tangent, annars 0x7. // Made by elektronikutveckling.com // In: // Om data1 != EO || F0 så är det ett tecken. // Om data1 == E0 så är nästa tal ett tecken eller F0. // Om data1 eller data2 == F0 så är nästa tal samma tecken (knapp uppe igen). // Ut: endast teckenkoden vid nedtryckt tangent. char bitCount, key, i; char data1; char data2; char data3; char data4; char data5; // läs in 3st eller 5st 11bit byte: // tecken ska ha buffrats i keypaden genom att hålla clock låg tills nu PORTC.6=1; // "clock" TRISC.6=1; // nu kan keypaden skicka sparat tecken PSA=0; // TMR0 används som timer. T0CS=0; // Intern Fosc/4 används som klocka för TMR0 /* PS<2:0> prescaling 000 1:2 001 1:4 010 1:8 011 1:16 100 1:32 101 1:64 110 1:128 111 1:256 */ TMR0=0; // Reset'ar TMR0 register och prescaler. PS2=1; // Sätter prescalern= 1:256 på detta sätt PS1=1; // TMR0==20 borde ge ca 20 * 256*1us = 5 ms PS0=1; while (PORTC.6) {if(TMR0>20) {key=0x7; goto END;} } // hitta flank eller AVBRYT while (!PORTC.6) {if(TMR0>20) {key=0x7; goto END;} } // hitta flank eller AVBRYT // klockan har nu gått från hög till låg till hög Carry = PORTC.3; // läser data vid klock +flank data1 = rr( data1); // Carry blir LSB , ? blir Carry bitCount = 8; do { while (PORTC.6); while (!PORTC.6); Carry = PORTC.3; data1 = rr( data1); } while ( -- bitCount > 0); // (startbiten hamnar till slut i Carry) bitCount = 2; do { while (PORTC.6); while (!PORTC.6); } while ( -- bitCount > 0); key=data1; // Klart om data1 inte är E0 eller F0. // key ändras nedan om så inte var fallet. if(data1==0xE0) // Om 0xE0 läses alltid en byte till { // Antingen "enter" eller "/" bitCount = 9; do { while (PORTC.6); while (!PORTC.6); Carry = PORTC.3; data2 = rr( data2); } while ( -- bitCount > 0); bitCount = 2; do { while (PORTC.6); while (!PORTC.6); } while ( -- bitCount > 0); key=data2; // Klart om data2 är "/" eller "enter". // Alt. ignorera "enter knapp nere" // och välj "enter knapp uppe" istället. if( data2==0xF0 ) // data3 = "/" , "enter". (knapp uppe) { bitCount = 9; do { while (PORTC.6); while (!PORTC.6); Carry = PORTC.3; data3 = rr( data3); } while ( -- bitCount > 0); bitCount = 2; do { while (PORTC.6); while (!PORTC.6); } while ( -- bitCount > 0); key=0x7; // Jag ignorera key knapp uppe. // (Alt. "enter knapp uppe" istället för // "enter knappr nere" kan vara vettigt.) } } if(data1==0xF0) // Tangenkoden upprepas efter 0xF0 när knapp uppe igen. { bitCount = 9; // (Alt. lösn: klocka 11 bitar och strunta i data.) do { while (PORTC.6); while (!PORTC.6); Carry = PORTC.3; data2 = rr( data2); } while ( -- bitCount > 0); bitCount = 2; do { while (PORTC.6); while (!PORTC.6); } while ( -- bitCount > 0); key=0x7; // Jag struntar i när knapp uppe. (Alt. returnera annars data2) } // Inläsningen klar av 1,2 eller 3st byte. END: TRISC.6=0; PORTC.6=0; return key; }