Ср фев 20, 2019 16:42:54
Ср фев 20, 2019 16:43:18
Неправильно мыслите. Размер не "от 1 до n", а просто "n"СКАЗОЧНИК писал(а):Размер от 1 до n, а элементы от 0 до n-1. Не логично
Как вариант - сдвигать дальше на 1 и считать сдвиги.СКАЗОЧНИК писал(а):Как узнать на какой позиции в первых четырех битах стоит единица?
Ср фев 20, 2019 16:46:33
Ср фев 20, 2019 16:47:53
У размера нет начала или конца, он просто есть сам по себе - одно число, по сути - количество элементов.СКАЗОЧНИК писал(а):Я имею ввиду, что начало размера не от нуля. )
int orig_num = 0x4000;
// Вместо сдвига >> 12 и вычисления позиции единицы (2):
if (orig_num & 0x8000) {
// Сразу делаем то, что собирались с вычисленной позицией 3
} else if (orig_num & 0x4000) {
// Сразу делаем то, что собирались с вычисленной позицией 2
} else if (orig_num & 0x2000) {
// Сразу делаем то, что собирались с вычисленной позицией 1
} else if (orig_num & 0x1000) {
// Сразу делаем то, что собирались с вычисленной позицией 0
}
Ср фев 20, 2019 17:45:30
unsigned long int stroka = 0;
temp = (((~(GPIOB->IDR)) & 0xF000) >> 12); // считать первую строку и двинуть ее в начало слова
while ((temp & 1) != 0)
{
temp >>= 1;
stroka++;
}
stolbetz = 0;
Ср фев 20, 2019 18:08:00
unsigned long int stroka = 0;
int stroka = 0;
Ср фев 20, 2019 18:16:51
viiv писал(а):Ситуации, когда не установлен ни один из четырех битов регистра, не может быть?
viiv писал(а):Ситуации, когда установлены несколько из четырех бит регистра, не может быть?
Ср фев 20, 2019 20:35:38
// подаем на все столбцы нули, а строки делаем входами с подтяжкой
DDR(PORT_KBD) = ALL_COL;
PORT(PORT_KBD) = ALL_ROW;
// запоминаем инверсное значение состояния строк
rows = (~PIN(PORT_KBD)) & ALL_ROW;
// делаем столбцы входами с подтяжкой, а на строки подаем запомненное значение с инверсией
DDR(PORT_KBD) = ALL_ROW;
PORT(PORT_KBD) = ~rows;
// запоминаем инверсное значение состояния столбцов
cols = ~PIN(PORT_KBD) & ALL_COL;
// отключаем порт
DDR(PORT_KBD) = 0;
// если строки и столбцы ненулевые
if(cols && rows) cols |= rows;
else cols = 0;
// теперь в cols имеем код, однозначно соответствующий нажатым кнопкам, можно делать с ним, что угодно
Ср фев 20, 2019 22:35:25
СКАЗОЧНИК писал(а):Я просто пока мало еще понимаю, что в памяти займет больше места и что по быстродействию будет лучше
СКАЗОЧНИК писал(а):Ищу красивый оптимальный вариант.
Чт фев 21, 2019 03:02:12
ARV писал(а): за 6 обращений к регистрам порта
Чт фев 21, 2019 05:28:26
при таком опросе нельзя сразу несколько кнопок нажимать - программа их не сможет различить...ARV писал(а):за 6 обращений к регистрам порта
Чт фев 21, 2019 05:38:07
Чт фев 21, 2019 06:45:34
насколько я вкурсе, такую логику никто ранее не применял а она проста.СКАЗОЧНИК писал(а):Есть, где такая логика еще расписана другим языком?
теперь вы видите, что сможет? во всяком случае до тех пор, пока это позволяет схема матрицы кнопок без развязывающих диодов.Ivanoff-iv писал(а):при таком опросе нельзя сразу несколько кнопок нажимать
Чт фев 21, 2019 07:03:25
Чт фев 21, 2019 07:04:57
поясните - я как-то с утра не понял вашу мысль... видимо, кофе еще не подействовал.Ivanoff-iv писал(а):такой алгоритм правильней, если клавиатура без разделительных диодов, то на ней не сделать замыкания лог 1 и лог 0, в отличии от варианта с построчным опросом...
Чт фев 21, 2019 07:14:00
Чт фев 21, 2019 07:15:45
при ограниченном количестве кнопок, что вполне себе норма для встраиваемых устройств, это требуется не так уж и редко. вы вспомните клавиатуру компьютера - не смотря на изобилие кнопок все равно постоянно требуется нажатие по 2 и даже 3 кнопки одновременно! реально больше 2 кнопок - уже очень неудобно в эксплуатацииСКАЗОЧНИК писал(а):я пытаюсь придумать, зачем мне нажимать сразу несколько кнопок на клавиатуре?
Чт фев 21, 2019 07:16:38
Чт фев 21, 2019 07:19:48
и что? этот способ выдет "скан-коды", а смысловое значение каждого скан-кода - это задча более верхнего уровня ПО. и делать это можно уже не в прерывании, а где нужно, и где можно не жалеть тактов на обработку.СКАЗОЧНИК писал(а):А вот код кнопки же, который получен подобным образом не соответствует точно значению на клавиатуре.
#define KEY_1 0b00100010
Чт фев 21, 2019 07:23:15
ARV писал(а):дефайном соответствие скан-кода символу,