Код: Выделить всё
btfss C_imp,0 ; проверяем 0-й бит счётчика, если
; он = 0 - посылаем низкий уровень,
goto Send_LL ; который у нас всегда одинаковой длины
;--- если передали 31 имп-с (т.е. должны перед. 32-й) - передача окончена
movlw .32
xorwf C_imp,0
btfss Status,2 ; если флаг Z установился - пропускаем переход
; к передаче высокого уровня и завершаем передачу
goto Send_HH
;-------------------
Send_end
clrf INTCON ; сбрасываем все прерывания и флаги
call Pause ; выдерживаем паузу
goto Scan ; переходим к сканированию клавиш
;--- посылаем высокий уровень ---
Send_HH
movf INDF,0 ; читаем передаваемый байт
andwf Nbit,0 ; "И" передаваемого байта с указ.передаваем. бита
btfss Status,2 ; если Z=1 - в передаваемом байте, в поз.Nbit у нас 0
goto Send_H1
;--- загружаем длит-ть высокого уровня, соответствующую нулевому биту ---
Send_H0
movlw Th0
movwf TMR0 ; загружаем Th0 в TMR0
goto Next
;--- загружаем длит-ть низкого уровня, соответствующую единичному биту ---
Send_H1
movlw Th1
movwf TMR0 ; загружаем Th1 в TMR0
Next incf C_imp,1 ; увеличить счётчик импульсов
bcf Status,0 ; сбросить флаг переноса
rlf Nbit,1 ; сдвинуть указатель передаваемого бита
btfss Status,0 ; если С=1 - ещё раз сдв.влево указ.бита и увелич.FSR
goto Next2
rlf Nbit,1
incf FSR,1
Next2 bsf INTCON,7 ; разрешить немаскированные прерывания
goto Hlevel
;--------------------
Send_LL
movlw Tl
movwf TMR0 ; загрузить Th в TMR0
incf C_imp,1 ; увеличить счётчик импульсов
bsf INTCON,7 ; разрешить немаскированные прерывания
goto Llevel
Код: Выделить всё
Tl equ .236 ; 255-длительность низкого уровня
Th1 equ .218 ; 255-длительность высокого уровня 1-го бита
Th0 equ .236 ; 255-длительность высокого уровня 0-го бита
Tsl equ .236 ; 255-длит-ть низкого уровня в старт. последов-ти
Tsh equ .180 ; 255-длит-ть высокого уровня в старт. последов-ти
Код: Выделить всё
;--- Настраиваем предделитель таймера ---
movlw b'00000100'; настройка предделителя 1:32, 32*256=8,192 мс