Файл: Самоучитель по программированию PIC контроллеров для начинающих (Е.А. Корабельников,2008).pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 16.06.2025

Просмотров: 3602

Скачиваний: 3

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

1. Убрать регистры LED4...7, а регистры LED0...3 оставить.

2.Убрать регистры TimerH и TimerHH, а регистры TimerL и TimerM оставить. Таким образом, группа ПП формирования двоичного числа должна быть рассчитана на формирование 2-байтного, двоичного числа, которое должно

"лежать" в регистрах TimerL и TimerM.

Врабочей части программы

3.Заменить константу 8х4=.32 на константу 8х2=.16.

4.Убрать 4 команды clrf LED4...7.

5.Убрать 4 команды rlf TimerH,F, rlf TimerHH,F, rlf LED2,F, rlf LED3,F.

6.В группе команд распределения полубайтов, убрать первые 4 (сверху) группы команд распределения.

7.В ПП adjDEC, убрать 3-ю и 4-ю (сверху) группы команд (movlw, movwf, call).

Таким же образом, можно "переоборудовать" ПП Bin2_10 под любое количество знакомест. Если учесть, что такого же рода "переоборудование" можно произвести и в ПП динамической индикации (об этом говорилось ранее), то в комплексе, получается именно то, что нужно.

А теперь сведем то, с чем мы разбирались по частям, к единому целому.

Получается некая "универсальная заготовка" с названием Din_Bin.asm (находится в папке "Тексты программ").

Она выглядит так:

;********************************************************************************

; Din_Bin.asm

Универсальная "заготовка" программы, включающей в себя группу

;

подпрограмм динамической индикации в комплексе с группой

;

подпрограмм преобразований двоичных чисел в двоично-десятичные

;

для случая 8-разрядной динамической индикации в линейке из 8-ми

;

7-сегментных индикаторов с применением внешнего дешифратора

;

адресного кода 555ИД7.

;******************************************************************************** ; "ШАПКА ПРОГРАММЫ"

;================================================================================

LIST

p=16F84a

;

Определение типа микроконтроллера.

__CONFIG

.....

;

Биты конфигурации.

;.............................................................

;================================================================================

; Определение положения регистров специального назначения.

;================================================================================

Indf

equ

00h

; Регистр Indf.

PC

equ

02h

; Счетчик команд.

Status

equ

03h

; Регистр Status.

FSR

equ

04h

; Регистр FSR.

PortA

equ

05h

; Регистр управления защелками порта А.

PortB

equ

06h

; Регистр управления защелками порта В.

;.............................................................

;================================================================================

; Определение названия и положения регистров общего назначения.

;================================================================================

LED0

equ

10h

; Регистр хранения результатов преобразований

; 1-го двоично-десятичного разряда.

LED1

equ

11h

; -------

2-го -------------------------

LED2

equ

12h

; -------

3-го -------------------------

LED3

equ

13h

; -------

4-го -------------------------

LED4

equ

14h

; -------

5-го -------------------------

LED5

equ

15h

; -------

6-го -------------------------

LED6

equ

16h

; -------

7-го -------------------------

LED7

equ

17h

; -------

8-го -------------------------

254


Index

equ

0Ch

; Регистр счетчика

количества

; малых колец индикации.

Count

equ

0Dh

; Регистр счетчика

количества больших колец

; индикации. Он же

- счетчик проходов.

Temp

equ

0Fh

; Регистр временного хранения данных.

Mem

equ

1Fh

; Регистр оперативной памяти.

TimerL

equ

1Bh

; Регистр младшего

разряда 4-байтного

; двоичного числа.

TimerM

equ

1Ch

; Регистр среднего

разряда 4-байтного

; двоичного числа.

TimerH

equ

1Dh

; Регистр старшего

разряда 4-байтного

; двоичного числа.

TimerHH

equ

1Eh

; Регистр самого старшего разряда 4-байтного

; двоичного числа.

;.............................................................

;================================================================================

; Определение места размещения результатов операций.

;================================================================================

W

equ

0

;

Результат

направить

