#include<reg51.h>
int sem_segment[11];			//Объявляем массив кодов семисегментных индикаторов
int tsifra;				//Объявляем переменную, в которую будем помещать цифру для вывода
int chislo[10];				//Объявляем массив цифр выводимого на индикатор числа
int znakomesto,i,sec,min,chas;
long vrem,vrem_sec;
void init (void)
{
sem_segment[0]=0xfc;			//Заносим в массив коды соответствующих цифр
sem_segment[1]=0x60;
sem_segment[2]=0xda;
sem_segment[3]=0xf2;
sem_segment[4]=0x66;
sem_segment[5]=0xb6;
sem_segment[6]=0xbe;
sem_segment[7]=0xe0;
sem_segment[8]=0xfe;
sem_segment[9]=0xf6;
sem_segment[10]=0x02;			//Знак черточки
SCON=0;					//Настраиваем последовательный порт на режим регистра сдвига
TMOD=0x01;
TH0=(-10000)>>8;
TL0=-10000;
TF0=0;
TR0=1;
IE=(1<<7)|
   (1<<1);
}
void prerT0 (void) interrupt 1
{
TF0=0;
TR0=1;
vrem=vrem+1;
if (vrem==86400*8) vrem=0;
}
void vyvod (void)
{
P1=0x0f;
tsifra=chislo[znakomesto];
TF0=0; 					//Сбрасываем флаг пересылки
SBUF=sem_segment[tsifra];
while(TI==0);
for(i=24;i>0;i--)
P1=znakomesto;
}
void time (void)
{
vrem_sec=vrem/8;			//Переводим время в секунды
sec=(vrem_sec%60);			//Получаем только секунды
chislo[7]=sec%10;                       //Получаем единицы секунд
chislo[6]=sec/10;                       //Получаем десятки секунд
min=(vrem_sec/60)%60;			//Получаем только минуты
chislo[4]=min%10;			//Получаем единицы минут
chislo[3]=min/10;			//Получаем десятки минут
chas=(vrem_sec/3600);			//Получаем только часы
chislo[1]=chas%10;			//Получаем единицы часов
chislo[0]=chas/10;                      //Получаем десятки часов
}
void main (void)
{
init();					//Вызов функции init
for(;;)
{
time();
chislo[2]=10;
chislo[5]=10;
for(znakomesto=0;znakomesto<8;znakomesto++)
vyvod();
}
}

