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>
- unsigned char led = 1;
- unsigned char led2 = 1;
- volatile unsigned char old,now,btn,old1,now1,btn1;
- //***************************************************************
- unsigned char st(){ // проверяет нажатие кнопки PD1
- btn=0;
- now=PIND& (1<<PD1); // текущее состояние кнопки PD1
- if ((now==0) && (old!=0)) btn=1; // если кнопка нажата
- old=now;
- return btn;
- }
- //***************************************************************
- unsigned char st2()// проверяет нажатие кнопки PD2
- {
- btn1=0;
- now1=PIND & (1<<PD2); // текущее состояние кнопки PD2
- if ((now1==0) && (old1!=0)) btn1=1; // если кнопка нажата
- old1=now1;
- return btn1;
- }//***************************************************************
- // Процедура прерывания по переполнению таймера 0
- #define OVF 8 // периодичность выполнения процедуры прерывания, mS
- ISR (TIMER0_OVF_vect){
- static unsigned char fToggle,cCount;
- static unsigned int uiCount;
- //******************************//
- //*** МИГАНИЕ СВЕТОДИОДА PD0 ***//
- //******************************//
- if (fToggle==1){ // если установлен флаг мигания
- if (uiCount<500/8){ // в течение первого полупериода 1 Гц 250*8
- PORTD |= (1<<PD0); // светодиод PD0 включен
- }
- else if (uiCount<1000/8){ // в течение второго полупериода 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:
- fToggle=1; // установить флаг мигания
- break;
- case 3:
- PORTD &= ~(1<<PD0); // светодиод PD0 выключен
- fToggle=0; // снять флаг мигания
- led=0;
- break;
- }
- led++;
- }
- cCount=0;
- }
- else cCount++;
- }
- //***************************************************************
- int main (void){
- DDRA=0b00;
- PORTA=0b11;
- DDRB=0b11111111;
- PORTB=0b00000000;
- DDRD=0b11111001;
- PORTD=0b00000110;
- TCCR0A = 0b00000000;// нормальный режим WGM00=0; WGM01=0; WGM02=0(TCCR0B);
- TCCR0B = 0b00000100;//делитель на 256;CS02=1;CS01=0;CS00=0;
- TIMSK = 0b00000010;//TOIE0 =1 разрешение прерывания по переполнению T0
- sei();
- while (1)
- {
- if (st2())
- {
- switch(led2)
- {
- case 1:
- PORTB |= (1<<PB0)|(1<<PB3);
- break;
- case 2:
- PORTB &= ~((1<<PB0)|(1<<PB3));
- PORTB |= (1<<PB1)|(1<<PB4);
- break;
- case 3:
- PORTB &= ~((1<<PB1)|(1<<PB4));
- PORTB |= (1<<PB2)|(1<<PB5);
- break;
- case 4:
- PORTB &= ~((1<<PB2)|(1<<PB5));
- //PORTD &= ~(1<<PD0);
- //fToggle=0;
- led2=0;
- break;
- }
- led2++;
- _delay_ms(200);
- }
- }
- return (0);
- }
- //***************************************************************
Advertisement
Add Comment
Please, Sign In to add comment