в

аккумулятор.

F

equ

1

;

Результат

направить

в

регистр.

;================================================================================

; Присваивание битам названий.

;================================================================================

C

equ

0

;

Флаг

переноса-заёма.

Z

equ

2

;

Флаг

нулевого результата.

;.............................................................

;================================================================================

; Присвоение константам названий.

;================================================================================

Const1

equ

Y1

; Y1

-

значение

времязадающей

константы

; "грубо"

(до

.255). Задается

программистом.

Const2

equ

Y2

;

Y2

-

значение

времязадающей

константы

;

"точно"

(до

.255). Задается

программистом.

;.............................................................

;================================================================================

org

0

;

Начать выполнение программы

goto

START

;

с подпрограммы START.

;********************************************************************************

;******************************************************************************** ; РАБОЧАЯ ЧАСТЬ ПРОГРАММЫ

;******************************************************************************** START .....................................

;

.....................................

NEW

call

Bin2_10

;

Условный переход в ПП Bin2_10

;

Адрес следующей команды закладывается в стек

; .....................................

; .....................................

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

;ГРУППА ПОДПРОГРАММ 8-РАЗРЯДНОЙ ДИНАМИЧЕСКОЙ ИНДИКАЦИИ без ПП TABLE

;(группа команд ПП TABLE находится в самом конце текста программы).

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

;На данный момент, регистры LED0 ... LED7 заполнены двоично-десятичными числами,

;которые необходимо вывести на индикацию (отобразить) в линейку из 8-ми

;7-сегментных индикаторов.

;На момент начала группы подпрограмм динамической индикации, все прерывания

;должны быть запрещены, все выводы порта В и первые 3 вывода порта А должны быть

;настроены на работу "на выход", работа должна происходить в нулевом банке.

;********************************************************************************

;Подготовка счетчика количества малых колец индикации Index к началу полного

;цикла динамической индикации.

;--------------------------------------------------------------------------------

clrf

Index

;

Сброс в

0

содержимого счетчика малых колец

;

индикации

Index.

;--------------------------------------------------------------------------------

; Предварительная закладка количества

больших

колец индикации, которое нужно

255


; "пройти" за один полный цикл динамической индикации в регистр Count.

;--------------------------------------------------------------------------------

movlw

X

; Запись константы

X (количество больших

; колец индикации,

задается программистом),

; в регистр

W.

movwf

Count

; Копирование содержимого регистра W,

; в регистр

счетчика количества больших колец

; индикации

Count.

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

;Использование косвенной адресации при работе с таблицей данных.

;================================================================================

;Подготовка к косвенной адресации: запись в регистр W адреса регистра младшего

;разряда линейки 7-сегментных индикаторов ("привязка" к 7-сегментному

;индикатору, с активации которого начинается полный цикл первого большого

;кольца индикации).

;--------------------------------------------------------------------------------

CYCLE

movlw

LED0

; Запись в регистр W адреса регистра LED0.

addwf

Index,W

; Увеличение адреса регистра LED0 на величину

; числа, записанного в регистре счетчика

; количества малых колец индикации Index,

; c сохранением результата в регистре W.

;--------------------------------------------------------------------------------

; Косвенная

адресация.

;--------------------------------------------------------------------------------

movwf

FSR

; Копирование содержимого регистра W

; в регистр FSR.

movf

Indf,W

; Копирование содержимого регистра с адресом,

; записанным в регистре FSR, в регистр W.

call

TABLE

; Условный переход (адрес следующей команды

; закладывается в стек) в ПП TABLE.

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

; Группа команд установки запятой.

;

--------------------------------------------------------------------------------

;---

> Возврат по стеку из ПП TABLE

movwf

Temp

; Копирование содержимого регистра W (7-

; сегментные коды индицируемых двоично-

; десятичных чисел) в регистр Temp.

movlw

5

; Запись в регистр W константы .05.

bsf

Status,Z

; Поднятие флага нулевого результата Z.

subwf

Index,W

; Вычесть содержимое регистра W (число .05)

; из содержимого регистра Index

