//Port definitions
#define ddra ((volatile unsigned char*)0x21)
#define ddrb ((volatile unsigned char*)0x24)
#define ledout ((volatile unsigned char*)0x22)
#define select ((volatile unsigned char*)0x25)
//display function prototype
void common_anode(volatile long input);
void setup(){
*ddra=0xff;*ddrb=0x0f;
while(1)
{ for(volatile long i=0;i<9999;i++)
{
for(volatile long j=0;j<10;j++)
{
common_anode(i);
}
}
}
}
void common_anode(volatile long input)
{
volatile long i,j;
volatile char thousand,hundred,one,ten;
volatile char display[10]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90};
thousand=input/1000;
hundred=(input%1000)/100;
ten=(input%100)/10;
one=input%10;
if(thousand!=0)
{
*select=0x01;
*ledout=display[thousand];
for(i=0;i<4000;i++);
*ledout=0xff;
for(i=0;i<6000;i++);
*select=0x02;
*ledout=display[hundred];
for(i=0;i<4000;i++);
*ledout=0xff;
for(i=0;i<6000;i++);
*select=0x04;
*ledout=display[ten];
for(i=0;i<4000;i++);
*ledout=0xff;
for(i=0;i<6000;i++);
*select=0x08;
*ledout=display[one];
for(i=0;i<4000;i++);//wait till display settles
*ledout=0xff;
for(i=0;i<6000;i++);
}
else if(hundred!=0)
{
*select=0x02;
*ledout=display[hundred];
for(i=0;i<4000;i++);
*ledout=0xff;
for(i=0;i<9333;i++);
*select=0x04;
*ledout=display[ten];
for(i=0;i<4000;i++);
*ledout=0xff;
for(i=0;i<9334;i++);
*select=0x08;
*ledout=display[one];
for(i=0;i<4000;i++);
*ledout=0xff;
for(i=0;i<9333;i++);
}
else if(ten!=0)
{
*select=0x04;
*ledout=display[ten];
for(i=0;i<4000;i++);
*ledout=0xff;
for(i=0;i<16000;i++);
*select=0x08;
*ledout=display[one];
for(i=0;i<4000;i++);
*ledout=0xff;
for(i=0;i<16000;i++);
}
else{
*select=0x08;
*ledout=display[one];
for(i=0;i<4000;i++);
*ledout=0xff;
for(i=0;i<36000;i++);
}
}