Файл: Самоучитель по программированию 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