Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define F_CPU 8000000UL
- #include <avr/io.h>
- #include <util/delay.h>
- #include <avr/interrupt.h>
- #include <avr/eeprom.h>
- unsigned char led = 1;
- unsigned char led2 = 1;
- volatile unsigned char old,now,btn,old1,now1,btn1;
- //unsigned char eeprom_var EEMEM;
- //unsigned char eeprom_var2 EEMEM;
- //***************************************************************
- unsigned char st()
- { // проверяет нажатие кнопки PB5 POL
- btn=0;
- now=PINB& (1<<PB5); // текущее состояние кнопки PD1
- if ((now==0) && (old!=0)) btn=1; // если кнопка нажата
- old=now;
- return btn;
- }
- //***************************************************************
- unsigned char st2()// проверяет нажатие кнопки PB0 LEVEL
- {
- btn1=0;
- now1=PINB& (1<<PB0); // текущее состояние кнопки PB0
- if ((now1==0) && (old1!=0)) btn1=1; // если кнопка нажата
- old1=now1;
- return btn1;
- }//***************************************************************
- // Процедура прерывания по переполнению таймера 0
- #define OVF 10 // периодичность выполнения процедуры прерывания, mS
- ISR (TIMER0_OVF_vect){
- static unsigned char fToggle,cCount;
- static unsigned int uiCount,a;
- //******************************//
- //*** МИГАНИЕ СВЕТОДИОДА PD0 ***//
- //******************************//
- if (fToggle==1){ // если установлен флаг мигания
- if (uiCount<a){ // в течение первого полупериода 1 Гц 250*8
- PORTD |= (1<<PD0); // светодиод PD0 включен
- }
- else if (uiCount<2*a){ // в течение второго полупериода 1 Гц
- PORTD &= ~(1<<PD0); // светодиод PD0 выключен
- }
- else uiCount=0;
- uiCount++;
- }
- //***********************************//
- //*** ПРОВЕРКА НАЖАТИЯ КНОПКИ PA0 ***//
- //***********************************//
- if (cCount>(25/OVF)){ // выполняется с периодичностью 25 mS
- if (st()){ // если кнопка PA0 нажата
- switch(led){
- case 1:
- PORTD |= (1<<PD0); // включить светодиод PD0
- fToggle=0; // снять флаг мигания
- break;
- case 2:
- a=125;
- fToggle=1; // установить флаг мигания
- break;
- case 3:
- a=50;
- fToggle=1; // установить флаг мигания
- break;
- case 4:
- a=25;
- fToggle=1; // установить флаг мигания
- break;
- case 5:
- a=5;
- fToggle=1; // установить флаг мигания
- break;
- case 6:
- a=2;
- fToggle=1; // установить флаг мигания
- break;
- case 7:
- PORTD &= ~(1<<PD0); // светодиод PD0 выключен
- fToggle=0; // снять флаг мигания
- led=0;
- break;
- }
- led++;
- //eeprom_update_byte(&eeprom_var ,led);
- }
- cCount=0;
- }
- else cCount++;
- }
- //***************************************************************
- int main (void){
- DDRB=0b11011110;
- PORTB=0b00100001;
- DDRD=0b1111111;
- PORTD=0b0000000;
- TCCR0A = 0b00000000;// нормальный режим WGM00=0; WGM01=0; WGM02=0(TCCR0B);
- TCCR0B = 0b00000011;//делитель на 256;CS02=1;CS01=0;CS00=0;
- TIMSK = 0b00000010;//TOIE0 =1 разрешение прерывания по переполнению T0
- //led= eeprom_read_byte(&eeprom_var);
- //led2= eeprom_read_byte(&eeprom_var2);
- sei();
- while (1)
- {
- if (st2())
- {
- switch(led2)
- {
- case 1:
- PORTD |=(1<<PD1);PORTB |=(1<<PB1);
- break;
- case 2:
- PORTD&=~(1<<PD1);PORTB&=~(1<<PB1);
- PORTD |=(1<<PD2);PORTB |=(1<<PB2);
- break;
- case 3:
- PORTD&=~(1<<PD2);PORTB&=~(1<<PB2);
- PORTD |=(1<<PD3);PORTB |=(1<<PB3);
- break;
- case 4:
- PORTD&=~(1<<PD3);PORTB&=~(1<<PB3);
- //eeprom_update_byte(&eeprom_var2 ,led2);
- led2=0;
- break;
- }
- led2++;
- _delay_ms(200);
- }
- }
- return (0);
- }
- //***************************************************************
Advertisement
Add Comment
Please, Sign In to add comment