#include<reg51.h>
int sem_segment[16];			//Объявляем массив кодов семисегментных индикаторов
int tsifra;				//Объявляем переменную, в которую будем помещать цифру для вывода
int chislo[8];				//Объявляем массив цифр выводимого на индикатор числа
int znakomesto,i,j=0,otp,razr=1,sec,min,chas;
unsigned int sekunda, vrem_sec;
int temp,SkanCode;
char set;				//Признак входа в режим настройки
int mode=0;				//Режим настройки

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]=0x00;			//Ничего не выводится на индикатор
sem_segment[11]=0xee;			//Код символа "А"
sem_segment[12]=0x9c;			//Код символа "С"
sem_segment[13]=0x9e;			//Код символа "Е"
sem_segment[14]=0x1e;			//Код символа "t"
sem_segment[15]=0xce;			//Код символа "P"
SCON=0;					//Настраиваем последовательный порт на режим регистра сдвига
}

void vyvod (void)
{
P1=0xff;				//Все единицы на Р1 => дешифратор не включает ни одного индикатора
tsifra=chislo[znakomesto];		//Берем цифру для вывода 
TF0=0;					//Сбрасываем флаг окончания передачи
if ((znakomesto==1)||(znakomesto==3)) 
SBUF=sem_segment[tsifra]+1;
else SBUF=sem_segment[tsifra];		//Пересылаем код цифры для отображения
while(T1==0);
P1=znakomesto+0xf0;			//очередного знакоместа
temp=P1;				//Прочитать состояние кнопок в переменную временного хранения
for(i=7;i>0;i--);			//Задержка времени для индикации
if (temp==otp) razr=1;                  //Если предыдущая нажатая кнопка отпущена, разрешить считывание следующей
if((temp !=(znakomesto+0xf0))&&(razr==1))
{
SkanCode=temp;				//Если хоть одна кнопка нажата, запомнить скан-код 
otp=znakomesto+0xf0;                    //Заносим код кнопки, которую нужно проверить на отпускание
razr=0;                                 //запретить повторное считывание нажатой кнопки
}
}

void key_enter (void)
{
switch (SkanCode)
{
case 0xB3: {chislo[j]=1; j=j+1;SkanCode=0;} break;
case 0x73: {chislo[j]=2; j=j+1;SkanCode=0;} break;
case 0xB4: {chislo[j]=3; j=j+1;SkanCode=0;} break;
case 0x74: {chislo[j]=4; j=j+1;SkanCode=0;} break;
case 0xB5: {chislo[j]=5; j=j+1;SkanCode=0;} break;
case 0x75: {chislo[j]=6; j=j+1;SkanCode=0;} break;
case 0xB0: {chislo[j]=7; j=j+1;SkanCode=0;} break;
case 0x70: {chislo[j]=8; j=j+1;SkanCode=0;} break;
case 0xB1: {chislo[j]=9; j=j+1;SkanCode=0;} break;
case 0x71: {chislo[j]=0; j=j+1;SkanCode=0;} break;
default: ;
}
}


void indikat (void)
{
for(znakomesto=0;znakomesto<7;znakomesto++)
vyvod();
}

void main (void)
{
init();					//Вызов функции init
for(;;)
{
indikat();
if (j<6) key_enter();
else j=0;
}
}
