#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/eeprom.h>
unsigned char display_on, registr, butt1,butt2,butt3, butt3s, zamer,rezhim,mode,param,params, edit, redit, blink, wait2, wait3, wait5, wait6, wait7, rdisp, encoder_r, encoder_l, right, left, prewmode;
unsigned char ind[4],tempvar, tempmem;
float measureint, voltage_ADC,tmp;
unsigned int stop_h, stop_m, pwm_d, measure, pmeasure;
int pwm,tempch;
unsigned char param1[10];
unsigned char param1eeprom[10] EEMEM;
uint16_t tempset,measure; uint16_t tem EEMEM;
unsigned char pwm_m[455] EEMEM;
ISR (TIMER0_OVF_vect)
{
if(display_on==1)
{
PORTB |= (1 << PB6); PORTD |= (1 << PD7); PORTD |= (1 << PD3); PORTC |= (1 << PC2);
PORTB &=~ (1 << PB0);
PORTC &=~ (1 << PC1);
PORTD &=~ (1 << PD4);
PORTD &=~ (1 << PD2);
PORTD &=~ (1 << PD5);
PORTB &=~ (1 << PB7);
PORTD &=~ (1 << PD6);
}
if(display_on==37)
{
if(ind[registr]==0 || ind[registr]==6 || ind[registr]==9) {display_on=display_on+20;}
if(ind[registr]==2 || ind[registr]==3 || ind[registr]==5 || ind[registr]=='P') {display_on=display_on+25;}
if(ind[registr]==4 || ind[registr]=='g') {display_on=display_on+35;}
if(ind[registr]==7) {display_on=display_on+40;}
if(ind[registr]==1) {display_on=display_on+45;}
if(ind[registr]=='-') {display_on=display_on+50;}
if(registr==0) { PORTB &=~ (1 << PB6);}
if(registr==1) { PORTD &=~ (1 << PD3);}
if(registr==2) { PORTC &=~ (1 << PC2);}
if(registr==3) { PORTD &=~ (1 << PD7);}
if (ind[registr]==0) {PORTB |= (1 << PB0);PORTC |= (1 << PC1);PORTD |= (1 << PD4);PORTD |= (1 << PD2);PORTD |= (1 << PD5);PORTB |= (1 << PB7);}
if (ind[registr]==1) {PORTD |= (1 << PD2);PORTD |= (1 << PD5);}
if (ind[registr]==2) {PORTB |= (1 << PB0);PORTD |= (1 << PD4);PORTD |= (1 << PD2);PORTB |= (1 << PB7); PORTD |= (1 << PD6);}
if (ind[registr]==3) {PORTD |= (1 << PD4);PORTD |= (1 << PD2);PORTD |= (1 << PD5);PORTB |= (1 << PB7); PORTD |= (1 << PD6);}
if (ind[registr]==4) {PORTC |= (1 << PC1);PORTD |= (1 << PD2);PORTD |= (1 << PD5);PORTD |= (1 << PD6);}
if (ind[registr]==5) {PORTC |= (1 << PC1);PORTD |= (1 << PD4);PORTD |= (1 << PD5);PORTB |= (1 << PB7); PORTD |= (1 << PD6);}
if (ind[registr]==6) {PORTB |= (1 << PB0);PORTC |= (1 << PC1);PORTD |= (1 << PD4);PORTD |= (1 << PD5);PORTB |= (1 << PB7); PORTD |= (1 << PD6);}
if (ind[registr]==7) {PORTD |= (1 << PD4);PORTD |= (1 << PD2);PORTD |= (1 << PD5);}
if (ind[registr]==8) {PORTB |= (1 << PB0);PORTC |= (1 << PC1);PORTD |= (1 << PD4);PORTD |= (1 << PD2);PORTD |= (1 << PD5);PORTB |= (1 << PB7); PORTD |= (1 << PD6);}
if (ind[registr]==9) {PORTC |= (1 << PC1);PORTD |= (1 << PD4);PORTD |= (1 << PD2);PORTD |= (1 << PD5);PORTB |= (1 << PB7); PORTD |= (1 << PD6);}
if (ind[registr]=='P') {PORTB |= (1 << PB0);PORTC |= (1 << PC1);PORTD |= (1 << PD4);PORTD |= (1 << PD2);PORTD |= (1 << PD6);}
if (ind[registr]=='g') {PORTC |= (1 << PC1);PORTD |= (1 << PD4);PORTD |= (1 << PD2); PORTD |= (1 << PD6);}
if (ind[registr]=='-') {PORTD |= (1 << PD6);}
if (ind[registr]=='F') {PORTB |= (1 << PB0);PORTC |= (1 << PC1);PORTD |= (1 << PD4); PORTD |= (1 << PD6);}
if (ind[registr]=='n') {PORTB |= (1 << PB0);PORTD |= (1 << PD5); PORTD |= (1 << PD6);}
registr++;
if (registr>3){registr=0;}
}
display_on++;
if (display_on>100){display_on=1;blink++; if(blink>250){blink=0;} ADCSR |= (1<<ADSC);}
if(blink==250){wait2++; if(wait2>250){wait2=0;}}
if(wait2==250){wait3++; if(wait3>250){wait3=251;}; butt3s++; if(butt3s>250){butt3s=251;}; wait5++;wait6++;}
if(wait3==3 && mode==1){mode=0;}
if(wait5==20){wait5=0;}
if(wait5==51){wait5=0;}
if(wait5==50){wait6++; if(wait6==250){wait6=0;};if(wait6==param1[3]){rezhim=0;}}
}
void init_pwm (void)
{
TCCR1A|=(1<<COM1A0);
TCCR1A|=(1<<COM1A1);
TCCR1B|=(1<<CS10);
TCCR1A|=(1<<WGM11);
TCCR1B|=(1<<WGM13);
OCR1A=27000;
ICR1=27000;
}
ISR (ADC_vect)
{
voltage_ADC = voltage_ADC+ADCW;
if (zamer==100)
{
measureint=voltage_ADC/zamer;
measure=measureint*param1[2]/100;
if(rezhim==1)
{
if(mode==0)
{
if(param1[0]>0) {ind[0]=measure/100;ind[1]=measure%100/10;ind[2]=measure%10;ind[3]='g';}
if(param1[0]==0)
{
if(tempset<100){ind[0]=-1;} else {ind[0]=tempset/100;}
if(tempset<10) {ind[1]=-1;} else {ind[1]=tempset%100/10;}
ind[2]=tempset%10;ind[3]='g';
}
}
if(mode==1)
{
if(blink<170)
{if(tempset<100){ind[0]=-1;} else {ind[0]=tempset/100;}
if(tempset<10) {ind[1]=-1;} else {ind[1]=tempset%100/10;}
ind[2]=tempset%10;ind[3]='g';
}
if(blink>170){ind[0]=-1;ind[1]=-1;ind[2]=-1;ind[3]=-1;}
}
}
if(tempmem==0)
{
if(wait5==10)
{
if(tempch==0 && tempset==measure && eeprom_read_byte(&pwm_m[tempset])!=pwm)
{eeprom_write_byte(&pwm_m[tempset],pwm); tempmem=1; ind[0]='g';ind[1]='g';ind[2]='g';}
if(tempset!=measure)
{
pwm_d=tempset-measure;
pwm=pwm+pwm_d;
}
wait5=0;tempch=0;
}
if(pmeasure<measure && tempset<measure)
{
pwm_d=measure-tempset; tempch++;
pwm=pwm-pwm_d;
pmeasure=measure;
}
if(pmeasure>measure && tempset>measure)
{
pwm_d=tempset-measure; tempch++;
pwm=pwm+pwm_d*measure/100;
pmeasure=measure;
}
}
if(wait5==10 && tempmem==1)
{
if(tempset<measure){pwm=pwm-1;}
if(tempset>measure){pwm=pwm+1;}
if(tempset==measure && eeprom_read_byte(&pwm_m[tempset])>pwm && eeprom_read_byte(&pwm_m[tempset])-pwm>5){eeprom_write_byte(&pwm_m[tempset],pwm);}
if(tempset==measure && eeprom_read_byte(&pwm_m[tempset])>pwm && eeprom_read_byte(&pwm_m[tempset])-pwm>5){eeprom_write_byte(&pwm_m[tempset],pwm);}
wait5=0;
if(tempset==measure && tempmem==1 && (int)(voltage_ADC*param1[2]/100)%zamer<50){tmp=tmp-10;}
if(tempset==measure && tempmem==1 && (int)(voltage_ADC*param1[2]/100)%zamer>50){tmp=tmp+10;}
}
if(pwm>250){pwm=250;} if(pwm<0){pwm=0;}
if(tempset-10>measure && tempmem==1){OCR1A=0;wait5=0;wait6=0;} else {OCR1A=27000+tmp-pwm*108;}
voltage_ADC=0;zamer=0;
}
zamer++;
if (rezhim!=1) {OCR1A=27000;}
if (measure>480) {OCR1A=27000;rezhim=0;OCR1A=27000;}
}
int main(void)
{
TIMSK |= (1 << TOIE0);
TCCR0|=(0<<CS02)|(1<<CS00);
init_pwm();
ADMUX|= (1<<REFS0);
ADCSRA |= (1<<ADEN) | (1<<ADSC) | (1<<ADIE) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);
sei();
PORTB=0b00000000; PORTC=0b00101000; PORTD=0b00000001;
DDRB=0b11111111; DDRC=0b11010110; DDRD=0b11111110;
butt1=0;butt2=0;butt3=0;rezhim=0;mode=0;params=0;edit=0;redit=0;blink=0;tempmem=0;tempch=0;
encoder_l=40; encoder_r=0; right=0; left=0;butt3s=0;wait3=0;wait2=0;mode=0;prewmode=0;pwm_d=0;
tempset = eeprom_read_word(&tem); if(tempset>500){tempset=100;}
param1[0] = eeprom_read_byte(¶m1eeprom[0]); if(param1[0]>1){param1[1]=1;}
param1[1] = eeprom_read_byte(¶m1eeprom[1]); if(param1[1]>10){param1[1]=5;}
param1[2] = eeprom_read_byte(¶m1eeprom[2]); if(param1[2]>250){param1[2]=75;}
param1[3] = eeprom_read_byte(¶m1eeprom[3]); if(param1[3]>250){param1[3]=10;}
pwm=eeprom_read_byte(&pwm_m[tempset]); if (pwm<255){tempmem=1;}
while (1)
{
if(tempset<100){tempset=100;} if(tempset>450){tempset=450;}
if ((PINC&(1<<PC5))==0x00){butt1++; if(butt1>200){butt1=201;}} else {butt1=0;}
if(butt1==200 && rezhim==0){butt3s=0; rezhim=1; butt1=201;}
if(butt1==200 && rezhim==1){butt3s=0; rezhim=0; butt1=201;}
if(butt1==200) {butt3s=0;}
if (butt1==201 && butt3s==2 && rezhim!=2){rezhim=2;butt3s=10;}
if (butt1==201 && butt3s==2 && rezhim==2){rezhim=0;butt3s=10;}
if ((PIND&(1<<PD0))==0x00){butt2++; if(butt2>encoder_l){butt2=encoder_l+1;}} else {butt2=0;}
if ((PINC&(1<<PC3))==0x00){butt3++; if(butt3>encoder_l){butt3=encoder_l+1;}} else {butt3=0;}
if(right==1 || left==1){right=0; left=0;}
if(encoder_r==0)
{
if(butt2==encoder_l+1 && butt3==encoder_l) {encoder_r=encoder_l*5;mode=1;wait3=0;right=1;}
if(butt3==encoder_l+1 && butt2==encoder_l) {encoder_r=encoder_l*5;mode=1;wait3=0;left=1;}
}
if(encoder_r==0){encoder_r=1;} encoder_r--;
if(mode!=prewmode){prewmode=mode; eeprom_write_word(&tem, tempset);}
if(rezhim==0)
{
if(blink<170){ind[0]=-1; ind[1]=-1; ind[2]=-1; ind[3]=-1;}
if(blink>170){ind[0]='-'; ind[1]='-'; ind[2]='-'; ind[3]='-';}
}
if(rezhim==1)
{
if(right==1) {tempset=tempset+param1[1];pwm=eeprom_read_byte(&pwm_m[tempset]); if (pwm<255){tempmem=1;tmp=0;}else{tempmem=0;pwm=1;tmp=0;} }
if(left==1){tempset=tempset-param1[1];pwm=eeprom_read_byte(&pwm_m[tempset]); if (pwm<255){tempmem=1;tmp=0;}else{tempmem=0;pwm=1;tmp=0;} }
}
if(rezhim==2)
{
if(butt1==200){if(edit==0){edit=1;tempvar=-1;} else {edit=0; eeprom_write_byte(¶m1eeprom[params], param1[params]);} }
if(edit==0)
{
ind[0]='P'; ind[1]=params; ind[2]=-1; ind[3]=-1;
if(right==1){params++;}; if(left==1){params--;}
if(params<0){params=0;}; if(params>3){params=3;}
}
if(edit==1)
{
if(blink==1 || tempvar!=param1[params])
{
if(param1[params]<100){ind[0]=-1;} else {ind[0]=param1[params]/100;}
if(param1[params]<10) {ind[1]=-1;} else {ind[1]=param1[params]%100/10;}
ind[2]=param1[params]%10;
}
if(blink>170){ind[0]=-1;ind[1]=-1;ind[2]=-1;ind[3]=-1;}
tempvar=param1[params];
if(right==1){param1[params]++;};if(left==1){param1[params]--;}
if(param1[params]<0){param1[params]=0;} if(param1[params]>250){param1[params]=1;}
if(params==0) {if(param1[params]<0){param1[params]=0;} if(param1[params]>1){param1[params]=1;}}
if(params==1) {if(param1[params]<1){param1[params]=1;} if(param1[params]>50){param1[params]=50;}}
if(params==2) {if(param1[params]<0){param1[params]=0;} if(param1[params]>250){param1[params]=250;}}
if(params==3) {if(param1[params]<0){param1[params]=0;} if(param1[params]>250){param1[params]=250;}}
}
}
}
}
<剧透/>