вот что начесалВитГо писал(а):и разве руки не чешутся засунуть код в подпрограмму и сделать его вызов через RCALL ?
Спойлер
Код: Выделить всё
ldi R21,0 ; это будет счетчик единичек в передаче @@@ ДОБАВЛЕНО @@@
ldi zl,low(transmit_buff) ; зададим адрес начала буфера передачи в ОЗУ
ldi zh,high(transmit_buff)
ldi yl,low(key_buff) ; зададим адрес начала буфера прочитанных кнопок
ldi yh,high(key_buff)
ldi R17,5 ; количество байт для передачи
keybuffer_loop:
ld temp,y+ ; прочитаем байт для передачи
ldi r18,8 ; количество бит в байте для передачи
byte_loop: ; здесь кодируем импульс для бита
rcall pulse_duration ; Вызов подпрограммы //////////////////////////////////////
ROL temp ; двигаем байт влево
brcc send_nullen ; если "С"=0 то записываем нулевую длительность
rcall duration_unit ; Вызов подпрограммы //////////////////////////////////////
inc R21 ; передаем единицу - увеличим счетчик @@@ ДОБАВЛЕНО @@@
send_nullen:
rcall write_data_to_the_RAM
dec R18 ; уменьшим счетчик бит на передачу
brne byte_loop
dec R17 ; уменьшим счетчик байт для передачи
brne keybuffer_loop
; ---------------------------------------------------------------------------------------------
; здесь формируем посылку для бита четности
; здесь фактически код для формирования одного бита
; здесь кодируем импульс для бита
rcall pulse_duration ; Вызов подпрограммы //////////////////////////////////////
; здесь в R21 число единичек
ROR R21 ; двигаем байт вправо
brcs send_bitchetn ; если "С" установлен значит нечетное число единиц у нас
rcall duration_unit ; Вызов подпрограммы //////////////////////////////////////
send_bitchetn:
rcall write_data_to_the_RAM
;-----------------------------------------------------------------------------------------------------------
;
;
; а вот и подпрограммы (3 штуки)
;************************
pulse_duration: ; здесь задаем длительность для передачи импульса
; и для передачи нуля
; (хотя можно было сделать индивидуально для каждого)
ldi r19,high(ImpLen) ; зададим фиксированную длительность импульса
st z+,r19
ldi r19,low(ImpLen)
st z+,r19
ldi xl, low(Nullen) ; длительность для передачи нуля
ldi xh, high(Nullen)
ret
;************************
duration_unit: ; здесь задаем длительность для передачи единицы
ldi xl,low(onelen) ; длительность для передачи единицы
ldi xh,high(onelen)
ret
;*************************
write_data_to_the_RAM: ; здесь будем записывать длительности в ОЗУ
st z+,xh ; сохраним в буфере на передачу
st z+,xl
ret
;*************************


