#include<reg51.h>
int sem_segment[10];		//Объявляем массив кодов 7-сегментных индикаторов
int tsifra;			//Объявляем переменную, в которыую будем помещать цифру для вывода
int chislo[10];			//Объявляем массив цифр для вывода на индикатор
int temp,SkanCode=0xFF;		//Объявляем переменные для работы с клавиатурой
int znakomesto, i;
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;
SCON=0;					//Настраиваем последовательный порт на режим регистра сдвига
}
void obrab (void)
{
switch (SkanCode)
{
case 0xB3: chislo[1]=1; break;
case 0x73: chislo[3]=2; break;
case 0xB4: chislo[3]=3; break;
default: ;
P0=chislo[3];
}
}
void indikat (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 !=(znakomesto+0xf0))
SkanCode=temp;				//Если хоть одна кнопка нажата, запомнить скан-код              	 
}
void main (void)
{
init();
for (;;)
{
for(znakomesto=0;znakomesto<7;znakomesto++)
indikat();
obrab();
}
}

