Илектронный циферблат с 4мя 7ми-сегментными цифрами (в будущем будет часами) реализую с помощью динамики в IAR следующим образом:
Код
#define byte unsigned char
#define dynIndexingTime 20000
#define MaxValue 50
#define CharCodeBusDDR DDRB
#define CharCodeBus PORTB
#define kathodBusDDR DDRD
#define kathodBus PORTD
void my_putChar(byte ind);
byte charTable(byte ind);
byte N1,N10,N100,N1000;
int main( void )
{
int counter,ind;
CharCodeBusDDR=0xFF;
kathodBusDDR=0x0F;
kathodBus=0xFE;
N1=0;
N10=0;
N100=0;
N1000=0;
counter=0;
ind=0;
for(;;)
{
counter++;
if (counter > MaxValue)
{
counter=0;
N1++;
if (N1>9) { N1=0; N10++; }
if (N10>9) { N10=0; N100++; }
if (N100>9) { N100=0; N1000++; }
if (N1000>9){ N1000=0; }
}
if (ind==4) ind=0;
my_putChar(ind++);
__delay_cycles(dynIndexingTime); // Wait
kathodBus=~((~kathodBus)<<1);
if (kathodBus==0xEF) kathodBus=0xFE;
}
}
void my_putChar(byte ind) //ind->index "0" -> N1,singles '1'->N10,decades '2'->N100,hundreds '3'->N1000,thousands
{
if (ind==0) CharCodeBus =charTable(N1);
else if (ind==1) CharCodeBus =charTable(N10);
else if (ind==2) CharCodeBus =charTable(N100);
else if (ind==3) CharCodeBus =charTable(N1000);
}
byte charTable(byte ind)
{
switch(ind)
{
case 0: return 0x3F;
case 1: return 0x06;
case 2: return 0x5B;
case 3: return 0x4F;
case 4: return 0x66;
case 5: return 0x6D;
case 6: return 0x7D;
case 7: return 0x07;
case 8: return 0x7F;
case 9: return 0x6F;
}
return 0x01;
}
#define dynIndexingTime 20000
#define MaxValue 50
#define CharCodeBusDDR DDRB
#define CharCodeBus PORTB
#define kathodBusDDR DDRD
#define kathodBus PORTD
void my_putChar(byte ind);
byte charTable(byte ind);
byte N1,N10,N100,N1000;
int main( void )
{
int counter,ind;
CharCodeBusDDR=0xFF;
kathodBusDDR=0x0F;
kathodBus=0xFE;
N1=0;
N10=0;
N100=0;
N1000=0;
counter=0;
ind=0;
for(;;)
{
counter++;
if (counter > MaxValue)
{
counter=0;
N1++;
if (N1>9) { N1=0; N10++; }
if (N10>9) { N10=0; N100++; }
if (N100>9) { N100=0; N1000++; }
if (N1000>9){ N1000=0; }
}
if (ind==4) ind=0;
my_putChar(ind++);
__delay_cycles(dynIndexingTime); // Wait
kathodBus=~((~kathodBus)<<1);
if (kathodBus==0xEF) kathodBus=0xFE;
}
}
void my_putChar(byte ind) //ind->index "0" -> N1,singles '1'->N10,decades '2'->N100,hundreds '3'->N1000,thousands
{
if (ind==0) CharCodeBus =charTable(N1);
else if (ind==1) CharCodeBus =charTable(N10);
else if (ind==2) CharCodeBus =charTable(N100);
else if (ind==3) CharCodeBus =charTable(N1000);
}
byte charTable(byte ind)
{
switch(ind)
{
case 0: return 0x3F;
case 1: return 0x06;
case 2: return 0x5B;
case 3: return 0x4F;
case 4: return 0x66;
case 5: return 0x6D;
case 6: return 0x7D;
case 7: return 0x07;
case 8: return 0x7F;
case 9: return 0x6F;
}
return 0x01;
}
Результаты в Proteusе не соответствуют ожидаемым. Подскажите пжста в чем проблема, может какие настройки специальные в Proteusе или напутал чего?
Благодарю зарание !
Hex File
Proteus 7 file
Извиняюсь за Rapidshare, не мог втыкнуть по другому.