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