#include <mega8.h>
#include <delay.h>
#define ADC_VREF_TYPE 0x40 
//  кнопка №1
//  1-1011-0010101010-1101-1010110010-1-0000   // пакет 35 бит  
//  - - - - - - -код- - - - - - - -  -c-пауза
//  кнопка №2
//  1-1010-0110110100-1010-1010100110-1-0000   // пакет 35 бит  
//  - - - - - - -код- - - - - - - -  -c-пауза
//  кнопка №3
//  1-1101-0101001010-1100-1010110010-1-0000   // пакет 35 бит  
//  - - - - - - -код- - - - - - - -  -c-пауза
//  кнопка №4
//  1-1001-1011010101-0011-0011010110-1-0000   // пакет 35 бит  
//  - - - - - - -код- - - - - - - -  -c-пауза
//  АЦП №1
//  1-0101-0101010101-1010-1010101010-1-0000   // пакет 35 бит - 31дел -00011111.
//  с- №  -  -АЦП-   - и№ - и АЦП -  -c-пауза
//  ШИМ №1
//  1-1010-0101010101-0101-1010101010-1-0000   // пакет 35 бит - 31дел -00011111.
//  с- №  -  -ШИМ-   - и№ - и ШИМ -  -c-пауза
//////////////////////////////////////////////////////////////////////////////////
char a=0,u=0,b=0,y=0,w=0,e=0; // u-напряжение вход ацп №1,y-напряжение вход ацп №2
/////////////////////////////////////////////// ацп
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
delay_us(10);
ADCSRA|=0x40;
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}
/////////////////////////////////////////////// 
void main(void)
{
DDRC=0b00000000;  // вход 
PORTC.5=0;        // вход АЦП №1
PORTC.4=0;        // вход ШИМ №1
PORTC.3=1;        // вход кнопка №4
PORTC.2=1;        // вход кнопка №3
PORTC.1=1;        // вход кнопка №2
PORTC.0=1;        // вход кнопка №1
DDRD=0b11111111;  // выход индикатор
PORTD=0b00000000; // индикатор
DDRB.1=1;         // выход 
PORTB.1=1;        // выход - передатчик 
ADMUX=ADC_VREF_TYPE & 0xff; // настройка ацп
ADCSRA=0x83;
///////////////////////////////////////////// вкл 
mesto_1:
PORTD=w;
//////////////////////////////////////////// измерение АЦП №1(PC5)
read_adc(5); // вызов функции. измерение №1 PC5.
u=ADCW/16; //u=ADCW/16;-5v-00111111-63, 63/2=31  -5v-31-00011111.   
//////////////////////////////////////////// фильтр входа - гистерезис
if (u>a+1) { 
PORTD=u/2;   //+63/2=31-00011111
a=u;
    }
if (u<a-1) { 
PORTD=u/2;   //-63/2=31-00011111
a=u;
    }
//////////////////////////////////////////// передача АЦП №1      
PORTB.1=1;         //1 старт бит  "1"
delay_ms(1);
/////////////////////////////////// № АЦП №1
PORTB.1=0;   //2 бит  
delay_ms(1);
PORTB.1=1;   //3 бит
delay_ms(1);
PORTB.1=0;   //4 бит   
delay_ms(1);
PORTB.1=1;   //5 бит
delay_ms(1);
////////////////////////////////// +АЦП №1
PORTB.1=PORTD.0;   //6 бит  +1
delay_ms(1);
PORTB.1=~PORTD.0;  //7 бит
delay_ms(1);
PORTB.1=PORTD.1;   //8 бит  +2
delay_ms(1);
PORTB.1=~PORTD.1;  //9 бит
delay_ms(1);
PORTB.1=PORTD.2;   //10 бит  +3
delay_ms(1);
PORTB.1=~PORTD.2;  //11 бит
delay_ms(1);
PORTB.1=PORTD.3;   //12 бит  +4
delay_ms(1);
PORTB.1=~PORTD.3;  //13 бит
delay_ms(1);
PORTB.1=PORTD.4;   //14 бит  +5
delay_ms(1);
PORTB.1=~PORTD.4;  //15 бит
delay_ms(1);
////////////////////////////////  инверсия
PORTD=~PORTD;   
/////////////////////////////////// № -АЦП №1
PORTB.1=1;   //16 бит  
delay_ms(1);
PORTB.1=0;   //17 бит
delay_ms(1);
PORTB.1=1;   //18 бит   
delay_ms(1);
PORTB.1=0;   //19 бит
delay_ms(1);
////////////////////////////////// -АЦП №1
PORTB.1=PORTD.0;   //20 бит  -1
delay_ms(1);
PORTB.1=~PORTD.0;  //21 бит
delay_ms(1);
PORTB.1=PORTD.1;   //22 бит  -2
delay_ms(1);
PORTB.1=~PORTD.1;  //23 бит
delay_ms(1);
PORTB.1=PORTD.2;   //24 бит  -3
delay_ms(1);
PORTB.1=~PORTD.2;  //25 бит
delay_ms(1);
PORTB.1=PORTD.3;   //26 бит  -4
delay_ms(1);
PORTB.1=~PORTD.3;  //27 бит
delay_ms(1); 
PORTB.1=PORTD.4;   //28 бит  -5
delay_ms(1);
PORTB.1=~PORTD.4;  //29 бит
delay_ms(1); 
PORTB.1=1;         // стоп бит  "1"
delay_ms(1);
////////////////////////////////  инверсия
PORTD=~PORTD;   
w=PORTD;        // запись АЦП №1
//////////////////////////////// пауза 0000
PORTB.1=0;
delay_ms(4);
PORTD=e;
//////////////////////////////////////////// измерение ШИМ №1(PC4)
read_adc(4); // вызов функции. измерение №2 PC4.
y=ADCW/16; //u=ADCW/16;-5v-00111111-63, 63/2=31  -5v-31-00011111.   
//////////////////////////////////////////// фильтр входа - гистерезис
if (y>b+1) { 
PORTD=y/2;   //+63/2=31-00011111
b=y;
    }
if (y<b-1) { 
PORTD=y/2;   //-63/2=31-00011111
b=y;
    }
//////////////////////////////////////////// передача ШИМ №1     
PORTB.1=1;         //1 старт бит  "1"
delay_ms(1);
/////////////////////////////////// № ШИМ №1
PORTB.1=1;   //2 бит  
delay_ms(1);
PORTB.1=0;   //3 бит
delay_ms(1);
PORTB.1=1;   //4 бит   
delay_ms(1);
PORTB.1=0;   //5 бит
delay_ms(1);
////////////////////////////////// +ШИМ №1
PORTB.1=PORTD.0;   //6 бит  +1
delay_ms(1);
PORTB.1=~PORTD.0;  //7 бит
delay_ms(1);
PORTB.1=PORTD.1;   //8 бит  +2
delay_ms(1);
PORTB.1=~PORTD.1;  //9 бит
delay_ms(1);
PORTB.1=PORTD.2;   //10 бит  +3
delay_ms(1);
PORTB.1=~PORTD.2;  //11 бит
delay_ms(1);
PORTB.1=PORTD.3;   //12 бит  +4
delay_ms(1);
PORTB.1=~PORTD.3;  //13 бит
delay_ms(1);
PORTB.1=PORTD.4;   //14 бит  +5
delay_ms(1);
PORTB.1=~PORTD.4;  //15 бит
delay_ms(1);
////////////////////////////////  инверсия
PORTD=~PORTD;   
/////////////////////////////////// № -ШИМ №1
PORTB.1=0;   //16 бит  
delay_ms(1);
PORTB.1=1;   //17 бит
delay_ms(1);
PORTB.1=0;   //18 бит   
delay_ms(1);
PORTB.1=1;   //19 бит
delay_ms(1);
////////////////////////////////// -ШИМ №1
PORTB.1=PORTD.0;   //20 бит  -1
delay_ms(1);
PORTB.1=~PORTD.0;  //21 бит
delay_ms(1);
PORTB.1=PORTD.1;   //22 бит  -2
delay_ms(1);
PORTB.1=~PORTD.1;  //23 бит
delay_ms(1);
PORTB.1=PORTD.2;   //24 бит  -3
delay_ms(1);
PORTB.1=~PORTD.2;  //25 бит
delay_ms(1);
PORTB.1=PORTD.3;   //26 бит  -4
delay_ms(1);
PORTB.1=~PORTD.3;  //27 бит
delay_ms(1); 
PORTB.1=PORTD.4;   //28 бит  -5
delay_ms(1);
PORTB.1=~PORTD.4;  //29 бит
delay_ms(1); 
PORTB.1=1;         // стоп бит  "1"
delay_ms(1);
////////////////////////////////  инверсия
PORTD=~PORTD;   
e=PORTD;        // запись ШИМ №1
//////////////////////////////// пауза 0000
PORTB.1=0; 
delay_ms(4);
//////////////////////////////////////////// № кн
if (PINC.0==0) {  /////////////// кнопка №1
PORTB.1=1; //1
delay_ms(1);
PORTB.1=1; //2
delay_ms(1);
PORTB.1=0; //3
delay_ms(1);
PORTB.1=1; //4
delay_ms(1);
PORTB.1=1; //5
delay_ms(1);
PORTB.1=0; //6
delay_ms(1);
PORTB.1=0; //7
delay_ms(1);
PORTB.1=1; //8
delay_ms(1);
PORTB.1=0; //9
delay_ms(1);
PORTB.1=1; //10
delay_ms(1);
PORTB.1=0; //11
delay_ms(1);
PORTB.1=1; //12
delay_ms(1);
PORTB.1=0; //13
delay_ms(1);
PORTB.1=1; //14
delay_ms(1);
PORTB.1=0; //15
delay_ms(1);
PORTB.1=1; //16
delay_ms(1);
PORTB.1=1; //17
delay_ms(1);
PORTB.1=0; //18
delay_ms(1);
PORTB.1=1; //19
delay_ms(1);
PORTB.1=1; //20
delay_ms(1);
PORTB.1=0; //21
delay_ms(1);
PORTB.1=1; //22
delay_ms(1);
PORTB.1=0; //23
delay_ms(1);
PORTB.1=1; //24
delay_ms(1);
PORTB.1=1; //25
delay_ms(1);
PORTB.1=0; //26
delay_ms(1);
PORTB.1=0; //27
delay_ms(1);
PORTB.1=1; //28
delay_ms(1);
PORTB.1=0; //29
delay_ms(1);
PORTB.1=1; // стоп бит  "1"
delay_ms(1);
//////////////////////////////// коррекция пауза
PORTB.1=0;
delay_ms(4); 
};
/////////////////////////////////
if (PINC.1==0) {  /////////////// кнопка №2
PORTB.1=1; //1
delay_ms(1);
PORTB.1=1; //2
delay_ms(1);
PORTB.1=0; //3
delay_ms(1);
PORTB.1=1; //4
delay_ms(1);
PORTB.1=0; //5
delay_ms(1);
PORTB.1=0; //6
delay_ms(1);
PORTB.1=1; //7
delay_ms(1);
PORTB.1=1; //8
delay_ms(1);
PORTB.1=0; //9
delay_ms(1);
PORTB.1=1; //10
delay_ms(1);
PORTB.1=1; //11
delay_ms(1);
PORTB.1=0; //12
delay_ms(1);
PORTB.1=1; //13
delay_ms(1);
PORTB.1=0; //14
delay_ms(1);
PORTB.1=0; //15
delay_ms(1);
PORTB.1=1; //16
delay_ms(1);
PORTB.1=0; //17
delay_ms(1);
PORTB.1=1; //18
delay_ms(1);
PORTB.1=0; //19
delay_ms(1);
PORTB.1=1; //20
delay_ms(1);
PORTB.1=0; //21
delay_ms(1);
PORTB.1=1; //22
delay_ms(1);
PORTB.1=0; //23
delay_ms(1);
PORTB.1=1; //24
delay_ms(1);
PORTB.1=0; //25
delay_ms(1);
PORTB.1=0; //26
delay_ms(1);
PORTB.1=1; //27
delay_ms(1);
PORTB.1=1; //28
delay_ms(1);
PORTB.1=0; //29
delay_ms(1);
PORTB.1=1; // стоп бит  "1"
delay_ms(1);
//////////////////////////////// коррекция пауза
PORTB.1=0;
delay_ms(4); 
};
/////////////////////////////////
if (PINC.2==0) {  /////////////// кнопка №3
PORTB.1=1; //1
delay_ms(1);
PORTB.1=1; //2
delay_ms(1);
PORTB.1=1; //3
delay_ms(1);
PORTB.1=0; //4
delay_ms(1);
PORTB.1=1; //5
delay_ms(1);
PORTB.1=0; //6
delay_ms(1);
PORTB.1=1; //7
delay_ms(1);
PORTB.1=0; //8
delay_ms(1);
PORTB.1=1; //9
delay_ms(1);
PORTB.1=0; //10
delay_ms(1);
PORTB.1=0; //11
delay_ms(1);
PORTB.1=1; //12
delay_ms(1);
PORTB.1=0; //13
delay_ms(1);
PORTB.1=1; //14
delay_ms(1);
PORTB.1=0; //15
delay_ms(1);
PORTB.1=1; //16
delay_ms(1);
PORTB.1=1; //17
delay_ms(1);
PORTB.1=0; //18
delay_ms(1);
PORTB.1=0; //19
delay_ms(1);
PORTB.1=1; //20
delay_ms(1);
PORTB.1=0; //21
delay_ms(1);
PORTB.1=1; //22
delay_ms(1);
PORTB.1=0; //23
delay_ms(1);
PORTB.1=1; //24
delay_ms(1);
PORTB.1=1; //25
delay_ms(1);
PORTB.1=0; //26
delay_ms(1);
PORTB.1=0; //27
delay_ms(1);
PORTB.1=1; //28
delay_ms(1);
PORTB.1=0; //29
delay_ms(1);
PORTB.1=1; // стоп бит  "1"
delay_ms(1);
//////////////////////////////// коррекция пауза
PORTB.1=0;
delay_ms(4); 
};
/////////////////////////////////
if (PINC.3==0) {  /////////////// кнопка №4
PORTB.1=1; //1
delay_ms(1);
PORTB.1=1; //2
delay_ms(1);
PORTB.1=0; //3
delay_ms(1);
PORTB.1=0; //4
delay_ms(1);
PORTB.1=1; //5
delay_ms(1);
PORTB.1=1; //6
delay_ms(1);
PORTB.1=0; //7
delay_ms(1);
PORTB.1=1; //8
delay_ms(1);
PORTB.1=1; //9
delay_ms(1);
PORTB.1=0; //10
delay_ms(1);
PORTB.1=1; //11
delay_ms(1);
PORTB.1=0; //12
delay_ms(1);
PORTB.1=1; //13
delay_ms(1);
PORTB.1=0; //14
delay_ms(1);
PORTB.1=1; //15
delay_ms(1);
PORTB.1=0; //16
delay_ms(1);
PORTB.1=0; //17
delay_ms(1);
PORTB.1=1; //18
delay_ms(1);
PORTB.1=1; //19
delay_ms(1);
PORTB.1=0; //20
delay_ms(1);
PORTB.1=0; //21
delay_ms(1);
PORTB.1=1; //22
delay_ms(1);
PORTB.1=1; //23
delay_ms(1);
PORTB.1=0; //24
delay_ms(1);
PORTB.1=1; //25
delay_ms(1);
PORTB.1=0; //26
delay_ms(1);
PORTB.1=1; //27
delay_ms(1);
PORTB.1=1; //28
delay_ms(1);
PORTB.1=0; //29
delay_ms(1);
PORTB.1=1; // стоп бит  "1"
delay_ms(1);
//////////////////////////////// коррекция пауза
PORTB.1=0;
delay_ms(4); 
};
/////////////////////////////////
goto mesto_1;
};