НПО Системы Безопасности
(499)340-94-73 График работы:
ПН-ПТ: 10:00-19:00
СБ-ВС: выходной

Главная » Периодика » Безопасность

0 ... 114115116117118119120 ... 159


КОПИРОВАНИЕ БИТОВ ИЗ ОДНОГО РЕГИСТРА В ДРУГОЙ

Ниже представлен быстрый способ копирования битов одного регистра в другой.

movf Source w xorwf Destination, w andlw Bxxxxxxxx

, Замена одного x на 1, чтобы

, скопировать соответствующий бит

xorwf

Destination f

ПРЕОБРАЗОВАНИЕ ПОЛУБАЙТА В КОД ASCII

Наиболее очевидный способ преобразования полубайта в код ASCII заключается в следуюхцем:

NybbletoASCII addwf PCL, f

0123456789ABCDEF

Есть и другой способ:

NybbletoASCII

addlw btfsc

addlw addlw retu rn

0x036

STATUS, DC

0 - 6

Добавление содержимого полубайта к PCL

Возврат кода ASCII через таблицу

Преобразование полубайта регистра w в ASCII Добавление 6 к значению Если бит десятичного переноса установлен, это знаки от А

до ..Р"

Добавление разницы между 9 и

Возврат ASCII-кода цифры в регистр W

ПРЕОБРАЗОВАНИЕ БАЙТА КОДА ASCII В ШЕСТНАДЦАТЕРИЧНЫЙ ПОЛУБАЙТ

Преобразование кода ASCII в шестнадцатеричный полубайт можно вы полнить следующим образом.

Поскольку старший полубайт кода ASCII-символов от «А» до «Е» на 1 больше, чем старший полубайт кода символов от О до 9, след)-ет добавить разность кодов, чтобы получился результат 0x000 -OxOOF.

ASCIItoNybble addlw ОхОСО

Если символы от А до F , устанавливается флаг переноса



btfss STATUS, С

addlw 7 ; Добавление разности между 9

, и А-

addlw 9

return , Возврат значения ASCII-кода

, цифры в регистр W

Использование знаков кода ASCII, отличных от 0-9 и A-F, приведет к неправильным результатам.

ИСПОЛЬЗОВАНИЕ ВХОДА TOCKI В КАЧЕСТВЕ ИСТОЧНИКА ПРЕРЫВАНИЯ

Следующая программа сбрасывает таймер TMRO при поступлении положительного фронта сигнала на вывод TOCKI:

movlw В11000000 ; Сначала задается тактирование таймера

option , частотой командных циклов

movlw В1 1100000 , Вывод TOCKI определяется как источник

; сигнала

clrf TMRO , Загрузка в таймер TMRO кода OxOFF

decf TMRO, f

option , Разрешение тактирования таймера

, от внешнего сигнала btfsc TMfiO, 1 , Ожидание переднего фронта сигнала

goto $ - 1

Этот код также может использоваться в Р1С-микроконтроллере младшего подсемейства для регистрации изменений на входе вместо постоянного опроса входного вывода.

ДЕЛЕНИЕ НА ТРИ

Ниже приведен алгоритм деления положительной величины на три, разработанный Энди Уорреном (Andy Warren). Он основан на том, что «деление на три» может быть представлено в виде такого ряда:

х/3 = х/2 - х/4 + х/16 - х/32 - х/64...

Этот алгоритм применяется в Р1С-микроконтроллере следующим образом:

Div3: ; Деление содержимого регистра w иа три

movlw Dividend clrf Quotient

Div3 Loop ; Цикл, пока значение Dividend ие станет

; равным 0.



STATUS, С

Dividend,

Делимое делится на 2

(то есть х/2 в ряду)

movf

Dividend,

, Оно равно нулю

btfsc

STATUS, Z

goto

Div3 Done

, Если да, завершение

addwf

Quotient

, Добавление значения к частному

Dividend,

, Делимое делится на 2 (то есть х/4

, в ряду)

movf

Dividend,

btfsc

STATUS, Z

goto

Div3 Done

subwf

Quotient,

, Quotient = Quotient - (Dividend 4)

goto

Div3 Loop

Div3 Done

movf

Quotient,

Возврат частного Quotient

return

ИЗМЕРЕНИЕ ДЛИТЕЛЬНОСТИ ИМПУЛЬСА С 16-РАЗРЯДНОЙ ТОЧНОСТЬЮ

Программа, измеряющая ширину импульса по высокому уровню, име-

етвид:

clrf

PulseWidth

, Сброс таймера

clrf

PulseWidth + 1

btfss

PORTn, Bit

, Ожидание импульса

goto

$ - 1

incfsz

PulseWidth, f

, Инкрементирование значения

, счетчика

decf

PulseWidth + 1 f

btfsc

PORTn, Bit

Цикл выполняется.

, пока высокий уровень

goto

$ - 3

movf

PulseWidth w

, Сохранение результата

addwf

PulseWidth + 1 f

РЕГИСТРАЦИЯ ИЗМЕНЕНИЙ

Этот код может применяться для регистрации изменений, происходящих в портах ввода/вывода, таймерах и других регистрах, где изменения не зависят от выполнения конкретных программ:

movf Reg, w andlw Mask xorwf old, w

Маскирование неиспользуемых битов Сравнение с предыдущим значением



0 ... 114115116117118119120 ... 159