2. Вы изначально выбрали неверный подход к реализации. Я же Вам давал ссылку на тему, там есть чего ухватить для себя.
Подключение нескольких кнопок к ATmga8A
1. Ваш код трудночитаемый. Не отформатирован, выложен без тега, ... Не каждый захочет сидеть и тратить время на разбор и подсчёт скобок.
2. Вы изначально выбрали неверный подход к реализации. Я же Вам давал ссылку на тему, там есть чего ухватить для себя.
2. Вы изначально выбрали неверный подход к реализации. Я же Вам давал ссылку на тему, там есть чего ухватить для себя.
- Реклама
давай разжую, а ты в код облачай:
1) прочитать значение порта в переменную
2) инверсия (у нас сейчас 0—нажато 1— не нажато, а привычнее наоборот)
3) применение маски чтобы затереть неиспользуемые биты (мало ли чего в них может оказаться)
4) вычисление цифры, которую надо отобразить (сдесь используй свитч—кейс)
5) преобразование в код сегмента и вывод на индикатор
0) задание знакогенератора для семисегментного индикатора (это массив констант, описывающих выводимые на индикатор цифры).
1) прочитать значение порта в переменную
2) инверсия (у нас сейчас 0—нажато 1— не нажато, а привычнее наоборот)
3) применение маски чтобы затереть неиспользуемые биты (мало ли чего в них может оказаться)
4) вычисление цифры, которую надо отобразить (сдесь используй свитч—кейс)
5) преобразование в код сегмента и вывод на индикатор
0) задание знакогенератора для семисегментного индикатора (это массив констант, описывающих выводимые на индикатор цифры).
Для тех, кто не учил магию мир полон физики 
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Не проверял.
Спойлер
Код: Выделить всё
#include <avr/io.h>
#define Seg_0 0b0111111; //0
#define Seg_1 0b0000110; //1
#define Seg_2 0b1011011; //2
#define Seg_3 0b1001111; //3
#define Seg_8 0b1111111; //8
#define butt1 (1<<PB0)
#define butt2 (1<<PB1)
#define butt3 (1<<PB2)
#define butt4 (1<<PB3)
//*****************************************8
int main(void)
{
DDRD=0xFF;
while(1)
{
uint8_t captch_B=PINB;
uint8_t out_P=Seg_0;
if (!(captch_B & butt1)) out_P=Seg_1;
if (!(captch_B & butt2)) out_P=Seg_2;
if (!(captch_B & butt3)) out_P=Seg_3;
if (!(captch_B & butt4)) out_P=Seg_8;
PORTD=out_P;
}
}
здесь кнопки имеют приоритет и не позволяют делать комбинации (или позволяют но надо много условий писать и последовательность соблюдать), а ТС уже пишет про цифру 6 при нажатии пары кнопок
Для тех, кто не учил магию мир полон физики 
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Не читал полностью ветку.
- Реклама
я бы написал так:
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];
};
тока за грамматику сильно не пинайте — телефон её не подсвечивает и проверить не даёт
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];
};
тока за грамматику сильно не пинайте — телефон её не подсвечивает и проверить не даёт
Для тех, кто не учил магию мир полон физики 
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...



