Что делает программа: постоянно в режиме реального времени выводит значение на четырехразрядный семисегментник. Каждая цифра выставляется отдельно с помощью переменников через ацп. МК атмега-328п
Спасибо.
Код: Выделить всё
#define F_CPU 8000000
#include <avr/io.h>
#include <util/delay.h>
//#include <avr/interrupt.h>
unsigned char razryad = 1;
int adc = 0;
int z1 = 0;
int z2 = 0;
int z3 = 0;
int z4 = 0;
void log()
{
short zyfra[] =
{
0b00111111, //0
0b00000110, //1
0b01011011, //2
0b01001111, //3
0b01100110, //4
0b01101101, //5
0b01111101, //6
0b00000111, //7
0b01111111, //8
0b01101111 //9
};
if (adc <= 102) { PORTD = zyfra[0];} else {
if ((adc > 102)&&(adc <=204)) { PORTD = zyfra[1];} else {
if ((adc > 204)&&(adc <=306)) { PORTD = zyfra[2];} else {
if ((adc > 306)&&(adc <=408)) { PORTD = zyfra[3];} else {
if ((adc > 408)&&(adc <=510)) { PORTD = zyfra[4];} else {
if ((adc > 510)&&(adc <=612)) { PORTD = zyfra[5];} else {
if ((adc > 612)&&(adc <=714)) { PORTD = zyfra[6];} else {
if ((adc > 714)&&(adc <=816)) { PORTD = zyfra[7];} else {
if ((adc > 816)&&(adc <=918)) { PORTD = zyfra[8];} else {
if ((adc > 918)&&(adc <=1023)) { PORTD = zyfra[9];}
}
}
}
}
}
}
}
}
}
}
void timer () // инициалияция таймера 0;
{
TCCR0A = 0b00000010; // режим подсчета импульсов (сброс при совпадении);
TCCR0B = 0b00000100; // установка режима тактирования - тактовый генератор CLK/256;
TIMSK0 = 0b00000010; // разрешение прерывания при совпадении с А ;
OCR0A = 50; // счетный регистр;
}
void ACP ()
{
ADMUX = 0b01001111; // источник опорного напряжения - напряжение питания, аналоговые входы подключить на землю
ADCSRA = 0b10000110; // включить ацп, делитель частоты 64
}
ISR( TIMER0_COMPA_vect)
{
asm("cli");
switch (razryad)
{
case 1:
ADMUX = 0b01000000;
ADCSRA = 0b11000110; //запускаем преобразование
ADCSRA = 0b10000110; // завершаем преобразование
adc = ADCW;
PORTB =~0b00000001;
log();
z1 = PORTD;
break;
case 2:
ADMUX = 0b01000001;
ADCSRA = 0b11000110; //запускаем преобразование
ADCSRA = 0b10000110; // завершаем преобразование
adc = ADCW;
PORTB =~0b00000010;
log();
z2 = PORTD;
break;
case 3:
ADMUX = 0b01000010;
ADCSRA = 0b11000110; //запускаем преобразование
ADCSRA = 0b10000110; // завершаем преобразование
adc = ADCW;
PORTB =~0b00000100;
log();
z3 = PORTD;
break;
case 4:
ADMUX = 0b01000011;
ADCSRA = 0b11000110; //запускаем преобразование
ADCSRA = 0b10000110; // завершаем преобразование
adc = ADCW;
PORTB =~0b00001000;
log();
z4 = PORTD;
break;
asm("sei");
}
razryad++;
if (razryad > 4)
{razryad = 1;}
}
void preset(){ //инициализация портов;
DDRD = 0b11111111;
PORTD = 0b11111111;
DDRB = 0b11111111;
PORTB = 0b00000000;
DDRC = 0b00000000;
}
int main(void)
{ preset();
timer();
ACP();
asm("sei");
while(1)
{
while(1)
{
asm("nop");
if (z1 == 109) {break;}
}
//на PORTD.7 устанавливается 1
}
} 