Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define F_CPU 8000000UL// тактовая частота мк
- #include <avr/io.h>
- #include <avr/interrupt.h>
- #include <util/delay.h>
- #include "oled_ssd1306.h"
- uint8_t tiki;// глобальные тики
- uint8_t clk;// флаг клика
- uint8_t clk1;// флаг клика
- uint16_t i;
- // обработчик прерывания по переполнению. ~61гц 8000000/256=31250 Hz T=1/31250=32us t=32x256=8.2ms f=1/0.0082=122 Hz
- ISR(TIMER0_OVF_vect)
- {
- tiki++;//инкрементируем с каждым прерыванием
- }
- // инициализация таймера
- void timer_ini(void)
- {
- TCCR0B|=(1<<CS02);// запуск таймера 0 с делителем 256
- TIMSK0|=(1<<TOIE0);// разрешить прерывание по переполнению
- }
- uint8_t tikies(void)
- {
- return tiki;
- }
- void adc_ini (void)
- {
- /*** Настройка АЦП ***/
- ADCSRA |= (1 << ADEN) // Включение АЦП
- |(1 << ADPS1)|(1 << ADPS0); // предделитель преобразователя на 8
- ADMUX |= (0 << REFS1)|(1 << REFS0) // внешний ИОН
- |(1 << MUX0)|(1 << MUX1); // вход PC3
- }
- void adc (void)
- {
- ADCSRA |= (1 << ADSC); // Начинаем преобразование
- while ((ADCSRA&(1 << ADIF))== 0); // Ждем флага окончания преобразования
- i = (ADCL|ADCH << 8); // Считываем ADC
- if (i> 680)
- {
- PORTD |= (1<<PD0);
- PORTD &= ~(1<<PD1);
- }
- else
- {
- PORTD |= (1<<PD1);
- PORTD &= ~(1<<PD0);
- }
- }
- // инициализация блинков
- void blink_ini(void)
- {
- DDRB|=(1<<PB2);
- DDRC|=(1<<PC0)|(1<<PC1) |(1<<PC2);
- }
- void button_KA(void)
- {
- static uint8_t status, press;
- uint8_t now=tikies();// получаем текущее время
- switch (status)
- {
- case 0:// опрос кнопки
- if (!(PINB&(1<<PB0))) // если кнопка нажата
- {
- status=1;// уходим в статус 1
- press=now;// запоминаем время нажатия
- }
- break;
- case 1:// учет времени удеражания кнопки
- if (PINB&(1<<PB0))// если кнопка уже отжата
- {
- if ((uint8_t) (now-press)>=6) clk=1;// рассчитываем время удержания кнопки, если достаточно поднимаем флаг клика
- status=0;// уходим в статус 0
- }
- break;
- }
- }
- void button_KA1(void)
- {
- static uint8_t status, press1;
- uint8_t now1=tikies();// получаем текущее время
- switch (status)
- {
- case 0:// опрос кнопки
- if (!(PINB&(1<<PB1))) // если кнопка нажата
- {
- status=1;// уходим в статус 1
- press1=now1;// запоминаем время нажатия
- }
- break;
- case 1:// учет времени удеражания кнопки
- if (PINB&(1<<PB1))// если кнопка уже отжата
- {
- if ((uint8_t) (now1-press1)>=6) clk1=1;// рассчитываем время удержания кнопки, если достаточно поднимаем флаг клика
- status=0;// уходим в статус 0
- }
- else// иначе, кнопка всё еще удерживается
- {
- if ((uint8_t) (now1-press1)>=122) {// если удерживается уже достаточно долго
- clk1=10;// поднимаем флаг длинного клика
- status=2;// уходим в статус 2
- }
- }
- break;
- case 2:// ждем пока кнопку отпустят
- if (PINB&(1<<PB1)) status=0;// когда на пине 1 уходим в статус 0
- break;
- }
- }
- uint8_t button_stat(void)
- {
- uint8_t a=clk;
- clk=0;
- return a;
- }
- uint8_t button_stat1(void)
- {
- uint8_t a=clk1;
- clk1=0;
- return a;
- }
- void blink_click_KA(void){
- static uint8_t status, change;
- uint8_t now=tikies();// текущее "время"
- uint8_t but=button_stat();// получение событий от кнопки
- switch (status)
- {
- case 0:// светодиод выключен
- oled_gotoxy(0,5);
- oled_write(" POSITIV");
- if (but)// если было нажатие меняем статус.
- {
- if (but==1) status=1;
- }
- PORTB&=~(1<<PB2);
- break;
- case 1:// светодиод включен
- if (but)// если было нажатие меняем статус.
- {
- if (but==1) status=2;
- }
- PORTB|=(1<<PB2);
- oled_gotoxy(0,5);
- oled_write(" NEGATIV");
- break;
- case 2:// светодиод мигает
- if (but)// если было нажатие меняем статус.
- {
- if (but==1) status=3;
- }
- if ( (uint8_t) (now-change)<30) break;
- PORTB^=(1<<PB2);
- oled_gotoxy(0,5);
- oled_write(" 10 Hz ");
- change=now;
- break;
- case 3:// светодиод мигает
- if (but)// если было нажатие меняем статус.
- {
- if (but==1) status=4;
- }
- if ( (uint8_t) (now-change)<10) break;
- PORTB^=(1<<PB2);
- oled_gotoxy(0,5);
- oled_write(" 50 Hz ");
- change=now;
- break;
- case 4:// светодиод мигает
- if (but)// если было нажатие меняем статус.
- {
- if (but==1) status=0;
- }
- if ( (uint8_t) (now-change)<2) break;
- PORTB^=(1<<PB2);
- oled_gotoxy(0,5);
- oled_write(" 100 Hz ");
- change=now;
- break;
- }
- }
- void blink_click_KA1(void){
- static uint8_t status, change1;
- uint8_t now1=tikies();// текущее "время"
- uint8_t but1=button_stat1();// получение событий от кнопки
- switch (status)
- {
- case 0:
- if (but1)// если было нажатие меняем статус.
- {
- if (but1==1) status=1;
- }
- PORTC&=~(1<<PC0);
- oled_gotoxy(0,0);
- oled_write(" OFF ");
- break;
- case 1:
- if (but1)// если было нажатие меняем статус.
- {
- if (but1==1) status=2;
- }
- PORTC|=(1<<PC0);
- oled_gotoxy(0,0);
- oled_write(" LOW");
- break;
- case 2:
- if (but1)// если было нажатие меняем статус.
- {
- if (but1==1) status=3;
- }
- PORTC&=~(1<<PC0);
- PORTC|=(1<<PC1);
- oled_gotoxy(0,0);
- oled_write(" MIDDLE");
- break;
- case 3:
- if (but1)// если было нажатие меняем статус.
- {
- if (but1==1) status=4;
- }
- PORTC&=~(1<<PC1);
- PORTC|=(1<<PC2);
- oled_gotoxy(0,0);
- oled_write(" HIGH ");
- break;
- case 4:
- if (but1)// если было нажатие меняем статус.
- {
- if (but1==1) status=1;
- }
- if ( (uint8_t) (now1-change1)<1) break;
- PORTC&=~(1<<PC2);
- oled_gotoxy(0,0);
- oled_write(" OFF ");
- change1=now1;
- break;
- }
- }
- int main(void)
- {
- DDRD=0xFF;
- adc_ini ();
- blink_ini(); // инициализация блинков
- timer_ini();// инициализация таймера
- sei();// глобально разрешить прерывания
- oled_init();
- oled_gotoxy(0,0);
- while(1)
- { adc ();
- blink_click_KA();
- blink_click_KA1();
- button_KA();
- button_KA1();
- //oled_gotoxy(0,2);
- //oled_write("uuuu");
- //oled_gotoxy(0,4);
- //oled_write("1234");
- //
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment