DIGIT2 equ 0x11 ;рабочая переменная индикатора метров
DIGIT3 equ 0x12 ;рабочая переменная индикатора декаметров
;==============================================================
В этом блоке описывается в каких ячейках ОЗУ (регистрах общего применения) будут хранится значения наших переменных. Назначение переменных понятно из комментариев приведенной выше части листинга программы.
Исполняемая программа
Данный блок соответствует приведенной ниже части программы.
;исполняемая программа
org 0х000 ;вектор сброса процессора, начальный адрес
clrf PORTA ;очистили выходные защелки порта А
clrf PORTB ;и порта В
clrf TMR0 ;очистка таймера TMR0
bsf STATUS, RP0 ;включили банк 1
movlw b’00011110’ ;настроили на вывод линию RA0,
movwf PORTA ;остальные линии порта A на ввод
movlw b’00000000’ ;настроили на вывод все линии порта B
movwf PORTB ;RB0…RB7
bcf OPTION_REG, 7 ;включили подтягивающие резисторы
bcf OPTION_REG, 5 ;включили режим таймера для TMR0
bcf STATUS, RP0 ;включили банк 0
Указываем адрес начала программ, вектор сброса процессора. Обнуляем значения в выходных защелках обеих портов. Обнуляем значение таймера. Затем установив в 1 бит RP0 регистра STATUS, мы получаем доступ к регистровому банку 1. Теперь обращаясь к регистрам PORTA и PORTB, мы обращаемся не к выходным защелкам, а к регистрам состояния этих портов, и настраиваем часть линий на ввод, а часть линий на вывод, что соответствует схеме приведенной в приложении. Используя бит 7 RBPU регистра OPTION_REG включаем встроенную нагрузку порта B, для чего устанавливаем бит в 0. С помощью бита 5 T0CS выбираем источник тактирования для таймера TMR0. Для использования внутренней тактовой частоты CLKOUT, устанавливаем в 0 этот бит. В конце установив в 0 бит RP0 регистра STATUS, мы получаем доступ к регистровому банку 0.
Основная программа main
main ;основная программа
call initialization ;вызываем подпрограмму инициализации
main1 call indication ;вызываем подпрограмму индикации
goto pressing ;вызываем подпрограмму обработки нажатия кнопки
main2 call transfer ;вызываем подпрограмму передачи импульсов
main3 goto waiting ;вызываем подпрограмму ожидания отраженного сигнала
main4 goto reception ;вызываем подпрограмму приема отраженного сигнала
main5 call calculation ;вызываем подпрограмму вычисления расстояния
В данной части используются всего два оператора перехода: оператор вызова подпрограммы call и оператор безусловного перехода goto. Для наглядности приведем блок-схему основной программы main, в которую добавлены условия и порядок взаимодействия рассматриваемых далее подпрограмм.
Блок-схема приведена на рис. 9.
Рис. 9. Блок-схема основной программы main.
Подпрограмма инициализации initialization
initialization ;подпрограмма инициализации и начальных условий
обнуляем значения используемых переменных
clrf PORTA ;очистили выходные защелки порта A
clrf NUMIMP ;обнуляем значение NUMIMP
clrf TIMER1 ;обнуляем значение TIMER1
clrf NUMCH ;обнуляем значение NUMCH
clrf TIMER2 ;обнуляем значение TIMER2
clrf LAPSE ;обнуляем значение LAPSE
clrf DIGIT1 ;обнуляем значение DIGIT1
clrf DIGIT2 ;обнуляем значение DIGIT2
clrf DIGIT3 ;обнуляем значение DIGIT3
;устанавливаем значения используемых переменных
movlw d'5' ;помещаем значение "5" для NUMIMP в аккумулятор
movwf NUMIMP ;помещаем значение из аккумулятора в NUMIMP
movlw d'100' ;помещаем значение "100" для TIMER1 в аккумулятор
movwf TIMER1 ;помещаем значение из аккумулятора в TIMER1
movlw d'100' ;помещаем значение "100" для TIMER2 в аккумулятор
movwf TIMER2 ;помещаем значение из аккумулятора в TIMER2
movlw d'57' ;помещаем значение "57" для LAPSE в аккумулятор
movwf LAPSE ;помещаем значение из аккумулятора в LAPSE
return ;возврат из подпрограммы
Здесь мы обнуляем используемые переменные, и устанавливаем для них необходимые значения. Количество передаваемых импульсов NUMIMP в сигнале принимаем равным 5 (согласовано с преподавателем). И т.д.
Подпрограмма индикации indication
indication ;подпрограмма индикации измеренного расстояния
;-----------------------------------------------------устанавливаем биты подключения индикаторов
bsf DIGIT1, 6 ;устанавливаем бит 6 переменной DIGIT1 в 1
bsf DIGIT2, 7 ;устанавливаем бит 7 (точка) переменной DIGIT2 в 1
bsf DIGIT2, 5 ;устанавливаем бит 5 переменной DIGIT2 в 1
bsf DIGIT3, 4 ;устанавливаем бит 4 переменной DIGIT3 в 1
;-----------------------------------------------------выводим значение DIGIT1 на индикатор
movf DIGIT1, 0 ;помещаем значение переменной DIGIT1 в аккумулятор
movwf PORTB ;выводим значение в порт В
устанавливаем задержку отображения
clrf TMR0 ;обнуляем таймер и
bcf INTCON, TOIF ;устанавливаем в 0 флаг прерывания по его переполнению
indc1 btfss INTCON, TOIF ;проверяем флаг прерывания по переполнению таймера
goto indc1 ;если флаг равен 0 (счетчик не переполнен)-выполняем проверку
;если флаг равен 1 (счетчик переполнен) - переходим к следующему
;индикатору
;-----------------------------------------------------выводим значение DIGIT2 на индикатор
movf DIGIT2, 0 ;помещаем значение переменной DIGIT1 в аккумулятор
indc2 btfss INTCON, TOIF ;проверяем флаг прерывания по переполнению таймера
goto indc2 ;если флаг равен 0 (счетчик не переполнен)-выполняем проверку
если флаг равен 1 (счетчик переполнен) - переходим к следующему индикатору
;-----------------------------------------------------выводим значение DIGIT3 на индикатор
movf DIGIT3, 0 ;помещаем значение переменной DIGIT3 в аккумулятор
;устанавливаем задержку отображения
indc3 btfss INTCON, TOIF ;проверяем флаг прерывания по переполнению таймера
goto indc3 ;если флаг равен 0 (счетчик не переполнен)-выполняем проверку
;если флаг равен 1 (счетчик переполнен)-
;---------------------------------------------------------------------------------------------------------
В первой части подпрограммы indication мы устанавливаем «биты точки и питания» индикаторов согласно схеме. В переменной DIGIT1 будет храниться значение дециметров от 0 до 9 т.к. используемые в схеме индикаторы являются семи сегментными с дополнительным выводом для десятичного разделителя – точки, в переменной DIGIT2 – значение метров, в переменной DIGIT3 – значение декаметров соответственно. Таким образом согласно схеме для отображения цифр на индикаторах через дешифратор используется всего четыре линии порта B: RB0, RB1, RB2, RB3 для передачи битов 0, 1, 2 и 3 соответственно. Вычисленные отображаемые значения будут храниться в переменных DIGIT1…3 поразрядно, для этого используется первые четыре бита каждой переменной. Линии RB4, RB5 и RB6 порта В мы используем для поочередной подачи питания на индикаторы. Линия RB4 на индикатор декаметров (отображение значения DIGIT3), RB5 на индикатор метров (отображение значения DIGIT2), RB6 на индикатор дециметров (отображение значения DIGIT1). Для этого мы используем следующие биты переменных: бит 6 - DIGIT1, бит 5 - DIGIT2 и бит 4 - DIGIT3 согласно схеме. Линия RB7 порта В используется для подачи сигнала на десятичную точку индикатора метров (переменная DIGIT2). Таким образом используется весь порт В и мы можем, заранее установив биты в переменных посылать их на порт В поочередно, соответственно поочередно подключая индикаторы. Для наглядности ниже приведен рисунок 10.
Рис. 10. Схема индикации.
Далее выводим значение DIGIT1 на порт В. Организуем задержку отображения на индикаторе при помощи таймера TMR0 на 256 мкс. Затем эту же процедуру производим для DIGIT2 и DIGIT3 отображая их значения на индикаторах.
Подпрограмма нажатия кнопки pressing
pressing ;подпрограмма обработки нажатия кнопки
btfss PORTA, 2 ;проверяем линию RA2 порта А (кнопку s2),
goto main1 ;если не нажата возвращаемся в программу (на indication)
goto main2 ;если нажата-возврат из подпрограммы
При выполнении этой подпрограммы происходит тестирование присутствия сигнала (+5В) на линии RA2 порта A. Если на линию поступает напряжение (кнопка нажата) – выполняется команда перехода в основную программу на соответствующую метку (main2). В противном случае (кнопка не нажата) переход осуществляется на другую метку основной программы (main2).
Страницы: 1, 2, 3, 4, 5, 6