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; Конец текста программы.
Варианты заданий к лабораторной работе
№ Варианта | клавиша | № Варианта | клавиша |
x | |||
n | z | ||
z | p | ||
m | |||
c | |||
h | y | ||
q | |||
v | |||
b | |||
a | |||
f | c | ||
d | |||
e |
Каждый студент изменяет текст программы таким образом, чтобы неподвижная информация соответствовала его фамилии, а при нажатии, соответствующую варианту бегущей строкой выводился текст типа: “Фамилия Имя Отчество - студент факультета АиУ МГТУ МАМИ ”
В отчёт по данной лабораторной работе включается:
1. Краткая теоретическая часть
2. Исходный текст программы
3. Результат бегущей строки преподаватель проверяет визуально на учебном стенде.
Контрольные вопросы:
1. Какого должно быть значение регистров TBLPTRU, TBLPTRH, TBLPTRL если начало текста бегущей строки будет с адреса 0003FAh?
|
|
2. Как необходимо продолжить макрос print, если неподвижная информация обозначена меткой student?
3. Какие изменения необходимо внести в программу, чтобы перед выводом бегущей строки во второй строке индикатора был выведен порядковый номер студента?
4. Объясните назначение команды bz strin01?
5. Объясните назначение команды clrf reg2?
ПРИЛОЖЕНИЕ А
(обязательно)
Московский Государственный Технический Университет “МАМИ”
Факультет “Автоматизация и управление”
Кафедра “Автоматика и Процессы Управления”
Отчёт по лабораторному практикуму
По дисциплине: “Программно – логическое управление”
Студент: ______________________________/______________/группа __________
ПРЕПОДАВАТЕЛЬ:____________________/_______________/
Защишено с оценкой _____________
Дата: ____________200_ г.
Москва – 200_ г.
Приложение В.Команды микроконтроллера
Мнемоника | Операнды | Описание команды | До выполнения | Примеры выполнения команды | После выполнения | |
ADDWF | f, d, a | Сложение W и f W+f | W = 0x1b f = 0x02 | ADDWF reg, 0, 0 | W = 0x1d, f = 0x02 | |
ADDWF reg, 1, 0 | W = 0x02, f = 0x1d | |||||
ADDWFC | f, d, a | Сложение W и f и бита С W+f +C | W = 0x1b f = 0x02 C= 1 | ADDWFC reg, 0, 0 | W = 0x1e, f = 0x02 | |
ADDWFC reg, 1, 0 | W = 0x02, f = 0x1e | |||||
ANDWF | f, d, a | Логическое «И» W и f 1*1=1, 1*0=0, 0*1=0, 0*0=0 | W=10010111 f = 10111011 | ANDWF reg, 0, 0 | W=10010011, f = 10111011 | |
ANDWF reg, 1, 0 | W =10111011, f=10010011 | |||||
CLRF | f, a | Очистка (обнуление) f | f=0x4a | CLRF reg, 0 | f=0x0 | |
COMF | f, d, a | Инверсия f | f=11001100 W=? | COMF reg, 0, 0 | f=00110011 W=? | |
COMF reg, 1, 0 | W=00110011 f=11001100 | |||||
CPFSEQ | f, a | Сравнить W и f, проп. если W=f | W = 0x1а f = 0x09 | CPFSEQ reg, 0 | Cлед. Команда выполняется | |
CPFSGT | f, a | Сравнить W и f, проп. если W>f | W = 0x1а f = 0x09 | CPFSGT reg, 0 | Cлед. команда пропускается | |
CPFSLT | f, a | Сравнить W и f, проп. если W<f | W = 0x1а f = 0x09 | CPFSLT reg, 0 | Cлед. команда выполняется | |
DECF | f, d, a | Декремент f f-1 | f = 0x07 W=? | DECF reg, 0,0 | W = 0x06, f = 0x07 | |
DECF reg, 1,0 | W =? f = 0x06 | |||||
DECFSZ | f, d, a | Декремент f, проп. если f=0 | f = 0x07 W=? | DECFSZ reg, 0, 0 | W = 0x06, f = 0x07 Cлед. Команда выполняется | |
DECFSZ reg, 1, 0 | W =?,f = 0x06 Cлед.Команда выполняется | |||||
DCFSNZ | f, d, a | Декремент f, проп. если f не 0 | f = 0x07 W=? | DCFSNZ reg, 0, 0 | W = 0x06,f = 0x07 Cлед. Команда выполняется | |
DCFSNZ reg, 1, 0 | W =?,f = 0x06 Cлед. команда выполняется | |||||
INCF | f, d, a | Инкремент f f+1 | f = 0x07 W=? | INCF reg, 0,0 | W = 0x08, f = 0x07 | |
INCF reg, 1,0 | W =? f = 0x07 | |||||
INCFSZ | f, d, a | Инкремент f, проп. если f =0x00 | f = 0x07 W=? | INCFSZ reg, 0,0 | ||
INCFSZ reg, 1,0 | ||||||
INFSNZ | f, d, a | Инкремент f, проп. если f =0x00 | f = 0x07 W=? | INFSNZ reg, 0,0 | ||
INFSNZ reg, 1,0 | ||||||
IORWF | f, d, a | Логическое «ИЛИ» W и f | W=10010111 f =10111011 | IORWF reg, 0, 0 | W =1011111 f=10111011 | |
IORWF reg, 1, 0 | f=1011111 W=10111011 | |||||
MOVF | f, d, a | Переместить f в W | f = 0x04 W=? | MOVF reg, 0, 0 | f = 0x04 W=0x04 | |
MOVFF | fs, fd | Переместить fs в fd | fs= 0x1c fn=? | MOVFF reg1, reg2 | fs= 0x1c fn= 0x1c | |
MOVWF | f, a | Переместить W в f | f =? W=0x07 | MOVF reg, 0 | f = 0x07 W=0x07 | |
MULWF | f, a | Умножение W и f | ||||
NEGF | f, a | Негативное значение f | ||||
RLCF | f, d, a | Сдвиг влево через перенос | W=? f = 0010001 1)С=1 2)С=0 | RLCF reg, 0, 0 | f= 0010001 1)W=0100011 2)W=0100010 | |
RLCF reg, 1, 0 | W=? 1)f=0100011 2)f=0100010 | |||||
RLNCF | f, d, a | Сдвиг влево без переноса | W=? f = 0010001 | RLCNF reg, 0, 0 | f= 0010001 W=0100010 | |
RLCNF reg, 1, 0 | W=? f=0100010 | |||||
RRCF | f, d, a | Сдвиг вправо через перенос | W=? f = 00100100 1)С=1 2)С=0 | RRCF reg, 0, 0 | f= 00100100 1)W=10010010 2)W=00010010 | |
RRCF reg, 1, 0 | W= 00100100 1)f=10010010 2)f=00010010 | |||||
RRNCF | f, d, a | Сдвиг вправо без переноса | W=? f = 00100100 | RRNCF reg, 0, 0 | f= 00100100 W=00010010 | |
RRNCF reg, 1, 0 | W= 00100100 f=00010010 | |||||
SETF | f | Установить все биты f в 1 | f = 00100100 | SETF reg | f=11111111 | |
SUBFWB | f, d, a | Вычитание f из W c заемом | W= 11111111 f = 00000001 1)С=1 2)С=0 | SUBFWB reg, 0, 0 | f= 00000001 1)W=11111101 2)W=11111110 | |
SUBFWB reg, 1, 0 | W= 00000001 1)f=11111101 2)f=11111110 | |||||
SUBWF | f, d, a | Вычитание W из f | f= 0x3d W= 0x1c | SUBWF reg, 0, 0 | W=0x21 f=0x3d | |
SUBWF reg, 1, 0 | f=0x21 W=0x3d | |||||
SUBWFB | f, d, a | Вычитание W из f c заемом W-f-C | f= 0x3d W= 0x1c C=1 | SUBWFB reg, 0, 0 | W=0x20 f=0x3d | |
SUBWFB reg, 1, 0 | f=0x20 W=0x3d | |||||
SWAPF | f, d, a | Поменять местами полубайты в f | W=? f = 11110000 | SWAPF reg, 0, 0 | W= 00001111 f = 11110000 | |
SWAPF reg, 1, 0 | W=? f = 00001111 | |||||
TSTFSZ | f, a | Тест f, проп. если f=0x0 | f=0x0 | TSTFSZ reg, 0 | Cлед. команда пропускается | |
XORWF | f, d, a | Логическое исключающее «ИЛИ» | W= 11001100 f = 10101010 | XORWF reg, 0, 0 | W=01100110 f = 10101010 | |
XORWF reg, 1, 0 | f=01100110 W = 10101010 | |||||
Бит ориентированные команды | ||||||
BCF | f, b, a | Сброс бита в f (b=0…7) | f = 11100001 | BCF reg, 2, 0 | f= 11000001 | |
BCF reg, 7, 0 | f = 11100000 | |||||
BSF | f, b, a | Установка бита в f | f = 11100001 | BSF reg, 4, 0 | f= 11101001 | |
BSF reg, 6, 0 | f = 11100011 | |||||
BTFSC | f, b, a | Тест бита, проп. если b=0 | f = 11100001 | BTFSC reg, 1, 0 | Cлед. команда выполняется | |
BTFSC reg, 5, 0 | Cлед. команда пропускается | |||||
BTFSS | f, b, a | Тест бита, проп. если b=1 | f = 11100001 | BTFSS reg, 1, 0 | Cлед. команда пропускается | |
BTFSS reg, 5, 0 | Cлед. команда выполняется | |||||
BTG | f, b, a | Инверсия бита в f | f = 11100001 | BTG reg, 6, 0 | f = 11100011 | |
BTG reg, 7, 0 | f = 11100000 | |||||
BC | n | Переход, если перенос (С=1) | 1) C=1 2) C=0 | BC metka | 1) Переход к метке 2) Нет перехода | |
BN | n | Переход, если нег. резулт. (N=1) | 1) N=1 2) N=0 | BN metka | 1) Переход к метке 2) Нет перехода | |
BNC | n | Переход, если нет переноса (С=0) | 1) C=1 2) C=0 | BNC metka | 1) Нет перехода 2) Переход к метке | |
BNN | n | Переход, если пол. резулт. (N=0) | 1) N=1 2) N=0 | BNN metka | 1) Нет перехода 2) Переход к метке | |
BNOV | n | Переход, если нет переполн. (OV=0) | 1) OV=1 2) OV=0 | BNOV metka | 1) Нет перехода 2) Переход к метке | |
BNZ | n | Переход, если не нуль (Z=0) | 1) Z=1 2) Z=0 | BNZ metka | 1) Нет перехода 2) Переход к метке | |
BOV | n | Переход, если переполнение (OV=1) | 1) OV=1 2) OV=0 | BOV metka | 1) Переход к метке 2) Нет перехода | |
BRA | n | Безусловный переход | - | BRA metka | Переход к метке | |
BZ | n | Переход, если нег. резулт. (N=1) | 1) N=1 2) N=0 | BN metka | 1) Переход к метке 2) Нет перехода | |
CALL | n, s | Переход на подпрограмму | - | СALL prog, 0 | Переход на подпрограмму | |
CLRWDT | - | Сбросить сторожевой таймер | ||||
DAW | - | Десятичная коррекция W | ||||
GOTO | n | Переход по адресу | - | GOTO metka | ||
NOP | - | Нет операции | - | - | - | |
POP | - | Чтение вершины стека | ||||
PUSH | - | Запись в вершину стека | ||||
RCALL | n | Короткий переход на подпрограмму | - | RСALL prog, 0 | Переход на подпрограмму | |
RESET | - | Программный сброс | ||||
RETFIE | s | Возврат из подпрограммы с разрешением прерываний | ||||
RETLW | k | Возврат из подпрограммы с загрузкой W | ||||
RETURN | s | Возврат из подпрограммы | - | RETURN | Возврат к основной программе | |
SLEEP | - | Переход в SLEEP режим | - | SLEEP | ||
ADDLW | k | Прибавть константу к W | W= 0x3d k = 0x21 | ADDLW 0x21 | W= 0x5e | |
ANDLW | k | Логическое «И» константы и W | W=10010111 k = 10111011 | ANDLW B’10111011’ | W=10010011 | |
IORLW | k | Логическое «ИЛИ» константы и W | W=10010111 k =10111011 | IORLW B’10111011’ | W =1011111 | |
LFSR | f, k | Поместить константу в FSR (k=0…3) | f=2 k=0x3AB | LFSR 2, 0x3AB | LFSRH=0x03 LFSRL=0xAB | |
MOVLB | k | Поместить константу в BSR | BSR=0x02 | MOVLB 0x05 | BSR=0x05 | |
MOVLW | k | Поместить константу в W | W=? | MOVLW 0x5A | W=0x5A | |
MULLW | k | Умножение константы на W | W=0xC4 PRODH=? PRODL=? | MULLW 0xC4 | W=0xE2 PRODH=0xAD PRODL=0x08 | |
RETLW | k | Возврат из подпрограммы с загрузкой W | ||||
SUBLW | k | Вычитание W из константы k | k=0x5D W =0x11 | SUBLW 0x5D | W =0x4C | |
XORLW | k | Логическое исключающее «ИЛИ» константы и W | W= 11001100 k = 10101010 | XORLW B’10101010’ | W=01100110 | |
Литература
|
|
|
|
1. Современные микроконтроллеры: Архитектура, средства проектирования, примеры применения, ресурсы сети Интернет. ©”Телесистемы”. Под ред. Коршуна И.В.; Составоение, пер с англ. и литературная обработка Горбунова Б.Б. – М:Издательство “Аким ”, 1998.- 272 с.,ил.
2. Петров И.В. Программируемые контроллеры. Стандартные языки и примеры прикладного проектирования / Под ред. В.П. Дьяконова. – М.:СОЛОН – Пресс, 2004. – 256 с.:ил. –(Серия “Библиотека инженера”
3. Ульрих В.А. Микроконтроллеры PIC16X7XX. Изд. 2-е, перераб. и доп.- СПб:Наука т Техника, 2002.- 320 стр. с ил.
Под редакцией С.Л. Корякина-Черняка, члена Международной академии информационных процессов и технологий