Самоучитель по программированию PIC контроллеров для начинающих (Е.А. Корабельников,2008). Самоучитель по программированию PIC контроллеров для начинающих. Система команд pic16F84A 26 Что такое программа иправила ее составленияПример создания программы автоколебательного мультивибратораДирективы.
Скачать 3.49 Mb.
|
; Универсальная "заготовка" программы, включающей в себя группу подпрограмм динамической индикации в комплексе с группой ; подпрограмм преобразований двоичных чисел в двоично - десятичные ; для случая разрядной динамической индикации в линейке из ми сегментных индикаторов с применением внешнего дешифратора адресного кода 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 ; Регистр хранения результатов преобразований ; го двоично - десятичного разряда. LED1 equ 11h ; ------- го ------------------------- LED2 equ 12h ; ------- го ------------------------- LED3 equ 13h ; ------- го ------------------------- LED4 equ 14h ; ------- го ------------------------- LED5 equ 15h ; ------- го ------------------------- LED6 equ 16h ; ------- го ------------------------- LED7 equ 17h ; ------- го ------------------------- 255 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 заполнены двоично - десятичными числами, ; которые необходимо вывести на индикацию (отобразить) в линейку из ми сегментных индикаторов. ; На момент начала группы подпрограмм динамической индикации, все прерывания должны быть запрещены, все выводы порта В и первые 3 вывода порта А должны быть настроены на работу "на выход, работа должна происходить в нулевом банке. ;******************************************************************************** ; Подготовка счетчика количества малых колец индикации Index к началу полного цикла динамической индикации. ;-------------------------------------------------------------------------------- clrf Index ; Сброс в 0 содержимого счетчика малых колец ; индикации Index. ;-------------------------------------------------------------------------------- ; Предварительная закладка количества больших колец индикации, которое нужно 256 ; "пройти" за один полный цикл динамической индикации в регистр Count. ;-------------------------------------------------------------------------------- movlw X ; Запись константы X (количество больших ; колец индикации, задается программистом, ; в регистр W. movwf Count ; Копирование содержимого регистра W, ; в регистр счетчика количества больших колец ; индикации Count. ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Использование косвенной адресации при работе с таблицей данных. ;================================================================================ ; Подготовка к косвенной адресации запись в регистр W адреса регистра младшего разряда линейки сегментных индикаторов (привязка" к сегментному индикатору, с активации которого начинается полный цикл первого большого кольца индикации. ;-------------------------------------------------------------------------------- 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 опущен (результат операции ; не, то переход в ПП No_Dot ; (запятая не выставляется. bsf Temp,7 ; Если флаг Z поднят (результат операции, ; то установка в единицу го бита ; (установка запятой) регистра Temp. ;-------------------------------------------------------------------------------- ; Группа команд вывода десятичной цифры на индикацию. ;-------------------------------------------------------------------------------- No_Dot movf Temp,W ; Копирование содержимого регистра Temp ; (сегментные коды индицируемых двоично- ; десятичных чисел) в регистр W. movwf PortB ; Копирование содержимого регистра W ; в 8 защелок порта В . ;-------------------------------------------------------------------------------- ; Группа команд формирования адресного кода управления дешифратором. ;-------------------------------------------------------------------------------- movf Index,W ; Копирование содержимого регистра Index ; в регистр W. movwf PortA ; Копирование содержимого регистра W впервые защелки порта А (работа "на выход, ; управляющие адресными входами внешнего ; дешифратора. 257 ;-------------------------------------------------------------------------------- ; Группа команд задержки, определяющей время нахождения одного сегментного индикатора в активном состоянии (определяющей время прохождения малого кольца индикации. "Грубое" формирование времени полного цикла динамической индикации. ;-------------------------------------------------------------------------------- movlw Const1 ; Запись в регистр W константы Y1 ( см " шапку ") movwf Temp ; Копирование содержимого регистра W ; в регистр Temp. PAUSE decfsz Temp,F ; Декремент содержимого регистра Temp c ; сохранением результата в нем же. goto PAUSE ; Если результат декремента не, ; то переход в ПП 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 - число неравное, то переход к циклу активации ; следующего по старшинству сегментного ; индикатора (переход на новое малое кольцо ; индикации, то есть, в ПП CYCLE). ; Если =0 (в регистре Index - число равное ; 8), то программа исполняется далее. ;-------------------------------------------------------------------------------- ; Начало перехода на новое большое кольцо индикации после того, как последовательно активизируются все 8 сегментных индикатора линейки (после прохождения ми малых колец индикации. ;-------------------------------------------------------------------------------- nop ; Выравнивающий NOP. clrf Index ; Сброс в 0 содержимого регистра Index. ;-------------------------------------------------------------------------------- ; Уменьшение на 1 содержимого счетчика количества больших колец индикации Count. ;-------------------------------------------------------------------------------- decfsz Count,F ; Декремент содержимого счетчика количества ; больших колец индикации Count, с ; сохранением результата в нем же. goto CYCLE ; Если результат декремента не, то переход ; в ПП CYCLE ; (переход на новое большое кольцо индикации) ; Если результат декремента =0, то программа ; исполняется далее (переход на новый полный ; цикл динамической индикации. nop ; Выравнивающий NOP. ;================================================================================ ; Группы подпрограмм и команд , осуществляющие различные операции. ;================================================================================ ; "Точное" формирование времени полного цикла динамической индикации (если требуется точно калиброванное время полного цикла динамической индикации для использования его в качестве измерительного интервала. ;-------------------------------------------------------------------------------- movlw Const2 ; Запись в регистр W константы Y2 ( см " шапку ") movwf Temp ; Копирование содержимого регистра W ; в регистр Temp. PAUSE_1 decfsz Temp,F ; Декремент содержимого регистра Temp с ; сохранением результата в нем же. 258 goto PAUSE_1 ; Если результат декремента не, ; то переход в ПП PAUSE_1. ; Если результат декремента =0, ; то программа исполняется далее. ;-------------------------------------------------------------------------------- ; Гашение активного разряда линейки. ;-------------------------------------------------------------------------------- movlw 0 ; Запись в регистр W константы .00. movwf PortB ; Сброс в 0 всех защелок порта В . ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ГРУППА ПОДПРОГРАММ ФОРМИРОВАНИЯ 4- БАЙТНОГО ДВОИЧНОГО ЧИСЛА . ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ;.... ..................................... ; ..................................... ЗДЕСЬ МОГУТ БЫТЬ РЕАЛИЗОВАНЫ ; РАЗЛИЧНЫЕ "ФАНТАЗИИ" ; ПРОГРАММИСТА К этому моменту 4- байтное двоичное число (в регистре TimerL/TimerM/TimerH/TimerHH) должно быть сформировано для последующей обработки его в группе подпрограмм преобразования 4- байтных двоичных чисел в разрядные десятичные числа. goto 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. ;------------------------------------------------------------------------------- |