/* Hämtar tecken från en keyPad 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. Använder dessa PIC 16F690 portar: Kopiera till huvudprogrammet. ANSEL.7 = 0; // PORTC.3 ej analog TRISC.3 = 1; // KeyPad Rx in ANSELH.0= 0; // PORTC.6 ej analog TRISC.6 = 1; // KeyPad Clk in */ char getTkn(void) { // getTkn() returnerar keypad'ens tecken 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, tkn, 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; // nu kan keypaden inte skicka tecken (tecken sparas i keyPad'en) switch(key) { case 0x4A: tkn = '/'; break; case 0x7C: tkn = '*'; break; case 0x7B: tkn = '-'; break; case 0x79: tkn = '+'; break; case 0x5A: tkn = '='; break; // Min översättning av 'enter' case 0x71: tkn = '.'; break; case 0x70: tkn = '0'; break; case 0x69: tkn = '1'; break; case 0x72: tkn = '2'; break; case 0x7A: tkn = '3'; break; case 0x6B: tkn = '4'; break; case 0x73: tkn = '5'; break; case 0x74: tkn = '6'; break; case 0x6C: tkn = '7'; break; case 0x75: tkn = '8'; break; case 0x7D: tkn = '9'; break; case 0x77: tkn = 'N'; break; // Min översättning av 'Num Lock' case 0x07: tkn = key ; } return tkn; }