Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ТКЗ№1.doc
Скачиваний:
4
Добавлен:
18.11.2019
Размер:
1 Мб
Скачать

1.2 Десяткової корекції для мікро контролера ріс

Сучасні мікропроцесори та мікро контролери припускають два представлення десяткових чисел: упакований BCD – формат та не упакований ASCII - формат. У BCD – форматі байт містить дві десяткові цифри (по одній у кожній тетраді), які представлені у коді 8421.

1.2.1 Додавання у bcd – форматі

Додавання у BCD – форматі виконується у два етапи: спочатку байти операндів додаються як звичайні двійкові числа, за правилами двійкової арифметики, а потім здійснюється корекція результату.

Слід зазначити, що на відміну від мікроконтролерів РІС фірми Microchip у мікроконтролерах MCS-51, MCS-96,196,296 фірми Intel та AVR фірми Atmel у системі команд є інструкція DAA, яка на апартному рівні виконує корекція результату після додавання у BCD – форматі, що значно спрощує обробку двійково – десяткових чисел. Для мікроконтролерів РІС програміст змушений програмно реалізовувати алгоритм десяткової корекції.

Аналіз двійкового додавання BCD – чисел показує, що неправильний BCD – результат з’являється у двох ситуаціях:

  • отримана не припустима тетрада, тобто тетрада, в якій двійковий еквивалент більше 9;

  • отримана припустима тетрада, але при додаванні із неї виникло двійкове перенесення з вагою 16, в той час як правильна вага одиниці перенесення повинна бути 10;

Слід зазначити, що перенесення із молодшої тетради фіксується прапорцем DC, а із старшої тетради – прапорцем С. Алгоритм корекції після додавання складається з двох кроків:

  • якщо DC=1 або молодша тетрада регістру W містить заборонену комбінацію (у діапазоні чисел 10-15), до вмісту W додається 06 h і прапорець DC встановлюється в одиницю;

  • якщо C=1 або старша тетрада регістру W містить заборонену комбінацію (у діапазоні чисел 10-15), до вмісту W додається 60 h і прапорець C встановлюється в одиницю;

Рисунок 1 - Спрощений алгоритм десяткової корекції після додавання у BCD – форматі

1.2.2 Віднімання у bcd – форматі

Спрощений алгоритм корекції після віднімання складається з двох кроків:

  • якщо DC=0 або молодша тетрада регістру W містить заборонену комбінацію, із вмісту W віднімається 06 h і прапорець DC скидається у нуль;

  • я кщо C=0 або старша тетрада регістру W містить заборонену комбінацію , із вмісту W віднімається 06 h і прапорець C скидається у нуль;

Рисунок 2 - Спрощений алгоритм десяткової корекції після віднімання у BCD – форматі

;---------------------------------------------------------------------------------------------------------

w equ 0; приймач інформації регістр W

f equ 1; приймач інформації регістр R

;---------------------------------------------------------------------------------------------------------

r0 equ 0c; сума

r1 equ 0d; доданок 1/різниця

r2 equ 0e; доданок 1

r3 equ 0f; доданок 2

r4 equ 10; доданок 2

r5 equ 11; temp register

port_b equ 06;

;---------------------------------------------------------------------------------------------------------

status equ 03; визначення прапорців

carry equ 0; carry,

digit_carry equ 1; digit_carry

zero equ 2; та zero у регістрі status

;---------------------------------------------------------------------------------------------------------

summand_1 equ 87;

summand_2 equ 98;

;---------------------------------------------------------------------------------------------------------

minuend equ 87;

subtrahend equ 98;

;---------------------------------------------------------------------------------------------------------

DAA_DAS_flag equ 0; 0 – DAA, 1 - DAS

;---------------------------------------------------------------------------------------------------------

movlw DAA_DAS_flag;

andlw 1;

btfss status, zero;

goto DAS;

movlw summand_1;

andlw 0f;

movwf r1;

movlw summand_1;

andlw 0f0;

movwf r2;

movlw summand_2;

andlw 0f;

movwf r3;

movlw summand_2;

andlw 0f0;

movwf r4;

bcf status, carry;

movf r3,w;

addwf r1,w;

btfsc status,digit_carry;

goto add_06;

goto verify_9;

back movf r2,w;

addwf r4,w;

btfsc status,carry;

goto add_60;

goto verify_9f;

back_1 movlw 0;

tris port_b;

movf r0,w;

movwf port_b;

goto finish;

add_06 addlw 06;

movwf r0;

bsf status,digit_carry;

goto back;

add_60 addlw 60;

addwf r0,f;

bsf status,carry;

goto back_1;

verify_9 movwf r5;

sublw 9;

btfss status, carry;

goto recovery_w;

movf r5,w;

movwf r0;

goto back;

recovery_w movf r5,w;

goto add_06;

verify_9f movwf r5;

sublw 9f;

btfss status, carry;

goto recovery_w1;

movf r5,w;

addwf r0;

goto back_1;

recovery_w1 movf r5,w;

goto add_60;

;---------------------------------------------------------------------------------------------------------

DAS movlw subtrahend;

sublw minuend;

movwf r1;

movf status,w; збереження вмісту

movwf r2; регістру прапорців у регістрі r2

btfss status,digit_carry;

goto sub_06;

goto verify_9s;

backs movf r2,w;

movwf status;

btfss status,carry;

goto sub_60;

goto verify_9fs;

back_1s movlw 0;

tris port_b;

movf r1,w;

movwf port_b;

goto finish;

sub_06 movlw 06;

subwf r1;

bsf status,digit_carry;

goto backs;

verify_9s movf r1,w;

andlw 0f;

sublw 9;

btfss status,carry;

goto sub_06;

goto backs;

sub_60 movlw 60;

subwf r1;

bsf status,carry;

goto back_1s;

verify_9fs movf r1,w;

sublw 9f;

btfss status,carry;

goto sub_60;

goto back_1s;

finish

end

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]