Ну да.. тупишь немного

не обижайся, просто опыта мало...
для начала я бы не заморачивался на передачу и прием а оптимизировал то что у тебя есть.. заодно и лучше себя чувствовать в асме начнешь, в нем очень много полезных команд

например почитай про команды битового сдвига !
ИТАК,
для начала нужно придумать алгоритм опроса клавиатуры и генерации кода нажатой кнопки..
например, если клавиатура не подразумевает одновременного нажатия нескольких кнопок, то нет большого смысла в передачи 20-битного состояния клавиатуры, и можно запросто ограничиться отправкой просто кода нажатой кнопки.. (это вопрос к задаче !!)
Далее, конечно нужно менять процедуру отправки, отправлять вашим кодом это издевательство над контроллером, да и потеря ценного процессорного ресурса:
Код: Выделить всё
ldi Temp,0b00000000 ;Temp=0
ldi Temp1,0b10000000 ;Temp1=1
ldi Temp2,2 ;Temp2=2
rcall startbit ;стартовые биты
METKA2key20: ;ВТОРАЯ МЕТКА
out PortB,Temp ;9/17
rcall Delay ;задержка
out PortB,Temp1 ;10/18
rcall Delay ;задержка
out PortB,Temp ;11/19
rcall Delay ;задержка
out PortB,Temp1 ;12/20
rcall Delay ;задержка
out PortB,Temp ;13/21
rcall Delay ;задержка
out PortB,Temp ;14/22
rcall Delay ;задержка
out PortB,Temp ;15/23
rcall Delay ;задержка
out PortB,Temp ;16/24
rcall Delay ;задержка
налицо в вашем коде передача по битам, бог с ними со стартовыми битами, но остальное ?!
почему бы не сделать передачу байта через сдвиг?
например, по вашему могло бы получиться:
Код: Выделить всё
sendByteProc: // процедура отправки байта
LDI loopVar=8 // количество битов на передачу
OutLoopProc:
OUT PortB, OutByte // ОutByte - это регистр содержащий байт для отправки
LSL OutByte // сдвинем байт на отправку на 1у позицию влево
RCALL Delay // сделаем задержку
DEC loopVar // проверим все ли биты передали:
BRNE OutLoopProc // не все? - циклимся
RET // выход
теперь чтобы передать байт вам не нужно вручную дергать ногой.. достаточно засунуть байт в регистр OutByte (сами выбирайте какой использовать) и вызвать sendByteProc
причем не переживайте что мы выводим байт в порт B целиком, там все равно кроме линий клавиатуры (так я понял устройство вашего передатчика) ничего нет, и мы их в момент передачи не используем..
насколько сократиться ваш код предлагаю вам убедиться самостоятельно (попробуйте модифицировать код сами)
p.s. сразу предупреждаю что все что мы сейчас пишем в реальном кодере использовано не будет

но для тренировки ваших мозгов этот код-тренировка необходимы
кстати, задание на дом:
как модифицировать код чтения клавиатуры чтобы было и коротко и просто ?
подсказка
выбирать линию для чтения клавиатуры можно примерно так:
Код: Выделить всё
LDI loopVar, <количество линий клавиатуры>
LDI temp, 0b00000001 // первая линия клавиатуры для чтения
...
Loop:
....
LSL temp - сдвиг...
...
DEC loopVar
BRNE Loop
в идеале, после работы процедуры опроса клавиатуры вы должны получить 5 байт, каждый это состояние одной линии клавиатуры, засуньте их в массив в ОЗУ