#include #include "main.h" class Keyboard{ public: LAYOUT *avr; unsigned int timer; Keyboard(){ timer =0;}; ~Keyboard(){}; void init(){ avr = (struct LAYOUT * ) IO_MEMORY_OFFSET; led_switch(ALL); }; void led_switch(short value){ avr->ddrB = SET; avr->portB ^= value; }; void enable_int(){ avr->status_reg |= (1<<7) ; //global interruption enable bit avr->gen_int_mask |= (1<<7) ; //external INT1 enable, software interruption avr->portD |= (1<<3); //enable portD int1 avr->tc_int_mask |= (1<<1); //interrupt generator avr->mcu |= (1<<3) | (1<<2); }; //page 34 stop the timer void clock_stop(){ avr->tc0_control_reg &= ( 0<<2 | 0<<1 | 0<<0 ); timer=0; }; //page 34 enable the timer clock as CK/1024 void clock_start(){ //we neet to set the overflow time avr->tc0_control_reg |= (1<<2) | (1<<0) ; avr->tc0_control_reg &= ~(1<<1); }; void key_event() { save(); if (avr->mcu & (1<<2)) { avr->mcu &= ~(1<<2); clock_stop(); avr->portB |= 8; }else { avr->mcu |= (1<<2); clock_start(); } restore(); }; void timer_int(){ save(); timer++; if(timer == 54){ timer = 0; clock_stop(); avr->portB ^=8; } avr->portB ^= 16; restore(); }; void save(){ asm("push r0\n" "push r1\n" "push r2\n" "push r3\n" "push r4\n" "push r5\n" "push r6\n" "push r7\n" "push r8\n" "push r9\n" "push r10\n" "push r11\n" "push r12\n" "push r13\n" "push r14\n" "push r15\n" "push r16\n" "push r17\n" "push r18\n" "push r19\n" "push r20\n" "push r21\n" "push r22\n" "push r23\n" "push r24\n" "push r25\n" "push r26\n" "push r27\n" "push r28\n" "push r29\n" "push r30\n" "push r31\n" ); } void restore(){ asm("pop r0\n" "pop r1\n" "pop r2\n" "pop r3\n" "pop r4\n" "pop r5\n" "pop r6\n" "pop r7\n" "pop r8\n" "pop r9\n" "pop r10\n" "pop r11\n" "pop r12\n" "pop r13\n" "pop r14\n" "pop r15\n" "pop r16\n" "pop r17\n" "pop r18\n" "pop r19\n" "pop r20\n" "pop r21\n" "pop r22\n" "pop r23\n" "pop r24\n" "pop r25\n" "pop r26\n" "pop r27\n" "pop r28\n" "pop r29\n" "pop r30\n" "pop r31\n" ); } }; /******************************************/ int main(){ Keyboard k; k.init(); k.led_switch(NONE); k.clock_stop(); k.enable_int(); while(true); };