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(){ // проверяет нажатие кнопки PC0 Там ничего сложного.
- //Сначала нужно снять флаг нажатия : btn=0;
- //Затем берется текущее значение кнопки: now=PINC& (1<<PC0);
- //и проверяется это текущее состояние now и состояние, которое было в прошлый раз old:
- //если текущее состояние - ноль, а в прошлый раз состояние было не равно нулю (т.е. единица), то очевидно, что кнопка нажата, т.е. произошел переход из единицы в ноль - отрицательный фронт. Значит, ставим флаг нажатия btn=1, который можно проверить в дальнейшем коде.
- //И в заключение нужно перезаписать переменную old значением переменной now. Т.е. текущее нынешнее состояние кнопки становится предыдущим для следующей проверки.
- //Вот и все.
- btn=0;
- now=PINC& (1<<PC0); // текущее состояние кнопки PC0
- if ((now==0) && (old!=0))
- btn=1; // если кнопка нажата
- old=now;
- return btn;
- }
- //***************************************************************
- unsigned char st2()
- {
- btn1=0;
- now1=PINC& (1<<PC1); // текущее состояние кнопки PC1
- 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;
- //******************************//
- //*** МИГАНИЕ СВЕТОДИОДА PC2 ***//
- //******************************//
- if (fToggle==1){ // если установлен флаг мигания
- if (uiCount<375/OVF){ // в течение первого полупериода 2 Гц
- PORTC |= (1<<PC2); // светодиод PD0 включен
- }
- else if (uiCount<750/OVF){ // в течение второго полупериода 2 Гц
- PORTC &= ~(1<<PC2); // светодиод PD0 выключен
- }
- else uiCount=0;
- uiCount++;
- }
- //***********************************//
- //*** ПРОВЕРКА НАЖАТИЯ КНОПКИ PC0 ***//
- //***********************************//
- if (cCount>(15/OVF)){ // выполняется с периодичностью 25 mS
- if (st()){
- // если кнопка PC0 нажата
- switch(led)
- {
- case 1:
- PORTB=0;
- PORTC |= (1<<PC2); // включить светодиод PC2
- fToggle=0;
- PORTB|= 0x06; // снять флаг мигания
- break;
- case 2:
- PORTB=0;
- PORTB|= 0x5B;
- fToggle=1; // установить флаг мигания
- break;
- case 3:
- PORTB=0;
- PORTB|= 0x4F;
- PORTC &= ~(1<<PC2); // светодиод PB0 выключен
- fToggle=0; // снять флаг мигания
- led=0;
- break;
- case 4:
- PORTB=0;
- //PORTB|= 0x4F;
- //PORTC &= ~(1<<PC2); // светодиод PB0 выключен
- //fToggle=0; // снять флаг мигания
- //led=0;
- break;
- }
- led++;
- }
- cCount=0;
- }
- else cCount++;
- }
- ISR(TIMER1_OVF_vect)
- {}
- //***************************************************************
- int main (void){
- DDRC|=(1<<PC2)|(1<<PC3)|(1<<PC4)|(1<<PC5);
- DDRC&=~((1<<PC0)|(1<<PC1));
- PORTC|=(1<<PC0)|(1<<PC1);
- PORTC&= ~ ((1<<PC2)|(1<<PC3)|(1<<PC4)|(1<<PC4)|(1<<PC5));
- DDRD=0b11111111;
- DDRB=0b11111111;
- PORTD=0x00;
- PORTB=0x00;
- TCCR0 = 0b00000100;
- TCCR1A = 0b00000000;
- TCCR1B|=1<<CS11;
- TIMSK|=(1<<TOIE0)|(1<<TOIE1);
- //asm("sei");
- sei();
- while (1)
- {
- if (st2())
- {
- switch(led2)
- {
- case 1:
- PORTD=0;
- PORTD|= 0x06;
- PORTC |= (1<<PC3);
- break;
- case 2:
- PORTD=0;
- PORTD|=0x5B;
- PORTC &= ~(1<<PC3);
- PORTC |= (1<<PC4);
- break;
- case 3:
- PORTD=0;
- PORTD|= 0x4F;
- PORTC &= ~(1<<PC4);
- PORTC|= (1<<PC5);
- break;
- case 4:
- //PORTD=0;
- //PORTD|= 0x4F;
- PORTC &= ~(1<<PC5);
- PORTD=0;
- //PORTB &= ~(1<<PB0);
- // if(fToggle=1){
- // PORTB &= ~(1<<PB0);}
- led2=0;
- break;
- }
- led2++;
- _delay_ms(200);
- }
- }
- return (0);
- }
- //***************************************************************
Advertisement
Add Comment
Please, Sign In to add comment