; (числа от .00 до .07).

btfss

Status,Z

; Проверка состояния флага Z.

goto

No_Dot

; Если флаг Z опущен (результат операции

; не=0), то переход в ПП No_Dot

; (запятая не выставляется).

bsf

Temp,7

; Если флаг Z поднят (результат операции=0),

; то установка в единицу 7-го бита

; (установка запятой) регистра Temp.

;--------------------------------------------------------------------------------

; Группа команд вывода десятичной цифры на индикацию.

;--------------------------------------------------------------------------------

No_Dot

movf

Temp,W

; Копирование содержимого регистра Temp

; (7-сегментные коды индицируемых двоично-

; десятичных чисел) в регистр W.

movwf

PortB

; Копирование содержимого регистра W

; в 8 защелок порта В.

;--------------------------------------------------------------------------------

; Группа команд формирования адресного кода управления дешифратором.

;--------------------------------------------------------------------------------

movf

Index,W

; Копирование содержимого регистра Index

; в регистр W.

movwf

PortA

; Копирование содержимого регистра W в первые

; 3 защелки порта А (работа "на выход"),

; управляющие адресными входами внешнего

; дешифратора.

256


;--------------------------------------------------------------------------------

;Группа команд задержки, определяющей время нахождения одного 7-сегментного

;индикатора в активном состоянии (определяющей время прохождения малого кольца

;индикации). "Грубое" формирование времени полного цикла динамической индикации.

;--------------------------------------------------------------------------------

movlw

Const1

; Запись в регистр W константы Y1 (см"шапку")

movwf

Temp

; Копирование содержимого регистра W

; в регистр Temp.

PAUSE

decfsz

Temp,F

; Декремент содержимого регистра Temp c

; сохранением результата в нем же.

goto

PAUSE

; Если результат декремента не=0,

; то переход в ПП PAUSE.

; Если результат декремента =0,

; то программа исполняется далее.

;--------------------------------------------------------------------------------

; Увеличение на 1 содержимого счетчика количества малых колец индикации Index с

; последующей проверкой результата инкремента на

равенство (или нет) числу .08.

;--------------------------------------------------------------------------------

incf

Index,F

; Увеличение

на

1 содержимого регистра Index

; с сохранением

результата в нем же.

movlw

.08

; Запись в регистр W константы .08.

bcf

Status,Z

; Сброс флага нулевого результата Z.

subwf

Index,W

; Вычесть из

содержимого регистра Index

; содержимое

регистра W, с сохранением

; результата

в регистре W.

btfss

Status,Z

; Результат операции вычитания равен

; или нет нулю?

goto

CYCLE

; Если не =0

регистре Index - число не

; равное 8),

то

переход к циклу активации

; следующего

по

старшинству 7-сегментного

; индикатора

(переход на новое малое кольцо

; индикации,

то

есть, в ПП CYCLE).

; Если =0 (в

регистре Index - число равное

; 8), то программа исполняется далее.

;--------------------------------------------------------------------------------

;Начало перехода на новое большое кольцо индикации после того, как

;последовательно активизируются все 8 7-сегментных индикатора линейки

;(после прохождения 8-ми малых колец индикации).

;--------------------------------------------------------------------------------

nop

;

Выравнивающий NOP.

clrf

Index

;

Сброс в 0 содержимого регистра Index.

;--------------------------------------------------------------------------------

; Уменьшение на 1 содержимого счетчика количества больших колец индикации Count.

;--------------------------------------------------------------------------------

decfsz

Count,F

; Декремент содержимого счетчика количества

; больших колец индикации Count, с

; сохранением результата в нем же.

goto

CYCLE

; Если

результат декремента не=0, то переход

; в ПП

CYCLE

; (переход на новое большое кольцо

индикации)

; Если

результат декремента =0, то

программа

; исполняется далее (переход на новый полный

; цикл

динамической индикации).

nop

; Выравнивающий NOP.

;================================================================================

;Группы подпрограмм и команд, осуществляющие различные операции.

;================================================================================

