Переписал код, вытащив все из главного тела. Работает, но фиксированную задержку не могу поставить, все цифры невозможно разглядеть становится.
Косяк тут выявляется
- Код: Выделить всё
void print()
{
for (i=1; i<10000; i++)
{
print_n(i);
delay_ms(50); //ВОТ ТУТ! ЕСЛИ УБРАТЬ ЗАДЕРЖКУ ВСЕ НОРМ!
}
}
Схемы нет, все на макетке.. Если поможет.
Индикаторы с общим анодом, сегменты подключены так:
C0 b
C1 a
C2 f
C3 c
C4 d
C5 e
D7 g
Аноды соответственно:
A4
A5
A6
A7
- Код: Выделить всё
#include <mega16.h> //Âêëþ÷àåì áèáëèîòåêó äëÿ ðàáîòû ñ ìèêðîêîíòðîëëåðîì ATMega16
#include <delay.h> //Âêëþ÷àåì áèáëèîòåêó äëÿ îðãàíèçàöèè çàäåðæåê
int i,a, x1,x10, disp;
unsigned char segment[10]= {
// gedcfab gedcfab
0b1000000, 0b1110110, //0,1
0b0001100, 0b0100100, //2,3
0b0110010, 0b0100001, //4,5
0b0000001, 0b1110100, //6,7
0b0000000, 0b0100000 //8,9
};
void cifra(int z)
{
PORTC=0xFF; // Ïîäòÿíóòü ïîðò C ê 1
PORTD=0xFF; // Ïîäòÿíóòü ïîðò D ê 1
PORTC = segment[z];
PORTD.7 = PORTC.6;
delay_ms(1);
}
void print_n(int n)
{
PORTA.4 = 1;PORTA.5 = 0;PORTA.6 = 0;PORTA.7 = 0; cifra(n%10); n = n/10;
PORTA.4 = 0;PORTA.5 = 1;PORTA.6 = 0;PORTA.7 = 0; cifra(n%10); n = n/10;
PORTA.4 = 0;PORTA.5 = 0;PORTA.6 = 1;PORTA.7 = 0; cifra(n%10); n = n/10;
PORTA.4 = 0;PORTA.5 = 0;PORTA.6 = 0;PORTA.7 = 1; cifra(n%10);
}
void initialization()
{
DDRD=0xFF; // Âñå ïîðòû D - âûõîäû
DDRC=0xFF; // Âñå ïîðòû C - âûõîäû
DDRA=0xFF; // Âñå ïîðòû A - âûõîäû
PORTA=0x00; // Ïîäòÿíóòü ïîðò A ê 0
PORTC=0xFF; // Ïîäòÿíóòü ïîðò C ê 1
PORTD=0xFF; // Ïîäòÿíóòü ïîðò D ê 1
}
void print()
{
for (i=1; i<10000; i++)
{
print_n(i);
delay_ms(50); //ВОТ ТУТ! ЕСЛИ УБРАТЬ ЗАДЕРЖКУ ВСЕ НОРМ!
}
}
void main(void)
{
initialization();
while(1)
{
print();
}
}