/* ATtiny45 PDIP/SOIC/TSSOP (PCINT5/RESET(i)/ADC0/dW) PB5 [1] [8] VCC (PCINT3/XTAL1/CLKI/OC1B(i)/ADC3) PB3 [2] [7] PB2 (SCK/USCK/SCL/ADC1/T0/INT0/PCINT2) (PCINT4/XTAL2/CLKO/OC1B/ADC2) PB4 [3] [6] PB1 (MISO/DO/AIN1/OC0B/OC1A/PCINT1) GND [4] [5] PB0 (MOSI/DI/SDA/AIN0/OC0A/OC1A(i)/AREF/PCINT0) */ #include #include #include #define F_CPU 1000000 // 1 MHz #define KEY_PIN PINB #define KEY_PORT PORTB #define KEY0 2 #define LED_DDR DDRB #define LED_PORT PORTB #define LED0 0 //#define LED1 1 //#define LED2 4 //#define LED3 3 #define REPEAT_MASK (1<1: key press detect key_release |= ~key_state & i; // 1->0: key release detect if( (key_state & REPEAT_MASK) == 0 ) // check repeat function rpt = REPEAT_START; // start delay if( --rpt == 0 ){ rpt = REPEAT_NEXT; // repeat delay key_rpt |= key_state & REPEAT_MASK; } } uint8_t get_key_press( uint8_t key_mask ) { ATOMIC_BLOCK(ATOMIC_FORCEON){ key_mask &= key_press; // read key(s) key_press ^= key_mask; // clear key(s) } return key_mask; } uint8_t get_key_rpt( uint8_t key_mask ) { ATOMIC_BLOCK(ATOMIC_FORCEON){ key_mask &= key_rpt; // read key(s) key_rpt ^= key_mask; // clear key(s) } return key_mask; } uint8_t get_key_short( uint8_t key_mask ) { uint8_t i; ATOMIC_BLOCK(ATOMIC_FORCEON) i = get_key_press( ~key_state & key_mask ); return i; } uint8_t get_key_long( uint8_t key_mask ) { return get_key_press( get_key_rpt( key_mask )); } uint8_t get_key_long_r( uint8_t key_mask ) // if repeat function needed { return get_key_press( get_key_rpt( key_press & key_mask )); } uint8_t get_key_rpt_l( uint8_t key_mask ) // if long function needed { return get_key_rpt( ~key_press & key_mask ); } int main( void ) { /* Taster Entprellen über Timer nach Peter Danegger */ TCCR1 = 1< 0) pwm = 0; else pwm = 255; if( get_key_long_r( 1< 0 ) --pwm; } } else if( pressed ) { pressed = 0; direction = 1 - direction; } OCR0A = pwm; //_delay_ms(10); } return 0; }