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

Обсуждаем контроллеры компании Atmel.
Ответить
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

1. Ваш код трудночитаемый. Не отформатирован, выложен без тега, ... Не каждый захочет сидеть и тратить время на разбор и подсчёт скобок.
2. Вы изначально выбрали неверный подход к реализации. Я же Вам давал ссылку на тему, там есть чего ухватить для себя.
Контактная информация:
Реклама
Друг Кота
Аватара пользователя
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

давай разжую, а ты в код облачай:
1) прочитать значение порта в переменную
2) инверсия (у нас сейчас 0—нажато 1— не нажато, а привычнее наоборот)
3) применение маски чтобы затереть неиспользуемые биты (мало ли чего в них может оказаться)
4) вычисление цифры, которую надо отобразить (сдесь используй свитч—кейс)
5) преобразование в код сегмента и вывод на индикатор
0) задание знакогенератора для семисегментного индикатора (это массив констант, описывающих выводимые на индикатор цифры).
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Не проверял.
Спойлер

Код: Выделить всё

#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;
		}
}
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Друг Кота
Аватара пользователя
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

здесь кнопки имеют приоритет и не позволяют делать комбинации (или позволяют но надо много условий писать и последовательность соблюдать), а ТС уже пишет про цифру 6 при нажатии пары кнопок
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Реклама
Эиком - электронные компоненты и радиодетали
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

Не читал полностью ветку.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Сообщение Ivanoff-iv »

я бы написал так:
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];
};
тока за грамматику сильно не пинайте — телефон её не подсвечивает и проверить не даёт :)
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Реклама
Ответить

Вернуться в «AVR»