Лабораторные работы 1-5-Драгунов (538456), страница 4
Текст из файла (страница 4)
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 , при нажатии любой клавиши на клавиатуре стенда.
Для получения удовлетворительной оценки допускается использовать демонстрационную программу, перебирая все числа от А и выше. Для получения более высокой оценки в программу необходимо внести такие изменения, чтобы отбросить те числа, которые не входят в задание.
Варианты заданий к лабораторным работам
№ Варианта | Коды клавиш |
1 | A,В,С,D ,E, F,10,11,12,13,14,15,16,17,30,31 |
2 | 18,19,1A,1B,1C,1D,32,33,1E,1F,20,21,22,23,34,35 |
3 | 24,25,26,27,28,29,A,B,2A,2B,2C,2D,2E,2F,13,14 |
4 | 32,33,50,51,52,53,54,55,56,57,58,59,5A,5B,5C,5D |
5 | 5E,5F,60,61,62,63,64,65,66,67,68,69,6A,6В,6С,6D |
6 | 6E,6F,70,71,72,73,74,75,76,77,78,79,7A,7B,7C,7D |
7 | 7E,7F,80,81,82,83,84,85,86, 87, 88, 89, 8A, 8B, 8C, 8D |
8 | 90,91,92,93,94,95,96,97,9A,9B,9C,9D,9E,9F,A0,A1 |
9 | A2,A4,A3,A5,A6,A7,A8,A9,A,В,С,D ,E, F,10,11 |
10 | 12,13,14,15,16,17,30,31,18,19,1A,1B,1C,1D,32,33 |
11 | 1E,1F,20,21,22,23,34,35,A,В,С,D ,E, F,10,11 |
12 | 2A,2B,2C,2D,2E,2F,13,14,18,19,1A,1B,1C,1D,32,33 |
13 | 56,57,58,59,5A,5B,5C,5D,24,25,26,27,28,29,A,B, |
14 | 66,67,68,69,6A,6В,6С,6D,32,33,50,51,52,53,54,55 |
15 | 76,77,78,79,7A,7B,7C,7D,5E,5F,60,61,62,63,64,65 |
16 | 86, 87, 88, 89, 8A, 8B, 8C, 8D,6E,6F,70,71,72,73,74,75 |
17 | 9A,9B,9C,9D,9E,9F,A0,A1,7E,7F,80,81,82,83,84,85 |
18 | A,В,С,D ,E, F,10,11,90,91,92,93,94,95,96,97 |
19 | 18,19,1A,1B,1C,1D,32,33,A2,A4,A3,A5,A6,A7,A8,A9 |
20 | 66,55,5E,71,70,6D,A2,A,B,C,9A,7E,A9,18,19,1E |
21 | 81,82,83,84,85,2A,2B,2C,18,19,1A,1B, 5A,5B,5C,5D |
22 | E, F,10,11,E, F,10,11,5A,5B,5C,5D,59,5A,5B,5C |
23 | 16,17,30,31, 8A, 8B, 8C, 8D,62,63,64,65,7A,7B,7C,7D |
24 | 9A,9B,9C,9D,9E,9F,A0,A1,A2,A4,A3,A5,A6,A7,A8,A9 |
25 | 7E,7F,80,81, A,В,С,D,76,77,78,79,7A,7B,7C,7D |
26 | 24,25,26,27,28,29,A,B,,9A,9B,9C,9D,9E,9F,A0,A1 |
В отчёт по данной лабораторной работе включается:
-
Краткая теоретическая часть
-
Исходный текст программы
-
Результат перевода числа
-
Проверка машинного перевода в ручном (рукописном) варианте.
Контрольные вопросы:
-
Где сохраняется результат команды умножения?
-
Объясните почему перед командой сдвига rrcf rdel1 используется команда
bcf STATUS,0,0
-
Объясните назначение команды cpfslt rdel1
-
Объясните назначение команды swapf rdel1,0,1
-
Объясните назначение команды iorwf cif0,1,1
Лабораторная работа №5
Изучение программы бегущая строка
Краткая теоретическая часть
Особенностями этой программы является то, что выводимый текст располагается не в оперативной памяти данных, а во Flash памяти программы, и поэтому заносится туда при составлении программы и её компиляции.
Связь памяти программ с памятью данных осуществляется через системный регистр TABLAT .Начало блока выводимой информации задаётся с помощью трёх системных регистров TBLPTRU, TBLPTRH, TBLPTRL. Поскольку начало информационного блока находится по адресу 000200h. Начальная позиция информационного блока задаётся с помощью строки org 200h. Поскольку длинна информационного блока не должна превышать FFh , то в цикле изменяется только содержимое системного регистра TBLPTRL.
Команда tblrd*+ осуществляет побайтное считывание из Flash памяти программы в системный регистр TABLAT, увеличивая на 1 системный регистр TBLPTRL.
В этой программе также используются макросы. Макрос представляет из себя набор команд, заданный в виде одной команды, мнемонику которой определяет пользователь, составляющий макросы.
В нашем случае используется макрос cmp reg5,1B., который сравнивает содержимое регистра reg5 с константой 1B, которая в данном случае представляет из себя ASCII код клавиши ESC.
Второй макрос print string 001 позволяет вывести строку символов, которая записывается начиная с метки string 001. db – означает побайтный вывод, а содержимое берется в кавычки. После “,” записывается 0, обозначающий конец выводимой информации.
Исходный текст программы
LIST P=18F452, F=INHX32
#include <P18F452S.INC>
reg0 equ 080h
reg1 equ 081h
reg2 equ 082h
reg3 equ 083h
reg4 equ 084h
reg5 equ 085h
org 100h
Start
movlw 0 ;Установка позиции дисплея
;00h=начало первой строки
;40h= - второй строки
call LCD_SET ;Команда на установку дисплея
print string001 ;Вывести строку символов до 0
;с текущей позиции дисплея
movlw 40 ;Установка позиции дисплея
call LCD_SET ;Начало второй строки
movlw '@' ;Вывод символа в текущую позицию дисплея
call LCD_DATA
main_loop ;Начало основного цикла
call RX_KEY ;Ждём нажатия на клавишу
movwf reg5 ;Помещаем код клавиши во врем. регистр
cmp reg5,1B ;Сравниваем в.р. с кодом 1В (ESC)
bz strin01 ;если нет, если да то переход на ....
movf reg5,w ;то выводим символ нажатой клавиши
call LCD_DATA ;на дисплей
goto main_loop ;Возврат на начало цикла
strin01
;ВНИМАНИЕ: в этой программе строка символов,
;для вывода как бегущая строка, находится по адресу 200h
movlw .55 ;Задаём кол-во символов в строке
movwf reg0 ;во в.р.
clrf TBLPTRU ;Очистить старший адрес т.к. он не исп. ; (чтобы не мешал ;)
clrf reg2 ;в.р. позиции в строке
cik02 movf reg2,w ;Берём из в.р. позицию в строке
movwf TBLPTRL ;Помещаем как младший адрес
movlw 2 ; 2 как старший адрес
movwf TBLPTRH ;т.к. адрес строки 200h
movlw 0
call LCD_SET
movlw .16 ;заносим в в.р.кол-во выводимых символов
movwf reg1 ;за один раз.
cik001 tblrd*+ ;читаем из Flash символ по адресу 0002XXh
;TBLPTRU=00h
;TBLPTRH=02h
;TBLPTRL=XXh
;в TABLAT
movf TABLAT,w ;Помещаем символ в W
call LCD_DATA ;Выводим символ....
decfsz reg1 ;повторяем этот цикл 16 раз
bra cik001 ;пока не ноль.
call pause ;программа задержки
incf reg2,f ;переход позиции на сл. символ.
decfsz reg0 ;повторяем вывод до конца символов
bra cik02 ;в строке
bra Start ;переход на старт программы
pause
movlw .255
movwf reg4
pz02
movlw .255
movwf reg3
pz01 nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
decfsz reg3
goto pz01
; bra pz01
decfsz reg4
bra pz02
return
string001 db "INIT_OK SET",0
; dw 0000h
; dd 00000000h
; dq 0..0h
org 200h
string002 db " STUDENT GRUPPI 6-UI-7 SOKOV ALEKS ",0
end ; Конец текста программы.
Варианты заданий к лабораторной работе
№ Варианта | клавиша | № Варианта | клавиша |
1 | 1 | 14 | x |
2 | n | 15 | z |
3 | z | 16 | p |
4 | m | 17 | 5 |
5 | c | 18 | 6 |
6 | h | 19 | y |
7 | 7 | 20 | q |
8 | v | 21 | 8 |
9 | 9 | 22 | b |
10 | 2 | 23 | a |
11 | f | 24 | c |
12 | 3 | 25 | d |
13 | 4 | 26 | e |
Каждый студент изменяет текст программы таким образом, чтобы неподвижная информация соответствовала его фамилии, а при нажатии, соответствующую варианту бегущей строкой выводился текст типа: “Фамилия Имя Отчество - студент факультета АиУ МГТУ МАМИ ”
В отчёт по данной лабораторной работе включается:
-
Краткая теоретическая часть
-
Исходный текст программы
-
Результат бегущей строки преподаватель проверяет визуально на учебном стенде.
Контрольные вопросы:
-
Какого должно быть значение регистров TBLPTRU, TBLPTRH, TBLPTRL если начало текста бегущей строки будет с адреса 0003FAh?
-
Как необходимо продолжить макрос print , если неподвижная информация обозначена меткой student?
-
Какие изменения необходимо внести в программу , чтобы перед выводом бегущей строки во второй строке индикатора был выведен порядковый номер студента?
-
Объясните назначение команды bz strin01?
-
Объясните назначение команды clrf reg2?
ПРИЛОЖЕНИЕ А
(обязательно)