Доброе время суток жители форума.)
Мне нужна помощь, в универе задали лабараторку заключающаяся в том что бы написать код для мигания диодов на мк pic16f877. Я плохо шарю в написании кода и нужна помощь высших умов.)
Загвоздка в том что надо сделать так что бы 8 диодов было подключено к разным портам 3 к A, 3 к B и 2 к C, и плюс к этому еще и мигал последовательно по 2 диода.
Я попытался что-то как то прогуглить но увы.
Вот код который я склепал:
вот еще файлы в мплаб и схема в протеусе:
3.rar 49 Кб
31 раз скачано
Буду очень благодарен если кто-то откликнется и объяснит мне что надо исправить и что дописать в коде.
Раздел: МК для начинающих
Мне нужна помощь, в универе задали лабараторку заключающаяся в том что бы написать код для мигания диодов на мк pic16f877. Я плохо шарю в написании кода и нужна помощь высших умов.)
Загвоздка в том что надо сделать так что бы 8 диодов было подключено к разным портам 3 к A, 3 к B и 2 к C, и плюс к этому еще и мигал последовательно по 2 диода.
Я попытался что-то как то прогуглить но увы.
Вот код который я склепал:
list p=16F877
#include <p16F77.inc>
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON &_HS_OSC
CBLOCK 0x0C
w_temp,status_temp,tik , scan ; Определяем регистры
scantemp ,CAT_1 , CAT_2 ,CAT_3 ,CAT_4 ; и переменные
ENDC ;
OPTION_SETUP EQU B'00000110' ; Резисторы подтяжки
; включены ,предделитель
; к TMR0 1:16 , приращение
; от внутреннего источника
ORG 0x000 ; Вектор сброса
goto init
ORG 0x004 ; Вектор прерывания
movwf w_temp ; Сохраняем временно
movf STATUS,w ; STATUS регистр и
movwf status_temp ; аккумулятор
INCF tik,f ; Увеличим счетчик
; (пока он считает только
; прерывания)
BCF STATUS, RP0
RLF scan,W ; Движок мультиплексора
BTFSS scan,0 ; индикатора
MOVF CAT_1,W ;
BTFSS scan,1 ;
MOVF CAT_2,W ;
BTFSS scan,2 ;
MOVF CAT_3,W ;
BTFSS scan,3 ;
MOVF CAT_4,W ;
MOVWF scantemp ;
CLRF PORTB ;
RLF scan ;
MOVF scan,W
ANDLW 0FH ; Маскируем 4
MOVWF PORTA ; разряд PORTA для
MOVF scantemp,W ; будущего
MOVWF PORTB ;
MOVWF PORTC
movlw 0XAA ; В TMR0 костанту
movwf TMR0 ; отсчета
bcf INTCON,T0IF ; Сбросим флаг чтобы
; при выходе из прерывания
; сразу же не попасть в него
movf status_temp,w ; Востановим сохраненые нами
movwf STATUS ; регистры и вернемся из
swapf w_temp,f ; прерывания
swapf w_temp,w ;
retfie ;
init
clrf PORTB
clrf PORTA
clrf PORTC ; Очищаем спецрегистры
clrf TMR0 ;
bsf STATUS, RP0 ;
MOVLW OPTION_SETUP ;
movwf OPTION_REG ;
movlw B'00011111' ; и делаем все биты PORTB
movwf TRISB ; выходами
movlw B'00111111' ; биты 0-4 PORTC выходы
movwf TRISC ;
movlw B'11111000' ; биты 0-4 PORTC выходы
movwf TRISA
bcf STATUS, RP0 ;
clrf INTCON ;
movlw 0x0C ;
movwf FSR ;
clear_mem
; Чистим регистры
clrf INDF ; пользователя
incf FSR, F ;
btfss FSR, 6 ;
goto clear_mem ;
clrf FSR ;
movlw 0EEh ; Грузим в scan
MOVWF scan ; первоначальное состояние
movwf PORTA ; катодов индикатора
movlw 0XAA ; В TMR0 точку отсчета
movwf TMR0 ;
movlw b'10100000' ; Разрешаем прерывания
movwf INTCON ; от TMR0 и общее
GOTO MAIN ; и переходим на основной цикл
MAIN
movlw b'11000000';0x03 ; грузим значения для индикаторов
movwf CAT_1 ; и зацикливаемся навсегда
movlw b'00110000';0X0C
movwf CAT_2
movlw b'00001100';0X30
movwf CAT_3
movlw b'00000011';0xC0
movwf CAT_4
LOOP NOP
NOP
GOTO LOOP
END
вот еще файлы в мплаб и схема в протеусе:
3.rar 49 Кб
31 раз скачано
Буду очень благодарен если кто-то откликнется и объяснит мне что надо исправить и что дописать в коде.
Раздел: МК для начинающих