Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <avr/io.h>
- #include <avr/interrupt.h>
- #define F_CPU 9600000UL
- #include <util/delay.h>
- #include <stdlib.h>
- void abc(unsigned char a,unsigned char b,unsigned char c,unsigned char status);
- unsigned char tonight=0;
- volatile unsigned char pwm[3]={0,0,0};//здесь храним значения яркости светодиодов
- unsigned char to[3]={0,255,0};//здесь храним цвет, к которому будем стремиться.
- int main(void)
- {
- //порты PB0-2 как выходы, выключены
- DDRB |= (1<<0|1<<1|1<<2);
- PORTB&= ~(1<<0|1<<1|1<<2);
- //Инициализация таймера
- TCCR0A = 0x00;
- TCCR0B = 0x01;//No Prescaling
- TIMSK0 = 1<<TOIE0;//Прерывание по переполнению
- sei();//Глобальное разрешение прерываний
- while(1){
- if (pwm[0]<to[0]) pwm[0]++;
- if (pwm[0]>to[0]) pwm[0]--;
- if (pwm[1]<to[1]) pwm[1]++;
- if (pwm[1]>to[1]) pwm[1]--;
- if (pwm[2]<to[2]) pwm[2]++;
- if (pwm[2]>to[2]) pwm[2]--;
- if(pwm[0]<=0&&pwm[1]<=0&&pwm[2]<=0) {//to red from black
- to[0]=0; //blue
- to[1]=255; //red
- to[2]=0; //green
- };
- if(pwm[0]<=0&&pwm[1]>=255&&pwm[2]<=0) {//to green+blue
- to[0]=255; //blue
- to[1]=255; //red
- to[2]=255; //green
- };
- if(pwm[0]>=255&&pwm[1]>=255&&pwm[2]>=255) {tonight=1;}
- if(pwm[0]>=255&&pwm[1]>=255&&pwm[2]>=255&&tonight==1) {//from green+blue
- to[0]=0; //blue
- to[1]=255; //red
- to[2]=0; //green
- };
- if(pwm[0]<=0&&pwm[1]>=255&&pwm[2]<=0&&tonight==1) {//from red to black
- to[0]=0; //blue
- to[1]=0; //red
- to[2]=0; //green
- };
- if(pwm[0]<=0&&pwm[1]<=0&&pwm[2]<=0) {tonight=0;}
- _delay_ms(50);
- }
- }
- ISR(TIM0_OVF_vect)
- {
- static unsigned char e = 0;
- if( e == 255)
- {
- e=0;
- PORTB |= (1<<0)|(1<<1)|(1<<2);
- }
- abc(pwm[0],pwm[1],pwm[2],e);
- ++e;
- }
- void abc(unsigned char a,unsigned char b,unsigned char c,unsigned char status) {
- if((status==a)) PORTB&= ~(1<<0);
- if((status==b)) PORTB&= ~(1<<1);
- if((status==c)) PORTB&= ~(1<<2);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement