LIST P=18F452, F=INHX32
#include <P18F452S.INC>
org 100h; Переход на адрес 100h
; Инициализация системы
reg0 equ 080h; размер массива чисел
reg1 equ 081h
reg2 equ 082h
reg3 equ 083h
reg4 equ 084h
reg5 equ 085h
start;Старт программы
movlw 36h
movwf reg4
movlw 2Fh
movwf reg5
;**************Ввод чисел******************************
movlw 0; Установка начальной позиции 1 строчки дисплея
call LCD_SET; Переход к п/п установки пизиции вывода на ЖКИ
movlw 'V'; Загрузка символов
call LCD_DATA; Вывод символов на ЖКИ,
movlw 'V'
call LCD_DATA
movlw 'O'
call LCD_DATA
movlw 'D'
call LCD_DATA
lfsr FSR0,0x100; начальный адрес массива
movlw 08h; размер массива чисел - 08
movwf reg0; счетчик массива - reg0
vvod movlw 4; Установка начальной позиции 1 строчки дисплея
call LCD_SET; Переход к п/п установки пизиции вывода на ЖКИ
call RX_KEY; чтение кода старшей цифры
movwf reg2
call LCD_HEX
movf reg2,w
sublw 0x46; 46-W<0,то повтор ввода
bn vvod
movf reg2,w
sublw 0x40; 41-W<0,то OKEY
bn ok1
movf reg2,w
sublw 0x39; 39-W<0,то повтор ввода
bn vvod
movf reg2,w
sublw 0x2F; 2F-W<0,то OKEY
bn ok2
goto vvod; если W<30,то повтор ввода
ok1 movf reg2,w
bcf STATUS,0,0
subfwb reg4,w; (0x41...0x46) - 0x36
goto ok3
ok2 movf reg2,w
bcf STATUS,0,0
subfwb reg5,w; (0x30...0x39) - 0x30
|
|
ok3 movwf reg1; биты <3-0> сохранить в reg1
swapf reg1,f; поменять местами биты <3-0> <7-4>
vvod movlw 6; Установка начальной позиции 1 строчки
;дисплея
call LCD_SET; Переход к п/п установки пизиции вывода на ЖКИ
call RX_KEY; чтение кода старшей цифры
movwf reg2
call LCD_HEX
movf reg2,w
sublw 0x46; 46-W<0,то повтор ввода
bn vvo
movf reg2,w
sublw 0x40; 41-W<0,то OKEY
bn ok4
movf reg2,w
sublw 0x39; 39-W<0,то повтор ввода
bn vvo
movf reg2,w
sublw 0x2F; 30-W<0,то OKEY
bn ok5
goto vvo; если W>46,то повтор ввода
ok4 movf reg2,w
bcf STATUS,0,0
subfwb reg4,w; (0x41...0x46) - 0x36
goto ok6
ok5 movf reg2,w
bcf STATUS,0,0
subfwb reg5,w; (0x30...0x39) - 0x30
ok6 iorwf reg1,w; в одном байте две цифры - число
movwf POSTINC0; записать число в массив
decfsz reg0,f; уменьшить счетчик на 1
goto vvod; конец цикла ввода
movlw 0; Установка начальной позиции 1 строчки дисплея
call LCD_SET; Переход к п/п установки пизиции вывода на ЖКИ
movlb 01
movf 0x00,w,1
call LCD_HEX
movf 0x01,0,1
call LCD_HEX
movf 0x02,0,1
call LCD_HEX
movf 0x03,0,1
call LCD_HEX
movf 0x04,w,1
call LCD_HEX
movf 0x05,0,1
call LCD_HEX
movf 0x06,0,1
call LCD_HEX
movf 0x07,0,1
call LCD_HEX
;*********вычисление среднего значения из массива чисел *********
movlw 40; Установка начальной позиции 1 строчки дисплея
call LCD_SET; Переход к п/п установки пизиции вывода на ЖКИ
lfsr FSR0,0x100; начальный адрес массива
movlw 08h; размер массива чисел - 08
movwf reg0; счетчик массива - reg0
incf reg0,f; добавка 1,так как декремент в нач цикла
clrf reg3; очистка старшего байта сумматора
clrf reg2; очистка младшего байта сумматора
;
summa dcfsnz reg0,f
goto konec
movf POSTINC0,w
call LCD_HEX;proba
movf INDF0,w;proba
addwf reg2,f
bnc noc
incf reg3
noc goto summa
konec bcf STATUS,0,0
rrcf reg3,1
rrcf reg2,1
bcf STATUS,0,0
rrcf reg3,1
rrcf reg2,1
bcf STATUS,0,0
rrcf reg3,1
rrcf reg2,1
movlw 40h; Установка начальной позиции 2 строчки дисплея
call LCD_SET; Переход к п/п установки пизиции вывода на ЖКИ
|
|
movlw 'S'; Загрузка символов
call LCD_DATA; Вывод символов на ЖКИ,
movlw 'R'
call LCD_DATA
movlw ' '
call LCD_DATA
movlw 'Z'
call LCD_DATA
movlw 'N'
call LCD_DATA
movlw '-'
call LCD_DATA
movf reg3,0
call LCD_HEX
movf reg2,0
call LCD_HEX
;*********************Ввод символов с клавиатуры******************
goto $-2
end
Варианты заданий к лабораторной работе
№ Варианта | Коды клавиш | |
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 |
Для получения оценки удовлетворительно нужновыполнить лабораторную работу взяв 8 чисел из первой колонки, для получения оценки хорошо необходимо изменить программу для обработки 16 чисел, для получения оценки отлично необходимо изменить программу для расчета среднего значения 32 чисел (при этом 16 чисел необходимо взять из последующего варианта)
В отчёт по данной лабораторной работе включается:
1. Краткая теоретическая часть
2. Исходный текст программы
3. Вручную рассчитанный результат, исходя из задания к каждому варианту.
Контрольные вопросы:
1. Можно ли в этой программе использовать системный регистр FSR1 и если да, то какие изменения необходимо внести в исходный текст программы.?
2. Можно ли заменить метку OK1 на метку DA1, и если да, то какие изменения необходимо внести в исходный текст программы.?
3. Объясните назначение команды bn vvod
4. Объясните назначение команды sublw 0х2F, и как по другому можно записать эту команду.
5. Объясните назначение команды bcf STATUS,0,0