Главная страница  Комбинированное использование портов 

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 [ 26 ] 27 28 29 30 31 32 33 34 35 36 37 38 39 40

rlf rlf rlf

R2 Rl

decfsz count

goto adjDEC

retlw 0

adj DEC movlw R2

movlw FSR

call adjBCD

movlw Rl

movwf FSR

call adjBCD

movlw RO

mov FSR

call adjBCD

goto loopie

adj BCD movlw

addwf 0,W

movwf temp

btfsc temp,3

movwf 0

movlw 30

addwf 0,W

movwf temp

btfsc temp,? 0

Результат больше, чем 7?

Результат больше, чем 7? Сохранение в HSD.

movwf retlw О

Тестовая программа.

Задаем двоичнное FFFF (16 бит).

После преобразования: R0,R1,R2 = 06,55,35.

main

movlw

movwf

H byte

movwf

L byte

call

B2 BCD

self

goto

self

goto

main

ygfiHVi И вычитание чисел в двоично-десятичных кодах

дЛ ваше приложение работает в коде BCD и использует операции жения и вычитания, целесообразнее осуществлять их непосред-нно в двоично-десятичном коде, чем преобразовывать два раза gpga BCD в двоичный, а затем обратно). В этом разделе вам предлагаются две программы, вычисляющие сумму и разность двух чисел без знака.

Алгоритмы программ приведены на рис. 4.5 и 4.6, а тексты - в лис-н14.12и4ЛЗ.

q Начоло

1 двоичное сложение


( Конец 3

Smtm

сложения двоично-десятичных кодов



Ночоло J

Рис. 4.6

Дбоичное Вьчитание


Алгоритм вычитания чисел в двоично-десятичном коде (BCD) Показатели программ:

♦ сложение требует 29 ячеек памяти и выполняется за 23 командных цикла (максимум);

♦ вычитание требует 31 ячейку памяти и выполняется за 21 кс мандныйцикл (максимум).

Два числа, которые надо сложить или вычесть, содержатся в бай тах Num 1 и Num 2, а результат помещается в Nuni 2. При вычитании вЫ числяется разность байтов Nuni 2 и Nuni 1. В случае переполнения пр выполнении операций перенос фиксируется в Num 1.

Листинг 4.12

******************************

к**********************1

Сложение двоично-десятичных чисел без знаков. Слагаемые располагаются в байтах Num l и Nuin 2.

и***********

результат помещается в Nurfi 2. Перенос помещается в Num i. Показатели:

требуемая память: 25;

количество командных циклов: 23 (максимум).

Программа соответствует инструкции по применению AN526 фирмы Microchip. ***************************************************************************

result equ Onflow equ

Первое слагаемое. Второе слагаемое.

include mpreg.h

gCDAdd movf Num 1,w

addwf Num 2 ; Двоичное сложение.

clrf Num 1

rlf Num 1

btfsc STATUS,DC; DC = 0?

goto adjust ; Корректировка младшей цифры (Lsd).

movlw 6

addwf Num 2 ; LSD > 9?

btfsc STATUS,CARRY

incf Num 1

btfss STATUS,DC; Проверка десятичного переноса,

subwf Num 2 ; LSD < 9.

goto overt

adjust movlw 6

addwf Num 2

overl movlw 60 ; Добавление числа 6 к старшей цифре (MSD).

addwf Num 2

btfsc STATUS,CARRY

goto over3

btfss Num 1,0

subwf Nuffl 2

retlw 0

огЗ movlw 1

movwf NurnJ

retlw 0

******************************************************************************

Тестовая программа.

******************************************************************************

movlw 99 movwf Num 1

; Num 1 = 99.



call self

movlw S9 movwf Num 2

BCDAdd

; Num 2 = 99.

; После сложения Num 2 = 98 ; и Numj = 01 {99 + 99 = 198).

goto

goto

self IF

main

Листинг 4.13

Вычитание двоично-десятичных чисел без знаков.

Два числа DCB для вычитания помещаются в байты Num 111111 и Num 2.

Результат (Num 2 - Num 1) помещается в Num 2.

Перенос помещаются в Num 1.

Показатели: требуемая память: 31;

количество командных циклов: 21 (максимум).-

Программа соответствует инструкции по применению AN526 фирмы Microchip.

; Размещение байта Num 1. ; Размещение байта Num 2.

include

mpreg.h

movf

NumJ.w

subwf

Num 2

clrf

Num 1

NumJ

btfss

STATUS,DC

goto

adjsti

btfss

Num 2,3

goto

Over l

btfsc

NumJ, 2

goto

adjsti

btfss

Num 2.1

; результата.

adjsti OverJ

goto

Over 1 ;

Если да, переходим к старшей цифре

movlw

subwf

NumJ

btfss

Num 1,0 ;

CY = 0?

goto

adjst2 ;

Да, уточнение MSD результата.

clrf

Num 1

btfss

Num 2,7 ;

Нет. проверяем: MSD > 9?

retlw

btfsc

NumJ, 6

goto

adjst2

btfss

NumJ. 5

retlw

movlw

60 ;

Добавление цифры 6 к MSD.

subwf

NumJ

clrf

NumJ

btfss

STATUS,CARRY

; Проверка переполнения.

retlw

movlw

movwf

NumJ

retlw

*********************************************************************************

Тестовая программа.

*********************************************************************************

nain

self

movlw

movwf

NumJ

; NumJ = 23.

movlw

NumJ

; NumJ = 99.

call

BCDSub

; После вычитания NumJ = 76 (99 - 23) и N

; (указывает, что результат больше нуля).

movlw

movwf

NumJ

; NumJ = 99.

movlw

movwf

NumJ

; NumJ = 0.

call

BCDSub

; После вычитания Num 2 = 1 и Num 1 = 1

; (показывает, что результат меньше нуля).

goto

self

goto

main

1 = о



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 [ 26 ] 27 28 29 30 31 32 33 34 35 36 37 38 39 40

© 2000 - 2024 ULTRASONEX-AMFODENT.RU.
Копирование материалов разрешено исключительно при условии цититирования.