я бы написал так:
unsigned char key, digit;
0) задание знакогенератора для семисегментного индикатора
const unsigned char SEG[] = {0b00111111, 0b00000110, 0b01101101, (ну и так далее для всех 10 цифр)};
DDRB=0x00; //порт b на вход
PORTB=0xFF; // с подтяжкой
DDRD=0xFF; // порт d на выход
PORTD=0x00;
while (1)
{
//
1) прочитать значение порта в переменную
key=PINB;
//
2) инверсия (у нас сейчас 0—нажато 1— не нажато, а привычнее наоборот)
key=~key;
//
3) применение маски чтобы затереть неиспользуемые биты (мало ли чего в них может оказаться)
key&=0b00001111; //здесь 1 должны быть на тех местах какие пины задействованы на кнопки
//
4) вычисление цифры, которую надо отобразить
switch (key)
{
case 0b00000000: digit=0; break;
case 0b00000001: digit=1; break;
case 0b00000010: digit=2; break;
case 0b00001100: digit=6; break;
// так перечислим все варианты, если установленного кнопками варианта не будет перечислено — программа оставит старую цифру
};
//
5) преобразование в код сегмента и вывод на индикатор
PORTD=SEG[digit];
};
тока за грамматику сильно не пинайте — телефон её не подсвечивает и проверить не даёт
