Обсуждаем контроллеры компании Atmel.
Ответить

Re: Подключение нескольких кнопок к ATmga8A

Пн май 29, 2017 10:24:29

1. Ваш код трудночитаемый. Не отформатирован, выложен без тега, ... Не каждый захочет сидеть и тратить время на разбор и подсчёт скобок.
2. Вы изначально выбрали неверный подход к реализации. Я же Вам давал ссылку на тему, там есть чего ухватить для себя.

Re: Подключение нескольких кнопок к ATmga8A

Пн май 29, 2017 11:33:04

давай разжую, а ты в код облачай:
1) прочитать значение порта в переменную
2) инверсия (у нас сейчас 0—нажато 1— не нажато, а привычнее наоборот)
3) применение маски чтобы затереть неиспользуемые биты (мало ли чего в них может оказаться)
4) вычисление цифры, которую надо отобразить (сдесь используй свитч—кейс)
5) преобразование в код сегмента и вывод на индикатор
0) задание знакогенератора для семисегментного индикатора (это массив констант, описывающих выводимые на индикатор цифры).

Re: Подключение нескольких кнопок к ATmga8A

Пн май 29, 2017 14:58:48

Не проверял.
Спойлер
Код:
#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;
      }
}

Re: Подключение нескольких кнопок к ATmga8A

Пн май 29, 2017 17:41:03

здесь кнопки имеют приоритет и не позволяют делать комбинации (или позволяют но надо много условий писать и последовательность соблюдать), а ТС уже пишет про цифру 6 при нажатии пары кнопок

Re: Подключение нескольких кнопок к ATmga8A

Пн май 29, 2017 17:42:28

Не читал полностью ветку.

Re: Подключение нескольких кнопок к ATmga8A

Пн май 29, 2017 21:43:08

я бы написал так:
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];
};
тока за грамматику сильно не пинайте — телефон её не подсвечивает и проверить не даёт :)
Ответить