#include class Keyboard{ public: Keyboard(){ timer =0;}; ~Keyboard(){}; inline void init(){ mega = (struct LAYOUT * ) IO_MEMORY_OFFSET; led_test(); }; inline void led_test() { mega->portb ^= 0x00; //debug for (int i=0;i<7;i++) { mega->portb ^= 1=0;i--) { mega->portb ^= 1portb ^= 0xFF; //debug } inline void enable_int(){ mega->ddrb = SET; mega->sreg |= (1<<7) ; //global interruption enable bit mega->gicr |= (1<<7) ; //external INT1 enable, software interruption mega->portb |= (1<<3); //enable portD int1 mega->timsk |= (1<<0); //interrupt generator mega->mcucr |= (1<<3) | (1<<2); }; //page 34 stop the timer inline void clock_stop(){ mega->tccr0 &= ( 0<<2 | 0<<1 | 0<<0 ); timer=0; }; //page 34 enable the timer clock as CK/1024 inline void clock_start(){ //we neet to set the overflow time mega->tccr0 |= (1<<2) | (1<<0) ; mega->tccr0 &= ~(1<<1); }; inline void key_event() { //BUTTON3 Pressed //mcu bit 3 and 2 //1 0 falling //1 1 rising mega->portb ^= 1;//debug if (mega->mcucr & (1<<2)) { mega->mcucr &= ~(1<<2); clock_stop(); mega->portb ^= 2;//debug mega->portb |= 8; } else { mega->mcucr |= (1<<2); clock_start(); mega->portb ^= 4; //debug } } // private: LAYOUT *mega; unsigned int timer; }; /******************************************/ Keyboard k; //wrapper void key_int(){ k.key_event(); }; void timer_int(){ k.timer++; if(k.timer == 15){ k.timer = 0; k.clock_stop(); k.mega->portb ^=8; } k.mega->portb ^= 16; }; // interruption handlers extern "C"{ void __vector_2 (void) __attribute__((signal)); void __vector_2 (void) { key_int(); }; void __vector_9 (void) __attribute__((signal)); void __vector_9 (void) { timer_int(); }; }; /******************************************/ /* MAIN */ int main(){ k.init(); k.clock_stop(); k.enable_int(); while(true); };