Самоучитель по программированию PIC контроллеров для начинающих (Е.А. Корабельников,2008). Самоучитель по программированию PIC контроллеров для начинающих. Система команд pic16F84A 26 Что такое программа иправила ее составленияПример создания программы автоколебательного мультивибратораДирективы.
![]()
|
; Универсальная "заготовка" программы, включающей в себя группу подпрограмм динамической индикации в комплексе с группой ; подпрограмм преобразований двоичных чисел в двоично - десятичные ; для случая разрядной динамической индикации в линейке из ми сегментных индикаторов с применением внешнего дешифратора адресного кода 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. ;------------------------------------------------------------------------------- |