
рдПрдХ рдмрд╛рд░ рдПрдХ рдореБрд╢реНрдХрд┐рд▓ рд╡рд┐рдХрд▓реНрдк рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░реНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЛрдВ рдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢:
- рддреЛ, тАЛтАЛрдЗрд╕ рдкреИрд░ PWM, рдЗрд╕ рдкрд░ - рдмрдЯрди, рдЗрди рдкрд░ - рдПрд▓ рдИ рдбреА ... рдЙрдлрд╝ ... рд▓реЗрдХрд┐рди рдЖрдкрдХреЗ рдкреИрд░ рдЦрддреНрдо рд╣реЛ рдЧрдП рд╣реИрдВред рдПрд▓ рдИ рдбреА рдХреЗ рдмрд┐рдирд╛, рдмрджрд╕реВрд░рдд, рдмрд┐рдирд╛ рдмрдЯрди рдХреЗ рд╢рд┐рдерд┐рд▓ рд╣реИред рдХреНрд░рд┐рд╕реНрдЯрд▓ рдлрдЯрд░ рд▓реЗрдирд╛ рд╣реИ :(
рдпрд╛ рдПрдХ рдФрд░ рд╕реНрдерд┐рддрд┐ - рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рдХреЗ рд╕рд╛рде рдмреЛрд░реНрдб рджреГрд╖реНрдЯрд┐ рд╕реЗ рдЫрд┐рдкрд╛ рд╣реБрдЖ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдЙрджрд╛рд╕ рд╕рд╛рдВрдк рдХреЗ рд╕рд╛рде рд╕рдВрдХреЗрддрдХ рдХреЛ рддрд╛рд░реЛрдВ рдХрд╛ рджреЛрд╣рди рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рдЖрдВрддреНрд░реЛрдВ рдХреЛ рдЫреЗрджрддрд╛ рд╣реИред
рд╕рдордп рдЖ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреИрд░реЛрдВ рдХреЛ рдХрд╛рдЯрдХрд░ рдЗрд╕ рдХреЗрдмрд▓-рдкреИрд░ рд╡рд╛рд▓реЗ рд░рд╛рдХреНрд╖рд╕ рдХреЛ рд╡рд╢ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рдП, рдФрд░ рдЗрд╕рд╕реЗ рд╣рдореЗрдВ рдорджрдж рдорд┐рд▓реЗрдЧреА
рдПрдбреАрд╕реА рдФрд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╕рд░рд▓ рд╕рд░реНрдХрд┐рдЯ:

рдФрд░ рдЕрдм рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рдХрд╛рдо рдХрд╛ рд╕рд┐рджреНрдзрд╛рдВрддред
рд╕рд░реНрдХрд┐рдЯ рдХреЗ рд╕рдордп рдХрд╛ рдореБрдЦреНрдп рднрд╛рдЧ рд╕рдВрдХреЗрдд рдореЗрдВ рд▓рдЧрд╛ рд╣реБрдЖ рд╣реИред рдПрдХ рдкреИрд░ рдкрд░ 1 рдФрд░ рджреВрд╕рд░реЗ рдкрд░ 0 рдЦрд┐рд▓рд╛рдП рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдЗрд╕реА рдПрд▓рдИрдбреА рдХреЛ рд░реЛрд╢рдиреА рджреЗрддреЗ рд╣реИрдВред рдПрдХ рд╕рдВрдпреЛрдЬрди рд╣рд░рд╛ рд░рдВрдЧ рджреЗрддрд╛ рд╣реИ, рджреВрд╕рд░рд╛ рд▓рд╛рд▓, рдФрд░ рдпрджрд┐ рдЖрдк рдЬрд▓реНрджреА рд╕реЗ рдЖрдЧреЗ рдФрд░ рдкреАрдЫреЗ рдЦреАрдВрдЪрддреЗ рд╣реИрдВ - рддреЛ рд╣рдореЗрдВ рдирд╛рд░рдВрдЧреА рдорд┐рд▓рддрд╛ рд╣реИред
рд╣рдордиреЗ рд╕рдВрдХреЗрдд рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛, рдФрд░ рдЕрдм рдмрдЯрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдо рдПрдХ рддрд╛рд░реНрдХрд┐рдХ 0 рд╕реЗ рдкреЛрд░реНрдЯ 2 рдХреА рдЖрдкреВрд░реНрддрд┐ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдирд┐рд░реНрдорд┐рдд рдореЗрдВ рдПрдбреАрд╕реА рдХреЗ рд▓рд┐рдП рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдкреЛрд░реНрдЯ 1 рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд░реЛрдХрдиреЗрд╡рд╛рд▓рд╛ рдЖрд░ 1 рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рд╣рдореЗрдВ рдПрд▓рдИрдбреА рдкрд░ рдХреБрдЫ рдЫреЛрдЯреА рдХреНрд╖рдорддрд╛ рдорд┐рд▓рддреА рд╣реИред рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЖрдЧреЗ рдХреА рджрд┐рд╢рд╛ рдореЗрдВ рд╣рд░реЗ рд░рдВрдЧ рдХреА рдПрд▓рдИрдбреА рдЪрд╛рд▓реВ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ, рд╣рд░реЗ (рдФрд░ рдкреАрд▓реЗ, рд╡реИрд╕реЗ рднреА) рдПрд▓ рдИ рдбреА рдореЗрдВ рд▓рд╛рд▓ рд╡рд╛рд▓реЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрд╛рдлреА рдмрдбрд╝рд╛ рдкреНрд░рддреНрдпрдХреНрд╖ рд╡реЛрд▓реНрдЯреЗрдЬ рдбреНрд░реЙрдк рд╣реЛрддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рд╡реЛрд▓реНрдЯреЗрдЬ рдкреНрд░реЗрд╕ рдХрд┐рдП рдЧрдП рдмрдЯрди рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдордЬрд╝рдмреВрддреА рд╕реЗ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рдЬрдм рдЙрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдХреЛ рджрдмрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдПрдХ рд╡реЛрд▓реНрдЯреЗрдЬ рдбрд┐рд╡рд╛рдЗрдбрд░ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЕрдм рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ рдХрд┐ рдкреНрд░рд╛рдкреНрдд рд╕рд┐рдЧреНрдирд▓ рдХреЛ рдбрд┐рдЬрд┐рдЯрд▓ рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рдПрдХ рдмрдЯрди рдХреЗ рдкреБрд╢ рдореЗрдВ рдЯреНрд░рд╛рдВрд╕рдХреЛрдб рдХрд░реЗрдВред рд╡реИрд╕реЗ, рднрд▓реЗ рд╣реА рдЖрдк рддрд╛рд░реЛрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреА рдзреНрд░реБрд╡реАрдпрддрд╛ рдХреЛ рдЙрд▓рдЯ рджреЗрдВ - рдбрд┐рд╡рд╛рдЗрдбрд░ рдХреЗ рд╕рд╣реА рдЪрдпрди рдХреЗ рд╕рд╛рде, рдмрдЯрди рдЪрд╛рд▓реВ рд░рд╣реЗрдВрдЧреЗ, рдЬрдм рддрдХ рдХрд┐ рд╕рдВрдХреЗрдд рдорд┐рд▓рд╛рдпрд╛ рдирд╣реАрдВ рдЬрд╛рддрд╛ рд╣реИред рдкреНрд░рддрд┐рд░реЛрдзреЛрдВ рдЖрд░ 3 рдФрд░ рдЖрд░ 4 рдХреА рдкрд╕рдВрдж рдХрд╛рдлреА рд╕реНрд╡рддрдВрддреНрд░ рд╣реИ, рдпрд╛рдж рд░рдЦрдиреЗ рдХреА рдореБрдЦреНрдп рдмрд╛рдд рджреЛ рдирд┐рдпрдо рд╣реИрдВ - рдПрдХ рдЫреЛрдЯреЗ рдЕрд╡рд░реЛрдзрдХ рдХреЛ рдПрд▓ рдИ рдбреА рдХреА рд░реЛрд╢рдиреА рдореЗрдВ рд╣рд╕реНрддрдХреНрд╖реЗрдк рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдПрдХ рдмрдбрд╝рд╛ рд░реЛрдХрдиреЗрд╡рд╛рд▓рд╛ рдХреЛ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдкрд╣рдЪрд╛рди рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╡реЛрд▓реНрдЯреЗрдЬ рдбреНрд░реЙрдк рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред рдореИрдВрдиреЗ рдХреЗрд╡рд▓ рдЙрди рд▓реЛрдЧреЛрдВ рд╕реЗ рдЖрд░реЗрдЦ рдкрд░ рд╕рдВрдХреЗрддрд┐рдд рдореВрд▓реНрдпреЛрдВ рдХреЛ рд░рдЦрд╛, рдЬреЛ рд╣рд╛рде рдореЗрдВ рдкрдбрд╝реЗ рдереЗ, рдФрд░ рдлрд┐рд░ рдореИрдВрдиреЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рдкрд░рд┐рдгрд╛рдореА рд╡реЛрд▓реНрдЯреЗрдЬ рджрд░реНрдЬ рдХрд┐рдПред рдЖрд░ 2 - рд╡рд░реНрддрдорд╛рди-рд╕реАрдорд┐рдд, рдорд╛рдЗрдХреНрд░реЛрдХрдВрдЯреНрд░реЛрд▓рд░ рдХреЗ рдПрд▓ рдИ рдбреА рдФрд░ рдкреИрд░ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЪрдпрди рдХрд░реЗрдВ, рдХрднреА-рдХрднреА рдЖрдк рдЗрд╕рдХреЗ рдмрд┐рдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдФрд░ рдЕрдм рдЗрд╕ рдпреЛрдЬрдирд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреБрд╕реНрддрдХрд╛рд▓рдпред рдЗрд╕ рд╡рд┐рд╢реЗрд╖ рдорд╛рдорд▓реЗ рдореЗрдВ, ATMega48 рдХреЛ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдХреЛрдб рдХреЛ рдпрдерд╛рд╕рдВрднрд╡ рд▓реЛрд╣реЗ рд╕реЗ рд╕реНрд╡рддрдВрддреНрд░ рд▓рд┐рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рдФрд░ рджреВрд╕рд░реА рдЪрд┐рдк рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреЛрд░реНрдЯ рдФрд░ рдПрдбреАрд╕реА рдХреЗ рдкреНрд░рд╛рд░рдВрдн рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред
#ifndef BIWIRE_H_ #define BIWIRE_H_ // Define connections (PORTC only!) #define BWPORT1 1 #define BWPORT2 2 // Set pin functions #define ADCPORT BWPORT1 #define GNDPORT BWPORT2
рдпрджрд┐ рдЕрдЪрд╛рдирдХ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреИрд░ рдерд╛, рддреЛ рд░реЛрдХрдиреЗрд╡рд╛рд▓рд╛ рдЖрд░ 1 рдХреЗ рдмрдЬрд╛рдп рдЗрд╕ рдЬрдЧрд╣ рдкрд░ рдЗрд╕рдХреЗ рдкреБрд▓-рдЕрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдХрд╛рдлреА рд╕рдВрднрд╡ рд╣реИ
// State for interrupt loop #define ADC_SET 0x01 #define ADC_WAIT 0x02 // LED flashing frequency (in parrots, without small wing) #define SCAN_FREQ 48 // Work together with SCAN_FREQ to get orange color #define MAX_COLOR_MIX 50 // Event bits when scan complete // Main keyboard event indicator - must be cleared after handle #define BW_EVENT 0x80 // Button pressed #define BW_EVBT1 0x01 #define BW_EVBT2 0x02 // add additional flags here, like BW_EVBT3=0x04 // EVFIN - event "Indication finished" #define BW_EVFIN 0x10 // Button released #define BW_EVOPN 0x20 // If button holds more than BW_LONG_PRESS cycles #define BW_EVLNG 0x40 // How long we wait for 'LongPress' #define BW_LONG_PRESS 10
рдпрд╣рд╛рдВ рдЖрдк рдЕрдиреБрдорд╛рдирд┐рдд рдорд╛рди рдкреНрд▓рд╕ рдпрд╛ рдорд╛рдЗрдирд╕ рдмрд╕ рд╕реНрдЯреЙрдк рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдореБрдЦреНрдп рдмрд╛рдд рдмрдЯрди рдХреА рд╕рдЯреАрдХ рдкрд░рд┐рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рд╕реАрдорд╛рдУрдВ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдирд╛ рд╣реИ
// ADC compare values #define BW_VBTN1 0x1F #define BW_VBTN2 0xFE // Define names for signal array enum SignalNames { LedOff = 0, OneGreen = 1, OneRed = 2, OneOrange = 3, TwoGreen = 4, TwoRed = 5, Alarm = 6, OrangeRG = 7
рдЗрд╕реА рддрд░рд╣ рдЕрдкрдиреЗ рд╕рдВрдХреЗрддреЛрдВ рдХреЛ рд╕реНрд╡рд╛рдж рдХреЗ рд▓рд┐рдП рдЬреЛрдбрд╝реЗрдВ
}; // ====== Externals ======= // LED sequence to indicate extern volatile enum SignalNames BwIndicate; // Data about button events extern volatile uint8_t BwButton; // If not null - delay of led indication, then switch LED off extern volatile uint8_t BwLedDelay; // Call on start void biwire_init(void); #endif
рдбрд╛рдЙрдирд▓реЛрдб .hрдареАрдХ рд╣реИ, рд╕реНрд░реЛрдд рд╣реА:
#include <avr/io.h> #include <avr/interrupt.h> #include <stdint.h> #include "biwire.h" // Led blink matrix. Only upper 6 bits used for indication loop static uint8_t bwsignalsR[] = { 0x00, 0x00, 0xC0, 0xC0,0x00, 0xA0, 0xA0, 0xFC }; static uint8_t bwsignalsG[] = { 0x00, 0xC0, 0x00, 0xC0,0xA0, 0x00, 0x50, 0xC0 }; // LED sequence to indicate volatile enum SignalNames BwIndicate; // FSM and sequence counter static volatile uint8_t BwState; // "LongPress" counter static volatile uint8_t btn_cnt; // Data about button events volatile uint8_t BwButton; // Orange color created by mixing green and red static volatile uint8_t color_mix; // If not null - delay of led indication, then switch LED off volatile uint8_t BwLedDelay; void biwire_init(void) { // Timer interrupt TCCR0B = _BV(CS00) | _BV(CS01) | _BV(WGM02); // use CLK/64 prescale value, clear timer/counter on compareA match OCR0A = SCAN_FREQ; // preset timer0 OCR byte TIMSK0 = _BV(OCIE0A); // enable Output Compare 0 overflow interrupt // PIN init DDRC |= _BV(BWPORT1) | _BV(BWPORT2); // ADC init ADCSRA = _BV(ADEN) | _BV(ADPS2); // Activate ADC with Prescaler 16
0xA0, 0xA0, 0xFC #include <avr/io.h> #include <avr/interrupt.h> #include <stdint.h> #include "biwire.h" // Led blink matrix. Only upper 6 bits used for indication loop static uint8_t bwsignalsR[] = { 0x00, 0x00, 0xC0, 0xC0,0x00, 0xA0, 0xA0, 0xFC }; static uint8_t bwsignalsG[] = { 0x00, 0xC0, 0x00, 0xC0,0xA0, 0x00, 0x50, 0xC0 }; // LED sequence to indicate volatile enum SignalNames BwIndicate; // FSM and sequence counter static volatile uint8_t BwState; // "LongPress" counter static volatile uint8_t btn_cnt; // Data about button events volatile uint8_t BwButton; // Orange color created by mixing green and red static volatile uint8_t color_mix; // If not null - delay of led indication, then switch LED off volatile uint8_t BwLedDelay; void biwire_init(void) { // Timer interrupt TCCR0B = _BV(CS00) | _BV(CS01) | _BV(WGM02); // use CLK/64 prescale value, clear timer/counter on compareA match OCR0A = SCAN_FREQ; // preset timer0 OCR byte TIMSK0 = _BV(OCIE0A); // enable Output Compare 0 overflow interrupt // PIN init DDRC |= _BV(BWPORT1) | _BV(BWPORT2); // ADC init ADCSRA = _BV(ADEN) | _BV(ADPS2); // Activate ADC with Prescaler 16
Atmely рдХреЗ рд▓рд┐рдП рдЖрдВрддрд░рд┐рдХ рд╕рдВрджрд░реНрдн рдХреЗрд╡рд▓ 1.1 рд╡реЛрд▓реНрдЯ рд╣реИ, рдЬреЛ рджрдмрд╛рдП рдЧрдП рдмрдЯрди рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдореЗрдВ ADC рдЖрдЙрдЯрдкреБрдЯ рдкрд░ рдПрдХ рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рдФрд░ рдЕрднреЗрджреНрдп 0xFF рджреЗрддрд╛ рд╣реИред
DIDR0 = _BV(ADCPORT); // disable digital input for ADC // Set initial state for bw BwState = ADC_SET; BwIndicate = OneGreen; BwButton = BW_EVOPN; color_mix = 0; BwLedDelay = 0; }
рдЖрдк рдЕрдкрдиреА рдкрд╕рдВрдж рдХреЗ рд╣рд┐рд╕рд╛рдм рд╕реЗ рдЯрд╛рдЗрдорд░ рдХреЛ рдмрд╛рдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдбрд┐рд╡рд╛рдЗрдбрд░ рдФрд░ color_mix рдХреЗ рд╕рд╛рде рдЦреЗрд▓рддреЗ рд╣реБрдП, рдЖрдк рдПрдХ рдмрдЯрди рдХреЗ рдХреНрд▓рд┐рдХ рдкрд░ рдмреНрд▓рд┐рдВрдХрд┐рдВрдЧ рдХреА рдЧрддрд┐ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕рдордп рдЪреБрди рд╕рдХрддреЗ рд╣реИрдВред
SIGNAL (SIG_OUTPUT_COMPARE0A) // handler for Output Compare 0 overflow interrupt { if (BwState&ADC_SET) { // Prepare to keyscan PORTC &= ~_BV(GNDPORT); DDRC &= ~_BV(ADCPORT); ADCSRA |= _BV(ADSC); //Start conversion BwState = ADC_WAIT; color_mix = MAX_COLOR_MIX; if (BwLedDelay) if (!(
рдЗрд╕реА рддрд░рд╣ рд╕реЗ, рдЖрдк рддреАрд╕рд░реЗ рдФрд░ рд╕рднреА рдмрд╛рдж рдХреЗ рдмрдЯрдиреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реАрдорд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдСрдкрд░реЗрд╢рди рдХреА рд╕рдЯреАрдХрддрд╛ рдХреЗ рд╕рд╛рде рдЯрд┐рдВрдХрд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
} else { // Button 1 pressed. Add compare values here if you need more than 2 buttons if (BwButton & (BW_EVBT2|BW_EVOPN)) { BwButton = BW_EVENT + BW_EVBT1; btn_cnt = 1; } } if (btn_cnt) { if(++btn_cnt > BW_LONG_PRESS) { // New event - long press BwButton |= BW_EVENT + BW_EVLNG; btn_cnt = 0; } } // Cleanup if (!(BwButton&(BW_EVBT1|BW_EVBT2|BW_EVOPN))) BwButton = BW_EVOPN; }
рдпрджрд┐ рдЖрдк рдпрд╣рд╛рдВ ADC_WAIT рд╕реНрдерд┐рддрд┐ рд╕реЗ рдирд╣реАрдВ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдПрд▓рдИрдбреА рдлреНрд▓реИрд╢рд┐рдВрдЧ рдЪрдХреНрд░ рдореЗрдВ рд╕рд╛рддрд╡реЗрдВ рдмрд┐рдЯ рдХреЛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдореЗрд░реЗ рд▓рд┐рдП рдЫрд╣ рдмрд┐рдЯреНрд╕ рдХрд╛рдлреА рд╣реИрдВред рдФрд░ рдПрдХ рд╕реЛрд▓рд╣-рдмрд┐рдЯ BwState рдХреЗ рд▓рд┐рдП, рдЖрдк рдПрд▓ рдИ рдбреА рд╕реЗ рдПрдХ рдкрд╛рдЧрд▓ рдбрд┐рд╕реНрдХреЛ рдХреА рд╡реНрдпрд╡рд╕реНрдерд╛ рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
if (color_mix++ > MAX_COLOR_MIX) { // Get next state (LED sequence) BwState = (BwState >> 7) | (BwState << 1); // rotate left, replace by _asm to compact code // Indicate DDRC |= _BV(ADCPORT); PORTC &= ~(_BV(GNDPORT)|_BV(ADCPORT)); if(bwsignalsR[BwIndicate]&BwState) PORTC |= _BV(BWPORT2); if((bwsignalsG[BwIndicate]&BwState) && (!(bwsignalsR[BwIndicate]&BwState)) ) PORTC |= _BV(BWPORT1); color_mix = 0; } if((bwsignalsR[BwIndicate]&BwState) && (bwsignalsG[BwIndicate]&BwState)){ PORTC ^= (_BV(BWPORT1) | _BV(BWPORT2)); } } }
рдбрд╛рдЙрдирд▓реЛрдб .cрд╡рд╣ рд╕рдм рд╣реИред рдЗрд╕ рдХреЛрдб рдХреЛ рдЕрдкрдиреЗ рд╕реНрд░реЛрддреЛрдВ рдореЗрдВ рдПрдореНрдмреЗрдб рдХрд░реЗрдВ рдФрд░ рддрд╛рд░реЛрдВ рдФрд░ рдкреИрд░реЛрдВ рдХреЛ рдмрдЪрд╛рдПрдВред Minuses рдХреА - рд╢рд╛рдпрдж рдмрдЯрди рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд╣рдж рддрдХ "рдЧреВрдВрдЧрд╛" рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛, рд▓реЗрдХрд┐рди рдЖрдк рдЬрд▓реНрджреА рд╕реЗ рдЗрд╕рдХреА рдЖрджрдд рдбрд╛рд▓ рд▓реЗрддреЗ рд╣реИрдВред
рдЖрдк bwsignalsR / bwsignalsG рдХреЗ рдмрд╛рдж рддреАрд╕рд░рд╛ рд╕рд░рдгреА рднреА рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП bwsignalsB, рдФрд░ рдЗрд╕реЗ рдСрди-рдСрдл рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрдЪрд╛рд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдореИрдВ рдЗрд╕реЗ рдЖрдкрдХреЗ рд╣реЛрдорд╡рд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЫреЛрдбрд╝ рджреВрдБрдЧрд╛ :)
рдЕрд░реЗ рд╣рд╛рдБ, рдореИрдВ рд▓рдЧрднрдЧ рднреВрд▓ рдЧрдпрд╛ рдерд╛ред рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг:
#include "biwire.h" int main(void) { biwire_init(); sei(); while (1) { if ( BwButton & BW_EVENT ) { BwButton &= ~BW_EVENT; // Clear event flag if (BwButton & BW_EVLNG) { BwIndicate = OrangeRG; BwLedDelay = 5; } else if (BwButton & BW_EVOPN) { //BwIndicate = LedOff; } else if (BwButton & BW_EVBT1) { BwIndicate = OneRed; BwLedDelay = 5; } else if (BwButton & BW_EVBT2) { BwIndicate = OneGreen; BwLedDelay = 5; } } } }
рдкреБрдирд╢реНрдЪ: рдпрд╣ рдЕрдЬреАрдм рдмрд╛рдд рд╣реИ, рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рдпрд╛рдж рдХреА рдЧрдИ рдХреБрдЫ рдмрд╛рддреЗрдВ рдкреБрд░рд╛рдиреЗ рдЗрдВрдЬрди рдореЗрдВ рд╕реАрдзреЗ рдкреЗрд╕реНрдЯрдмрд┐рди рд╕реЗ рд╕реНрд░реЛрдд рдкреЗрд╕реНрдЯ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдерд╛? рдЗрддрдирд╛ рдЕрдЪреНрдЫрд╛ рдореМрдХрд╛ рдХреНрдпреЛрдВ рдирд┐рдХрд╛рд▓рд╛ рдЧрдпрд╛? рдпрд╛ рдореИрдВ рдХреБрдЫ рднреНрд░рдорд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдБ?