Текст программы. ; программа перевода двоичных чисел в двоично-десятичную

LIST P=18F452, F=INHX32

#include <P18F452S.INC>

; программа перевода двоичных чисел в двоично-десятичную

; /систему счисления версия Драгунова С.С.

xxh equ 100h; шестнадцатиричное число

rdel1 equ 101h; 1-й результат деления

xxdh equ 102h; старшая цифра десятичного числа

reg equ 103h; для нахождения остатка (вспомогательный регистр)

cif0 equ 104h; нулевой разряд десятичного числа

cif1 equ 105h; первый разряд десятичного числа

org 100h

movlb 0x01

clrf xxh

clrf rdel1

clrf xxdh

clrf reg

clrf cif0

clrf cif1

movlw 0x09; проверка способа деления

movwf xxh; начинается с 0x0A

start CALL RX_KEY; ожидание нажатия клавиши

incf xxh; следующее число hex

movlw 0x00; вывод на 1-ю строку

CALL LCD_SET; числа hex

movf xxh,w

CALL LCD_HEX

movlw 0x33; умножить на CD

mulwf xxh,1

movff PRODH,rdel1; старший байт -> rdel1

bcf STATUS,0,0; обнулить флаг C

rrcf rdel1; сдвинуть результат вправо на 1 бит

;bcf STATUS,0,0; обнулить флаг C

;rrcf rdel1; сдвинуть результат вправо на 1 бит

;bcf STATUS,0,0; обнулить флаг C

;rrcf rdel1; сдвинуть результат вправо на 1 бит

; результат сдвинут на 3 бита вправо

movlw 0x0A; умножение результата на 0x0A

mulwf rdel1,1

movff PRODL,reg; запомнить результат для нахождения остатка

movf reg,w; reg -> WREG

subwf xxh,0,1; xxh - reg, результат -> WREG

movwf cif0; запоминание последней цифры числа dec

movlw 0x0A; запись в WREG 0x0A для сравнения

cpfslt rdel1; пропустить, если rdel1 < WREG(0x0A)

goto m1; переход на повторное деление

swapf rdel1,0,1;

iorwf cif0,1,1; логическое сложение, получение искомого

; 2-значного десятичного числа

movlw 40; вывод на 2-ю строку

CALL LCD_SET; числа dec

movf cif0,w

CALL LCD_HEX

goto start; замыкание цикла

m1 movlw 0x33; умножить rdel1 на CD

mulwf rdel1,1

movff PRODH,xxdh; старший байт -> xxdh

bcf STATUS,0,0; обнулить флаг C

rrcf xxdh; сдвинуть результат вправо на 1 бит

;bcf STATUS,0,0; обнулить флаг C

;rrcf xxdh; сдвинуть результат вправо на 1 бит

;bcf STATUS,0,0; обнулить флаг C

;rrcf xxdh; сдвинуть результат вправо на 1 бит

; результат сдвинут на 3 бита вправо

movff xxdh,cif1; запоминание старшей цифры числа dec

movlw 0x0A; умножение результата на 0x0A

mulwf xxdh,1

movff PRODL,reg; запомнить результат для нахождения остатка

movf reg,w; reg -> WREG

subwf rdel1,0,1; rdel1 - reg, результат -> WREG

movwf reg; результат разности -> reg

swapf reg,0,1

iorwf cif0,1,1; логическое сложение, получение

; 2-х последних цифр числа dec

movlw 40; вывод на 2-ю строку

CALL LCD_SET; числа dec

movf cif1,w

CALL LCD_HEX

movf cif0,w

CALL LCD_HEX

goto start; замыкание цикла

end

Приведённая программа является демонстрационной и переводит в десятичную систему числа начиная с 0Ah и далее увеличивает значение переводимого числа на 1, при нажатии любой клавиши на клавиатуре стенда.

Для получения удовлетворительной оценки допускается использовать демонстрационную программу, перебирая все числа от А и выше. Для получения более высокой оценки в программу необходимо внести такие изменения, чтобы отбросить те числа, которые не входят в задание.

Варианты заданий к лабораторным работам

№ Варианта Коды клавиш
  A,В,С,D,E, F,10,11,12,13,14,15,16,17,30,31
  18,19,1A,1B,1C,1D,32,33,1E,1F,20,21,22,23,34,35
  24,25,26,27,28,29,A,B,2A,2B,2C,2D,2E,2F,13,14
  32,33,50,51,52,53,54,55,56,57,58,59,5A,5B,5C,5D
  5E,5F,60,61,62,63,64,65,66,67,68,69,6A,6В,6С,6D
  6E,6F,70,71,72,73,74,75,76,77,78,79,7A,7B,7C,7D
  7E,7F,80,81,82,83,84,85,86, 87, 88, 89, 8A, 8B, 8C, 8D
  90,91,92,93,94,95,96,97,9A,9B,9C,9D,9E,9F,A0,A1
  A2,A4,A3,A5,A6,A7,A8,A9,A,В,С,D,E, F,10,11
  12,13,14,15,16,17,30,31,18,19,1A,1B,1C,1D,32,33
  1E,1F,20,21,22,23,34,35,A,В,С,D,E, F,10,11
  2A,2B,2C,2D,2E,2F,13,14,18,19,1A,1B,1C,1D,32,33
  56,57,58,59,5A,5B,5C,5D,24,25,26,27,28,29,A,B,
  66,67,68,69,6A,6В,6С,6D,32,33,50,51,52,53,54,55
  76,77,78,79,7A,7B,7C,7D,5E,5F,60,61,62,63,64,65
  86, 87, 88, 89, 8A, 8B, 8C, 8D,6E,6F,70,71,72,73,74,75
  9A,9B,9C,9D,9E,9F,A0,A1,7E,7F,80,81,82,83,84,85
  A,В,С,D,E, F,10,11,90,91,92,93,94,95,96,97
  18,19,1A,1B,1C,1D,32,33,A2,A4,A3,A5,A6,A7,A8,A9
  66,55,5E,71,70,6D,A2,A,B,C,9A,7E,A9,18,19,1E
  81,82,83,84,85,2A,2B,2C,18,19,1A,1B, 5A,5B,5C,5D
  E, F,10,11,E, F,10,11,5A,5B,5C,5D,59,5A,5B,5C
  16,17,30,31, 8A, 8B, 8C, 8D,62,63,64,65,7A,7B,7C,7D
  9A,9B,9C,9D,9E,9F,A0,A1,A2,A4,A3,A5,A6,A7,A8,A9
  7E,7F,80,81, A,В,С,D,76,77,78,79,7A,7B,7C,7D
  24,25,26,27,28,29,A,B,,9A,9B,9C,9D,9E,9F,A0,A1

В отчёт по данной лабораторной работе включается:

1. Краткая теоретическая часть

2. Исходный текст программы

3. Результат перевода числа

4. Проверка машинного перевода в ручном (рукописном) варианте.

Контрольные вопросы:

1. Где сохраняется результат команды умножения?

2. Объясните почему перед командой сдвига rrcf rdel1 используется команда

bcf STATUS,0,0

3. Объясните назначение команды cpfslt rdel1

4. Объясните назначение команды swapf rdel1,0,1

5. Объясните назначение команды iorwf cif0,1,1


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: