Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсовой(Даше).doc
Скачиваний:
5
Добавлен:
22.09.2019
Размер:
239.1 Кб
Скачать
  1. Исходный код программы

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 для устройства собранного на микроконтроллере.

Эту программу используют для прошивки микроконтроллера.

В данной программе можно легко изменить режимы работы, заменив или дописав небольшие куски исходного кода.

Также данная программа может быть доработана для повышения функциональности устройства.

Данная программа не портируется на другие микроконтроллеры.