#include #include //#include "LCD4Bit_mod.h" #include LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2); #define DEBOUNCE_MAX 17 // max value for debounce count #define DEBOUNCE_ON 12 // debounce pressed threshold 12x4ms = 48ms #define DEBOUNCE_OFF 2 // debounce released threshold 8ms //create object to control an LCD. //number of lines in display=1 //LCD4Bit_mod lcd = LCD4Bit_mod(2); int adc_key_val[5] ={30, 150, 360, 535, 760 }; byte NUM_KEYS = 5; char key=-1; char oldkey=-1; // debounce counters byte button_count[5]; // button status - pressed/released byte button_status[5]; // button on flags byte button_flag[5]; // Timer2 interrupt routine - // 1/(160000000/256/(256-6)) = 4ms interval ISR(TIMER2_OVF_vect) { TCNT2 = 6; update_adc_key(); } // Convert ADC value to key number char get_key(unsigned int input) { char k; for (k = 0; k < NUM_KEYS; k++) { if (input < adc_key_val[k]) { return k; } } if (k >= NUM_KEYS) k = -1; // No valid key pressed return k; } void update_adc_key(){ int adc_key_in; char key_in; byte i; adc_key_in = analogRead(0); key_in = get_key(adc_key_in); for(i=0; iDEBOUNCE_ON) { if(button_status[i] == 0) { button_flag[i] = 1; // pressed state flag ON button_status[i] = 1; //button debounced to 'pressed' status } } } } else // no button pressed { if (button_count[i] >0) { button_count[i]--; if(button_count[i] plain equivalent //and misc symbol translation case 0xA3: //sterling (pounds) rxbyte = 0xED; break; /* case 0xB0: //degrees symbol rxbyte = 0xDF; break; */ case 0xB5: //mu rxbyte = 0xE4; break; case 0xC0: //"A" variants case 0xC1: case 0xC2: case 0xC3: case 0xC4: case 0xC5: rxbyte = 0x41; break; case 0xC8: //"E" variants case 0xC9: case 0xCA: case 0xCB: rxbyte = 0x45; break; case 0xCC: //"I" variants case 0xCD: case 0xCE: case 0xCF: rxbyte = 0x49; break; case 0xD1: //"N" tilde -> plain "N" rxbyte = 0x43; break; case 0xD2: //"O" variants case 0xD3: case 0xD4: case 0xD5: case 0xD6: case 0xD8: rxbyte = 0x4F; break; case 0xD9: //"U" variants case 0xDA: case 0xDB: case 0xDC: rxbyte = 0x55; break; case 0xDD: //"Y" acute -> "Y" rxbyte = 0x59; break; /* case 0xDF: //beta //mucks up LCDSmartie's degree symbol?? rxbyte = 0xE2; break; */ case 0xE0: //"a" variants except umlaut case 0xE1: case 0xE2: case 0xE3: case 0xE5: rxbyte = 0x61; break; case 0xE7: //"c" cedilla -> "c" rxbyte = 0x63; break; case 0xE8: //"e" variants case 0xE9: case 0xEA: case 0xEB: rxbyte = 0x65; break; case 0xEC: //"i" variants case 0xED: case 0xEE: case 0xEF: rxbyte = 0x69; break; case 0xF2: //"o" variants except umlaut case 0xF3: case 0xF4: case 0xF5: case 0xF8: rxbyte = 0x6F; break; case 0xF7: //division symbol rxbyte = 0xFD; break; case 0xF9: //"u" variants except umlaut case 0xFA: case 0xFB: rxbyte = 0x75; break; default: break; } lcd.print(rxbyte); //otherwise a plain char so we print it to lcd return; }