Исходный код программы
list p=pic16f877A
#include <P16F877a.inc>
ERRORLEVEL 2 ; вывод только ошибок
;------------ Настройка слова конфигурации микроконтроллера
; _CP_OFF защита программного кода выключена
; _DEBUG_OFF режим отладки выключен
; _WRT_OFF защита записи FLASH выключена
; _CPD_OFF защита памяти EEPROM выключена
; _LVP_OFF режим низковольтового программирования выключен
; _BODEN_ON сброс по снижению питания включен
; _PWRTE_ON таймер задержки по включению питания включен
; _HS_OSC использование кварцевого резонатора на 16МГц
__CONFIG _CP_OFF&_DEBUG_OFF&_WDT_OFF&_CPD_OFF&_LVP_OFF&_BODEN_ON&_PWRTE_ON&_LP_OSC&_WRT_OFF
;------------ Задание переменных ---------------------------
; #include <defs.inc> ; описание переменных, констант
; #include <macro.inc> ; макросы и процедуры
W_SAVE EQU 0x70 ; для регистра W в прерываниях
STATUS_SAVE EQU 0x71 ; для регистра STATUS в прерываниях
FSR_SAVE EQU 0x72 ; для регистра FSR в прерываниях
PCLATH_SAVE EQU 0x73 ; для регистра PCLATH в прерываниях
DX EQU 0X20 ;СЧЁТЧИК В ТАБЛИЦАХ РЕЖИМАХ
DX_N EQU 0X23 ;СЧЁТЧИК В ТАБЛИУЕ ВРЕМЕНИ
DXTMR EQU 0X22 ;ЗНАЧЕНИЕ ВРЕМЕНИ
DX2 EQU 0X21 ;ИНДИКАТОР РЕЖИМА
;------------ Начало программы ---------------------------
ORG 0x00 ; вектор сброса процессора
PAGESEL MAIN ; 0-я страница памяти
GOTO MAIN ; переход на начало программы
ORG 0x04 ; вектор прерываний
MOVWF W_SAVE ; сохраняем W, STATUS, PCLATH, FSR
MOVF STATUS,W ; регистр STATUS загрузить в аккумулятор
CLRF STATUS ; установка банка 0
MOVWF STATUS_SAVE ; регистр STATUS сохранить в STATUS_SAVE
MOVF PCLATH,W ; загрузить PCLATH в аккумулятор
MOVWF PCLATH_SAVE ; регистр PCLATH сохранить в PCLATH_SAVE
MOVF FSR,W ; загрузить FSR в аккумулятор
MOVWF FSR_SAVE ; регистр FSR сохранить в FSR_SAVE
;
;;------------ Определение источника прерываний -------------
BANKSEL INTCON ; 0 банк
INTTYPE0 ; ОБРАБОТКА ПРЕРЫВАНИЯ ПО ПЕРЕПОЛНЕНИЮ TMR0
BTFSS INTCON,T0IF ; если флаг прерывания установлен, то пропускаем строку
GOTO INTTYPE1 ; иначе переход на следующий обработчик
GOTO PROV
INTTYPE1 ; ОБРАБОТКА ПРЕРЫВАНИЯ ОТ RB7:RB4
BTFSC INTCON,RBIF ; если флаг прерывания установлен, то пропускаем строку
GOTO PROVERKA ; иначе переход на следующий обработчик
GOTO EXITINT
PROVERKA ;ПРОВЕРКА НАЖАТИЯ КНОПОК RB4-RB5
MOVF PORTB,4
BTFSC PORTB,4
GOTO TAIMER_VKL
BTFSC PORTB,5
CALL TMR_VREMA
GOTO EXITINT
PROV ;ПРОВЕРКА НАЖАТИЯ КНОПКИ RB4
BTFSC PORTB,4
GOTO VKL
BANKSEL OPTION_REG
MOVLW B'01111111'
MOVWF OPTION_REG
GOTO EXITINT
VKL ;СПЯЩИЙ РЕЖИМ
CLRF PORTC
SLEEP
BTFSS PORTB,4
SLEEP
BANKSEL OPTION_REG
MOVLW B'01111111'
MOVWF OPTION_REG
GOTO EXITINT3
TMR_VREMA ;ИЗМЕНЕНИЕ СКОРОСТИ МИГАНИЯ
CALL TABL
MOVWF DXTMR
RETURN
TABL ;ТАБЛИЦА ВРЕМЕНИ
MOVF DX_N,W
INCF DX_N
ADDWF PCL
RETLW B'00110101'
RETLW B'00100101'
RETLW B'00010101'
CLRF DX_N
RETLW B'00001110'
PRERVAT_PRERV
MOVLW B'10101000' ;РАЗРЕШЕНИЕ ПРЕРЫВАНИЙ
MOVWF INTCON
RETURN
;; ВЫХОД ИЗ ОБРАБОТЧИКА ПРЕРЫВАНИЙ
EXITINT
CLRF STATUS ; установка банка 0
CALL PRERVAT_PRERV
MOVFW FSR_SAVE ; загрузить FSR_SAVE в аккумулятор
MOVWF FSR ; восстановить значение регистра FSR
MOVFW PCLATH_SAVE ; загрузить PCLATH_SAVE в аккумулятор
MOVWF PCLATH ; восстановить значение регистра PCLATH
MOVFW STATUS_SAVE ; загрузить STATUS_SAVE в аккумулятор
MOVWF STATUS ; восстановить значение регистра STATUS
SWAPF W_SAVE, F ; восстановить значение аккумулятора
SWAPF W_SAVE, W ; не изменяя значения регистра STATUS
RETFIE ; выход из прерывания
MAIN
;-------------------- Инициализация ------------------------
; настройка порта А
; BANKSEL ADCON1 ; выбрать банк 1 + отключение АЦП
; MOVLW B'00000111' ; все выводы порта A (E) - цифровые входы/выходы
; MOVWF ADCON1
; MOVLW B'00000000' ; все выводы порта А - выходы
; MOVWF TRISA
; BANKSEL PORTA ; выбрать банк 0
; MOVLW B'00110000' ; выставление пассивной "1" на 4 и 5 ножке порта А
; MOVF PORTA ; запись значения в порт А
; настройка порта B
BANKSEL TRISB ; выбрать банк 1
CLRF TRISB
MOVLW B'11111111' ; все выводы порта B - выходы, RB0- вход
MOVWF TRISB
BANKSEL PORTB ; выбрать банк 0
CLRF PORTB ; обнуление порта В
; настройка порта C
BANKSEL TRISC ; выбрать банк 1
CLRF TRISC ; настроить все выводы PORTC как выходы
BANKSEL PORTC ; выбрать банк 0
CLRF PORTC ; очистить PORTC
; настройка порта D
; MOVLW B'00000000' ; настроить все вывода порта D как выходы
; BANKSEL TRISD ; выбрать банк 1
; MOVWF TRISD ; порт D - вход
; BANKSEL PORTD ; выбрать банк 0
; CLRF PORTD ; обнуление порта D
;; настройка порта E
; BANKSEL TRISE ; выбрать банк 1
; MOVLW 0x00 ; TRISE => uuu0x000
; ANDWF TRISE, f ; (IBF:OBF:IBOV:PSPMODE:-:TRISE2:TRISE1:TRISE0)
; BANKSEL PORTE ; выбрать банк 0
; MOVLW B'00000111' ; установка значений на выводах порта Е
; MOVWF PORTE ;
;-------------установка начальных значений------------------
;---------------------- Прерывания -------------------------
; глобальное разрешение прерываний INTCON:GIE=1
; запрещение немаскированных прерываний от периферийных модулей INTCON:PEIE=0
; разрешение прерываний по переполнению от TMR0 INTCON:T0IE=1
; разрешение прерывания от RB0 INTCON:INTE=1
; запрещение прерываний от RB7:RB4 INTCON:RBIE=0
NACHALO_1
BANKSEL INTCON ; выбор банка 0
MOVF PORTB,4
MOVF PORTB,5
MOVLW B'10101000' ; настройка INTCON (GIE:PEIE:T0IE:INTE:RBIE:T0IF:INTF:RBIF)
MOVWF INTCON
CLRF DX_N
MOVLW B'00001110'
MOVWF DXTMR
CLRF DX2
GOTO NACHALO
;
;--------------- Основной цикл программы -------------------
EXITINT3 ;ВЫХОД ИЗ ПРЕРЫВАНИЯ C ВОЗВРАТОМ НА ОСНОВНОЙ ЦИКЛ
CLRF STATUS ; установка банка 0
MOVFW FSR_SAVE ; загрузить FSR_SAVE в аккумулятор
MOVWF FSR ; восстановить значение регистра FSR
MOVFW PCLATH_SAVE ; загрузить PCLATH_SAVE в аккумулятор
MOVWF PCLATH ; восстановить значение регистра PCLATH
MOVFW STATUS_SAVE ; загрузить STATUS_SAVE в аккумулятор
MOVWF STATUS ; восстановить значение регистра STATUS
SWAPF W_SAVE, F ; восстановить значение аккумулятора
SWAPF W_SAVE, W ; не изменяя значения регистра STATUS
GOTO NACHALO_1
EXITINT2 ;ВЫХОД ИЗ ПРЕРЫВАНИЯ C ВОЗВРАТОМ НА ОСНОВНОЙ ЦИКЛ
CLRF STATUS ; установка банка 0
CALL PRERVAT_PRERV
MOVFW FSR_SAVE ; загрузить FSR_SAVE в аккумулятор
MOVWF FSR ; восстановить значение регистра FSR
MOVFW PCLATH_SAVE ; загрузить PCLATH_SAVE в аккумулятор
MOVWF PCLATH ; восстановить значение регистра PCLATH
MOVFW STATUS_SAVE ; загрузить STATUS_SAVE в аккумулятор
MOVWF STATUS ; восстановить значение регистра STATUS
SWAPF W_SAVE, F ; восстановить значение аккумулятора
SWAPF W_SAVE, W ; не изменяя значения регистра STATUS
GOTO NACHALO
NACHALO ;Таблица режимов
MOVF DX2,W
INCF DX2
ADDWF PCL
GOTO REJIM_0
GOTO REJIM_1
GOTO REJIM_2
CLRF DX2
GOTO REJIM_3
REJIM_0 ;РЕЖИМ 0
CLRF DX
CIKL_0
CALL CHISLO_TABL_0 ; 3 ИЗМЕНЕНИЙ МИГАНИЯ ГИРЛЯНДЫ
MOVWF PORTC
CALL TAIMER
GOTO CIKL_0
CHISLO_TABL_0 ;ТАБЛИЦА РЕЖИМА 0
MOVF DX,W
INCF DX
ADDWF PCL
RETLW B'11111111'
RETLW B'10101010'
RETLW B'01010101'
GOTO REJIM_0
REJIM_1 ;РЕЖИМ 1
CLRF DX
CIKL_1
CALL CHISLO_TABL_1 ; 26 ИЗМЕНЕНИЙ МИГАНИЯ ГИРЛЯНДЫ
MOVWF PORTC
CALL TAIMER
GOTO CIKL_1
CHISLO_TABL_1 ;ТАБЛИЦА РЕЖИМА 1
MOVF DX,W
INCF DX
ADDWF PCL
RETLW B'10000000'
RETLW B'01000000'
RETLW B'00100000'
RETLW B'10010000'
RETLW B'01001000'
RETLW B'00100100'
RETLW B'10010010'
RETLW B'01001001'
RETLW B'00100100'
RETLW B'00010010'
RETLW B'00001001'
RETLW B'00000100'
RETLW B'00000010'
RETLW B'00000001'
RETLW B'00000010'
RETLW B'00000100'
RETLW B'00001001'
RETLW B'00010010'
RETLW B'00100100'
RETLW B'01001001'
RETLW B'10010010'
RETLW B'00100100'
RETLW B'01001000'
RETLW B'10010000'
RETLW B'00100000'
RETLW B'01000000'
GOTO REJIM_1
REJIM_2 ;РЕЖИМ 2
CLRF DX
CIKL_2
CALL CHISLO_TABL_2 ; 7 ИЗМЕНЕНИЙ МИГАНИЯ ГИРЛЯНДЫ
MOVWF PORTC
CALL TAIMER
GOTO CIKL_2
CHISLO_TABL_2 ;ТАБЛИЦА РЕЖИМА 2
MOVF DX,W
INCF DX
ADDWF PCL
RETLW B'10000001'
RETLW B'11000011'
RETLW B'11100111'
RETLW B'01111110'
RETLW B'00111100'
RETLW B'00011000'
RETLW B'00000000'
GOTO REJIM_2
REJIM_3 ;РЕЖИМ 3
CLRF DX
CIKL_3
CALL CHISLO_TABL_3 ; 13 ИЗМЕНЕНИЙ МИГАНИЯ ГИРЛЯНДЫ
MOVWF PORTC
CALL TAIMER
GOTO CIKL_3
CHISLO_TABL_3 ;ТАБЛИЦА РЕЖИМА 3
MOVF DX,W
INCF DX
ADDWF PCL
RETLW B'11111111'
RETLW B'01111111'
RETLW B'00111111'
RETLW B'00011111'
RETLW B'00001111'
RETLW B'00000111'
RETLW B'00000011'
RETLW B'00000001'
RETLW B'00000000'
RETLW B'00000001'
RETLW B'00000011'
RETLW B'00000111'
RETLW B'00001111'
RETLW B'00011111'
RETLW B'00111111'
RETLW B'01111111'
GOTO REJIM_3
TAIMER ;ТАЙМЕР ЗАДЕРЖКИ
banksel T2CON
MOVF DXTMR,W
MOVWF T2CON
CLRF TMR2
BCF PIR1,TMR2IF
BTFSS PIR1,TMR2IF
GOTO $-1
RETURN
TAIMER_VKL ;ТАЙМЕР ВЫКЛЮЧЕНИЯ
banksel OPTION_REG
MOVLW B'00000110'
MOVWF OPTION_REG
banksel TMR0
CLRF TMR0
BCF INTCON,T0IF
GOTO EXITINT2
END
Вывод
Написана программа в среде MPLAB IDE v8.84 на языке ассемблера MPASM v5.44 для устройства собранного на микроконтроллере.
Эту программу используют для прошивки микроконтроллера.
В данной программе можно легко изменить режимы работы, заменив или дописав небольшие куски исходного кода.
Также данная программа может быть доработана для повышения функциональности устройства.
Данная программа не портируется на другие микроконтроллеры.