Чтобы не заморачиваться с примером допустим будем снимать значения с ацп и выводить их(типовый вольтметр), суть остается та же.
Верхний предел 5в, в таком случае на 1 преобразование приходится 0,0048в. Пускай мы получили после преобразования 512, что есть 512*0,0048 = 2,46в(нас это устраивает).
Вот это число и нужно вывести на три разряда последовательно.
Взял немного готового кода:
Код: Выделить всё
void delay(unsigned int p)
{
unsigned int i;
for(i=0;i<p;i++){asm("NOP");}
}
void seg7(unsigned char c, unsigned char s)
{
unsigned char t=0;
switch(c%10) // выбор сегментов (катодов)
{
// gcPdeafb
case 0 : {t=0b11000000;} break;
case 1 : {t=0b11111001;} break;
case 2 : {t=0b10100100;} break;
case 3 : {t=0b10110000;} break;
case 4 : {t=0b10011001;} break;
case 5 : {t=0b10010010;} break;
case 6 : {t=0b10000010;} break;
case 7 : {t=0b11111000;} break;
case 8 : {t=0b10000000;} break;
case 9 : {t=0b10010000;} break;
}
RB1 = 0;
RB2 = 0;
RB3 = 0;
switch(s) // выбор анода
{
case 1 :{ RB1 = 1;}break;
case 2 :{ RB2 = 1;}break;
case 3 :{ RB3 = 1;}break;
}
PORTD = t;
if(c>9){
PORTD=t&0b01111111;
}
}
void main (void)
{
int i,v;
unsigned int M,D; // множитель и детитель
init();
vn=0;
M=10; // множитель
D=20; // детитель
while(1)
{
// GODONE=1; // Устанавливаем бит GO для того что бы сделать опрос АЦП
// while(GODONE){}
// v=ADRESL; // читаем младший байт с АЦП
// i=ADRESH; // читаем старший байт с АЦП (а именно 2 байта с него)
// i=i*256;
// v=v+i; // складываем младщий и старший байт с АЦП
// v=v*M;
// v=(int)v/D;
// v=(int)v%1000;
v = 2.46*100;
v1=v/100;
v=v%100;
v2=v/10;
v3=v%10;
delay(10000);
}
}
Код: Выделить всё
void interrupt pwm_int(void) // общая процедура прерывания
{
if(T0IF) // при переполнение TMR1
{
vn++;
switch(vn)
{
case 1:seg7(v1,1);break; //сегмент 1
case 2:seg7(v2,2);break; //сегмент 2
case 3:{seg7(v3,3);vn=0;}break; //сегмент 3
}
TMR0=100;
T0IF=0; // сбрасываем флаг
}
}
После него идут следующие строки:
Код: Выделить всё
v = 2.46*100;
v1=v/100;
v=v%100;
v2=v/10;
v3=v%10;
delay(10000);
Код: Выделить всё
if(c>9){
PORTD=t&0b01111111;
}Спойлер
Точка у символа загорается, если с больше 9, значение на индикатор выводиться всё равно будет, т.е. будет выводиться только младший разряд, остальное всё отбрасываться (например: 19, 39 = 9. ).
Ну и результат работы соответственно:

Помогите пожалуйста до конца разобраться с семисегментной индикацией. Заранее спасибо.


