Спойлер
Код: Выделить всё
.EQU ImpLen=0xCE4 ; длина импульса (0x0C)
.EQU OneLen=0xCE4 ; длина паузы для единицы (0x0C)
.EQU NulLen=0x19C8 ; длина паузы для нуля (0x19)
;******************************************************************************************************
;-------------------------------------------------------------------------------------------------
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: ; здесь кодируем импульс для бита
ROL temp ; двигаем байт влево (циклический сдвиг влево)
RCALL send_bit ; подпрограмма отправки нашего бита данных!
dec R18 ; уменьшим счетчик бит на передачу
brne byte_loop
dec R17 ; уменьшим счетчик байт для передачи
brne keybuffer_loop
; ---------------------------------------------------------------------------------------------
; здесь формируем посылку для бита четности
; здесь фактически код для формирования одного бита
COM R21 ; побитная инверся????????????????????????????????????????????
ROR R21 ; двигаем байт вправо (циклический сдвиг вправо)
RCALL send_bit ; подпрограмма отправки нашего бита четности
ret ; конец подпрограммы подготовки данных на отправку
; --------------------------------------------------------------------------------------------------
; А НИЖЕ ТА САМАЯ ПОДПРОГРАММА КОТОРАЯ ГОТОВИТ ОТПРАВКУ ОДНОГО БИТА
;
; подпрограмма подготовки одного бита для отправки --------------------------------------
send_bit:
; команды LDI не меняют состояния флага "С" - который мы выставили
; до входа в подпрограмму
ldi r19,high(ImpLen) ; зададим фиксированную длительность импульса
st z+,r19
ldi r19,low(ImpLen)
;st z+,r19 ////////////////////////////////////////////////////////////////////
ldi xl,low(Nullen) ; длительность для передачи нуля
ldi xh,high(Nullen)
; вот здесь мы реагируем на флаг "С" который установили до входа в
; подпрограмму, он не изменился после команд LDI которые были
; исполнены до него !
brcc send_nullen ; если "С"=0 то записываем нулевую длительность
ldi xl,low(onelen) ; длительность для передачи единицы
ldi xh,high(onelen)
inc R21 ; передаем единицу - увеличим счетчик
send_nullen:
st z+,xh ; сохраним в буфере на передачу
;st z+,xl ////////////////////////////////////////////////////////////////////
ret ; возврат из подпрограммы
;------------------------------------------------------------------------------------------------------------------а можно вот так
Спойлер
Код: Выделить всё
.EQU ImpLen=0xCE4 ; длина импульса (0x0C)
.EQU OneLen=0xCE4 ; длина паузы для единицы (0x0C)
.EQU NulLen=0x19C8 ; длина паузы для нуля (0x19)
;******************************************************************************************************
;-------------------------------------------------------------------------------------------------
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: ; здесь кодируем импульс для бита
ROL temp ; двигаем байт влево (циклический сдвиг влево)
RCALL send_bit ; подпрограмма отправки нашего бита данных!
dec R18 ; уменьшим счетчик бит на передачу
brne byte_loop
dec R17 ; уменьшим счетчик байт для передачи
brne keybuffer_loop
; ---------------------------------------------------------------------------------------------
; здесь формируем посылку для бита четности
; здесь фактически код для формирования одного бита
COM R21 ; побитная инверся????????????????????????????????????????????
ROR R21 ; двигаем байт вправо (циклический сдвиг вправо)
RCALL send_bit ; подпрограмма отправки нашего бита четности
ret ; конец подпрограммы подготовки данных на отправку
; --------------------------------------------------------------------------------------------------
; А НИЖЕ ТА САМАЯ ПОДПРОГРАММА КОТОРАЯ ГОТОВИТ ОТПРАВКУ ОДНОГО БИТА
;
; подпрограмма подготовки одного бита для отправки --------------------------------------
send_bit:
; команды LDI не меняют состояния флага "С" - который мы выставили
; до входа в подпрограмму
ldi r19,high(ImpLen) ; зададим фиксированную длительность импульса
st z+,r19
;ldi r19,low(ImpLen) ////////////////////////////////////////////////////////////////////
;st z+,r19 ////////////////////////////////////////////////////////////////////
;ldi xl,low(Nullen) ; //////////////////////////////////////////////////////////////////
ldi xh,high(Nullen) ; длительность для передачи нуля
; вот здесь мы реагируем на флаг "С" который установили до входа в
; подпрограмму, он не изменился после команд LDI которые были
; исполнены до него !
brcc send_nullen ; если "С"=0 то записываем нулевую длительность
;ldi xl,low(onelen) ; //////////////////////////////////////////////////////////////////
ldi xh,high(onelen) ; длительность для передачи единицы
inc R21 ; передаем единицу - увеличим счетчик единиц для проверки кратности...
send_nullen:
st z+,xh ; сохраним в буфере на передачу
;st z+,xl ////////////////////////////////////////////////////////////////////
ret ; возврат из подпрограммы
;------------------------------------------------------------------------------------------------------------------

