Прошу совета, может горожу грабли, вдруг есть способ более быстрый.
Как можно максимально быстро по двум байтам сделать число в 1 байт?
То-есть 1 порт у меня постоянно в прерывании сдвигается "Rotate Portkn , Left", по другому порту у меня срабатывает прерывание по изменению фронта "Rising".
Когда прерывание по фронту срабатывает, я получаю значение порта вывода и значение порта входа - как их быстро объеденить, чтоб к примеру получить число 0-255?
Сработать на две кнопки не может, каждый байт равен 1 биту (1,2,4,8,32,64,128), в голову не лезет наиболее простой способ объединить это всё - (1,2,4,8,32,64,128) + (1,2,4,8,32,64,128) = уникальный 8 битный код.
На всякий случай выложу свой код (Xmega) клавиатуры + 5 светодиодов - используются 7 бит 1 корта и 8 бит другого:
Portkn Alias Portd 'Порт перебора для клавиатуры
Config Portkn = Output
Config Xpin = Portd , Slewrate = Enabled 'Задерка скорости вывода порта
Pinkn Alias Pinc 'Порт входа сработанной кнопки
Config Portc = Input 'Порт входа сработанной кнопки на вход
Config Xpin = Pinc , Outpull = Pulldown , Slewrate = Enabled , Sense = Rising 'Вход порта сработанной кнопки подтчягиваем к минусу, ограничиваем скорость и определяем срабатывать по спаду
Portc_int0mask = &B0111_1111 'Маска прерывания INT0 порта C
Ledkn Alias Portc.7 'Выход порта для динамичной индикации на клавиатуре
Config Ledkn = Output
Config Xpin = Portc.7 , Invertio = Enabled , Outpull = Totem , Sense = Inp_disabled 'Инвертируем, двухтактный вход, прерывание отключено
Dim Knl As Byte 'Адрес выхода сработанной кнопки
Dim Knh As Byte 'Адрес входа сработанной кнопки
Dim Led As Byte 'биты светодиодов динамичной индикации
Dim Ledtm As Byte 'Перебор битов в динамичной индикации
Portkn = 128
Config Tcf0 = Normal , Prescale = 256 'Таймер динамичной индикации и опроса кнопок
Tcf0_per = 200 'Период сразабывания динамично индикации и опроса кнопок
On Tcf0_ovf Knopkitm 'Прерывание по таймеру для динамичной индикации и перебора кнопок
Enable Tcf0_ovf
On Portc_int0 Knopki 'Прерывание при сработанной кнопке
Enable Portc_int0
Enable Interrupts
Led=&b1111111_0
Do
If KnL>0 And Knh>0 Then
Portc_intflags.0 = 1 'Сбрасываем прерывание перед включением прерывания по срабатыванию кнопки
Enable Portc_int0 'Включаем прерывание срабатывания нажатой кнопки
End If
Loop
Knopkitm: 'Прерывание по таймеру - вывод индикации и перебор кнопок
Rotate Portkn , Left 'Сдвигаем порт на 1 бит в сторону
Ledkn = Led.ledtm 'Включаем светодиод
If Ledtm < 7 Then 'Перебираем биты в переменной LED для включения нужного светодиода
Incr Ledtm
Else
Ledtm = 0
End If
Return
Knopki: 'Прерывание если сработала кнопка
Disable Portc_int0 'Отключаем прерывание по срабатыванию кнопок (его запустит то, что обработает кнопку)
Knl = Pinkn 'Запоминаем порт
Knh = Portkn 'Запоминаем Запоминаем порт перебора
Portc_intflags.0 = 1 'Сбрасываем буфер прерывания от остаточного дребезга
ReturnОтредактировано Ev3658 (2018-01-18 14:26:18)


.



