В данной подпрограмме содержимое регистра w складывается с содержимым регистра PCL, и при выходе из подпрограммы код индикации записывается в w.
Заключение
В результате выполнения курсовой работы был разработан микропроцессорный измеритель высоты с выводом результатов на ЖК индикатор, удовлетворяющий заданным техническим характеристикам.
Список литературы
1. http://www.microchip.ru
Приложение
ЛИСТИНГ
org 0x0000
goto main
TL equ 0x24
TH equ 0x25
N equ 0x26
N0 equ 0x27
Nsot equ 0x28
Ndes equ 0x29
Ned equ 0x2A
K equ 0x2B
Count equ 0x2C
T1 equ 0x2D
T2 equ 0x2E
;**********************************
; Основная программа
;**********************************
main
call init_mk; инициализация микроконтроллера
call init_lcd; инициализация ЖКИ
start call measure; измерение длительности импульса
call ekv; вычисление числового эквивалента
call bcd; преобразование числового эквивалента в 2-10 код
movwf Nsot, w; определение достижения 20 км
xorlw 0x02;STATUS, Z; PORTA, 4; замыкание контакта на землю
btfss STATUS, Z;
bcf PORTA, 4; размыкание контакта на землю
call 25ms; пауза 25 мс.
|
|
call indicate; индикация результатов измерения
goto start
end.
;**********************************
; Инициализация микроконтроллера
;**********************************
init_mkPORTA;PORTB;0x07ADCON1; выходы PORTA цифровые 0x01;
movwf TRISA; настройка RA0 - на вход, остальные на выход
clrf TRISB; настройка PORTB на выход
movlw 0x00;
movwf T1CON; настройка модуля TMR1
return
;**********************************
; Инициализация ЖКИ
;**********************************_lcdPORTA, 3; E=025ms; пауза 25 мс0x30; PORTB; установка 8-ми битного интерфейса передачи
bcf PORTA, 1; А0=0PORTA, 2; RW=0; пауза 1 мксPORTA, 3; E=1;; пауза 3 мкс;PORTA, 3; E=050mks; пауза 50 мксPORTA, 3; E=1;; пауза 3 мкс;PORTA, 3; E=050mks; пауза 50 мксPORTA, 3; E=1;; пауза 3 мкс;сf PORTA, 3; E=0;; пауза 3 мкс;0x3APORTB; настройка разрядностиbyte_to_lcd; передача байта в ЖКИ 0x0С
movwf PORTB; включение ЖКИ
call byte_to_lcd; передача байта в ЖКИ
movlw 0x01
movwf PORTB; очистка ЖКИ
call byte_to_lcd; передача байта в ЖКИ
movlw 0x06
movwf PORTB; режим ввода данных
call byte_to_lcd; передача байта в ЖКИ
;**********************************
; Пауза 25 мс
;**********************************
msT1; очистка T1T2; очистка T20x64;T1; T1=100
_1 movlw 0xFA;T2; T2=250
_0 decfsz T2, F; T2=T2-125_0T1, F; T1=T1-125_1
;**********************************
; Пауза 50 мкс
;**********************************
mksT1; очистка T10x32;T1; T1=50
_0 decfsz T1, F; T1=T1-150_0
;**********************************
; Пауза 100 мкс
;**********************************
mksT1; очистка T10x64;T1; T1=64
_0 decfsz T1, F; T1=T1-1 100_0
return
;**********************************
; Передача байта в ЖКИ
;**********************************_to_lcdPORTA, 2; RW=0; пауза 1 мксPORTA, 3; E=1;; пауза 3 мкс;PORTA, 3; E=0100mks; пауза 100 мкс
;**********************************
; Измерение длительности импульса
;**********************************
measure
clrf TMR1L; очистка TMR1L
clrf TMR1H; очистка TMR1H
m1 btfss PORTA, 0; входной сигнал равен 1?
goto m1
bsf T1CON, 0; запуск таймера
m2 btfsc PORTA, 0; входной сигнал равен 0?
goto m2
bcf T1CON, 0; остановка таймера
|
|
movf TMR1L, w;
movwf TL; пересылка результатов измерения в регистры
movf TMR1H, w;TH;
;**********************************
; Вычисление числового эквивалента
;**********************************
ekv
clrf N; очистка частного
clrf N0; очистка остатка
molvw 0xC8;
movf k, w; делитель=200
movlw 0x10;
movwf count; организация счетчика на 16
ekv2 rlf TL, F; сдвиг делимого влево
rlf TH, F;
rlf N0, F; сдвиг частного влевоk, w;
subwf N0, F; вычитание делителя из остатка
btfsc STATUS, C; если C=0 восстанавливаем остаток
goto ekv1
addwf N0, F; восстановление остатка
bcf STATUS, C; C=0
ekv1 rlf N, F; сдвиг частного влево
decfsz count, f; продолжать деление, пока не обнулен счетчик
goto ekv2;N0, w; N, F; прибавление остатка к частному
return
;**********************************
; Перевод в 2-10 код
;**********************************
bcd
clrf Nsot; очистка регистров результата
clrf Ndes;
clrf Ned;
bcd1 movlw 0x64; вычитаем 100 из двоичного числа
subwf N, w;STATUS, C;
goto bcd2Nsot, F; увеличиваем количество сотен на единицуN; сохраняем результат вычитанияbcd1;
bcd2 movlw 0x0A; вычитаем 10 из двоичного числа
subwf N, w;STATUS, C; bcd3
incf Ndes, F; увеличиваем количество десяток на единицу
movwf N; сохраняем результат вычитания
goto bcd2;
bcd3 movf N, w;Ned; после вычитаний заносим остаток в единицы
return
;****************************************
; Выдача результатов измерения на индикацию
;****************************************PORTA, 2; RW=0PORTA, 1; A0=1 Nsot, w; кол-во сотен в w
call symbol; определение кода символа
movwf PORTB; w в PORTB
call byte_to_lcd; передача в ЖКИ Ndes, w; кол-во десятков в w
call symbol; определение кода символа
movwf PORTB; w в PORTB
call byte_to_lcd; передача в ЖКИ0x2E; код точкиPORTB; w в PORTBbyte_to_lcd; передача в ЖКИ Ned, w; кол-во единиц в w
call symbol; определение кода символа
movwf PORTB; w в PORTB
call byte_to_lcd; передача в ЖКИ
;****************************************
; Определение кода символа
;****************************************PCL, F; PCL=PCL+w 0x30; символ 0
retlw 0x31; символ 1
retlw 0x32; символ 2
retlw 0x33; символ 3
retlw 0x34; символ 4
retlw 0x35; символ 5
retlw 0x36; символ 6
retlw 0x37; символ 7
retlw 0x38; символ 8
retlw 0x39; символ 9