;"Точное" формирование времени полного цикла динамической индикации (если

;требуется точно калиброванное время полного цикла динамической индикации для

;использования его в качестве измерительного интервала).

;--------------------------------------------------------------------------------

movlw

Const2

; Запись в регистр W константы Y2 (см"шапку")

movwf

Temp

; Копирование содержимого регистра W

; в регистр Temp.

PAUSE_1

decfsz

Temp,F

; Декремент содержимого регистра Temp с

; сохранением результата в нем же.

257


goto

PAUSE_1

; Если результат декремента не=0,

; то переход в ПП PAUSE_1.

; Если результат декремента =0,

; то программа исполняется далее.

;--------------------------------------------------------------------------------

; Гашение активного разряда линейки.

;--------------------------------------------------------------------------------

movlw

0

; Запись в регистр W константы .00.

movwf

PortB

; Сброс в 0 всех защелок порта В.

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ГРУППА ПОДПРОГРАММ ФОРМИРОВАНИЯ 4-БАЙТНОГО ДВОИЧНОГО ЧИСЛА.

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

;....

.....................................

;

..................................... ЗДЕСЬ МОГУТ БЫТЬ РЕАЛИЗОВАНЫ

;

..................................... РАЗЛИЧНЫЕ "ФАНТАЗИИ"

;

..................................... ПРОГРАММИСТА

;К этому моменту 4-байтное двоичное число (в регистре

;TimerL/TimerM/TimerH/TimerHH) должно быть сформировано для последующей

;обработки его в группе подпрограмм преобразования 4-байтных двоичных чисел

;в 8-разрядные десятичные числа.

goto

NEW

; Безусловный переход

на

метку NEW

;

подпрограммы START,

то

есть, начало нового

;

полного цикла "программы".

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

;ГРУППА ПОДПРОГРАММ ПРЕОБРАЗОВАНИЯ 4-БАЙТНЫХ ДВОИЧНЫХ ЧИСЕЛ

;В 8-РАЗРЯДНЫЕ ДЕСЯТИЧНЫЕ ЧИСЛА.

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

;Подготовка к преобразованию.

;================================================================================

Bin2_10

bcf

Status,C

;

Сброс флага переноса-заёма.

movlw

.32

;

Запись в регистр Count числа проходов

movwf

Count

;

преобразования, равного суммарному

;

количеству битов многоразрядного регистра

;

TimerL/TimerM/TimerH/TimerHH (8*4=32).

clrf

LED0

;

Сброс в 0 содержимого регистра LED0.

clrf

LED1

;

-------"------

LED1.

clrf

LED2

;

-------"------

LED2.

clrf

LED3

;

-------"------

LED3.

clrf

LED4

;

-------"------

LED4.

clrf

LED5

;

-------"------

LED5.

clrf

LED6

;

-------"------

LED6.

clrf

LED7

;

-------"------

LED7.

;-------------------------------------------------------------------------------

; Примечание: процесс преобразования

заканчивается при уменьшении числа проходов

; преобразования, которые заложены в регистр Count (.32), до нуля.

;================================================================================

; Циклический сдвиг влево.

;================================================================================

Loop16

rlf

TimerL,F

; Циклический сдвиг влево 4-байтного двоичного

rlf

TimerM,F

; числа, записанного в

группе регистров

rlf

TimerH,F

; TimerL/TimerM/TimerH/TimerHH,на одну позицию

rlf

TimerHH,F

; через бит С регистра

STATUS.

rlf

LED0,F

; Циклический сдвиг влево 4-байтного двоичного

rlf

LED1,F

; числа, записанного в

группе регистров

rlf

LED2,F

; LED0/LED1/LED2/LED3,

на одну позицию через

rlf

LED3,F

; бит С регистра STATUS.

decfsz

Count,F

; Декремент (-1) содержимого регистра Count с

; сохранением результата в нем же.

goto

adjDEC

; Если результат не=0,

то переход в ПП adjDEC

; Если результат =0, то программа исполняется

; далее.

;================================================================================

; Поразрядное распределение содержимого регистров LED0...3 (обоих

258