Извините, я неправильно высказался, должно быть одно нажатие кнопки - переключение на следующий сегмент, а не одним нажатием кнопки запустить поочерёдное засвечивание сегментов вплоть до 7.
Извините, я неправильно высказался, должно быть одно нажатие кнопки - переключение на следующий сегмент, а не одним нажатием кнопки запустить поочерёдное засвечивание сегментов вплоть до 7.
// первая кнопка
if(!(PINC&0x01))
{
if(ap==3) // 3 1
{PORTA = 0b00001110;
ap = 1;
delay_ms(100);}
if(ap==2) // 2 0
{PORTA = 0b00001011;
ap=0;
delay_ms(100);}
if(ap==1) // 1 2
{PORTA = 0b00001101;
ap=2;
delay_ms(100);}
if(ap==0) // 0 3
{PORTA = 0b00000111;
ap=3;
delay_ms(100);}
}
Что то откопал выглядеть должно как то так.Одно нажатие в регистр А заносим число. Следующее нажатие следующее число.
В вашем случае в регистр D.
Ето следующий шаг. Подготовитье сегменты каждого числа, например, в массиве, и извлечь набор сегментов для соответствующего числа по номер.
И закодируйте светящиеся светодиоды, если возможно, сначала с карандаша на листе бумаги, без копирования 1:1. Спустя время о нем вспомините на неопределенный срок .Код:uint8_t num[11] = { //hgfedcba 0b11000000, // 0 0b11111001, // 1 ...
(частично пользуюсь переводчиком)
Здравствуйте. Не могу понять запись сравнения состояния ножки МК.
Изначально PORTB=0b00000001, на PB0 подключена кнопка на массу. При нажатии кнопки на РВ0 приходит "0" и выполняется код .
Автор ролика показывает на макете, что обе записи аналогичны и верны:
1. IF(~PINB & (1<<0));
2. IF(0==(PINB & (1<<0))); .
Во втором случае выглядит, как нажали кнопку, обнулили РВ0, " (0 & 1)==0 верно" и идёт выполнение кода ниже.
В первом случае, как нажали кнопку, (0 & 1) ==0 инвертируем, и получаем "1"... и идёт выполнение кода ниже.
Подскажите пожалуйста, где я ошибся.
Спасибо.
Первая запись. Вспоминаем о приоритете операций, (логических и арифметических) где говорится, что операция ~ (логическое НЕ) имеет приоритет над & (логическое И), и что круглые скобки круче их обоих.
Видим, что справа от & обаразуется 1, (по коду, вероятнее всего, очистится регистр r1, затем в его нулевом разряде установится бит и не сдвинется ноль раз влево) Компиляторы сейчас и не такое исправляют. Непросто, да, но единичку справа получили.
Смотрим налево, ведь для истинности всего выражения требуется, чтобы и с другой стороны оператора & появилась 1.
Учитывая инверсию, для этого необходимо, чтобы в регистре порта PINB бит 0 был сброшен (нажата кнопка). Все нолики станут единичками, и наоборот, так что вариант сработает, ага. (Главное, чтобы сопутствующая инверсия остальных битов не помешала мысли, ибо инверсия есть, а вдруг там один из выводов подключен на драйвер катапультного кресла программиста. "Не знаю, но я бы лучше ничего не трогал" как тот сапёр из анекдота.)
1 & 1 дадут 1, истина, что и требовалось
Вторая запись.
0==0 тоже истинно, что и требовалось автору для продолжения.
Получается и не было ошибки, акромя катапульты. Или я вопрос не понял?
Последний раз редактировалось ozforester; 20.09.2021 в 21:20.
Исправлюсь, ибо глупость написал, PINx регистр только для чтения, отменяется катапульта. К тому же инверсия будет происходить во временном регистре, что не повлияло бы на состояние в любом случае.. Бывает.
Еще раз кратко запись двух операций,
Код:1. IF(~PINB & (1<<0)); ~ 00000001 = 11111110 1111110 & 000000001 = 0 false ~ 0000000 => 1111111 11111111 & 000000001 = 1 true 2. IF(0==(PINB & (1<<0))); 0 == ( 00000001 & 1 ) 0 == 1 false 0 == ( 00000000 & 1 ) 0 == 0 true
Надо еще короче . (1<<0) - это маска бита 0, дальше читаем код вслух, с выражениями:
1. IF(~PINB & (1<<0))[/quote] - "если выделенный маской инверсный бит ненулевой" (то есть прямой был нулевой, кнопка нажата)
2. IF(0==(PINB & (1<<0))) - "если выделенный маской бит нулевой" - то же самое
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)