Блок-схема алгоритма определения кода символа

В данной подпрограмме содержимое регистра 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


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: