Отображение чисел с использованием 7-сегментного BCD

Моя задача - запрограммировать PIC16F1517 с помощью bcd 4511, чтобы отображать числа с 0 до 9999, используя прерывание от TMR0. Подсчет начинается после нажатия кнопки останова (RB0). Дисплей подключен к PORTD. Я использовал отладчик, чтобы увидеть, как он работает, но видел только числа, растущие как сумасшедшие и не бегло, так что не делайте, если это в правильном порядке. К сожалению, у меня нет вещи, чтобы увидеть, работает ли она. Может кто-нибудь проверить? Я использую MPLAB X IDE v4.01

#define LEL PORTC,4
#DEFINE LEH PORTC,5
#DEFINE BI PORTC,2

#include<p16f1517.inc>
    __CONFIG _CONFIG1 ,_FOSC_INTOSC & _WDTE_OFF & _PWRTE_ON & _MCLRE_ON & _CP_OFF & _BOREN_OFF &_CLKOUTEN_OFF
__CONFIG _CONFIG2 , _WRT_OFF & _VCAPEN_OFF & _LVP_OFF
WSKP EQU 0x30;least significant
WSKL EQU 0x31;most significant
ORG 0x00
clrf WSKP
clrf WSKL
goto settings
ORG 0x04

GOTO interupt
 settings
BANKSEL PORTB
CLRF PORTB
CLRF PORTC
CLRF PORTD
BANKSEL ANSELB
CLRF ANSELB
CLRF ANSELC
CLRF ANSELD
BANKSEL LATB
CLRF LATB
CLRF LATC
CLRF LATD
BANKSEL TRISB
MOVLW 0x01
MOVWF TRISB
CLRF TRISC
CLRF TRISD
BANKSEL OPTION_REG
bcf OPTION_REG, 5
bCf OPTION_REG, 3
bsf OPTION_REG, 2
bsf OPTION_REG, 1
bsf OPTION_REG, 0
BANKSEL PORTD
BCF BI
BSF LEL
BCF LEH
bsf PORTC,6
BSF BI

 START
btfsc PORTB,0
goto START
BANKSEL INTCON
BSF INTCON,7;GIE;7
BSF INTCON,5;TMR0IE
goto START

 interupt
bcf PORTC,6
incf WSKP,f
call check
call display
BANKSEL INTCON
bcf INTCON, 2;tmr0if
retfie

 check
MOVFW WSKP
ANDLW 0x0f;check if wskp=10,20,...,90 if so add 0x06 to display correct number
SUBLW 0x0a
BTFSS STATUS,Z
return
MOVLW 0x06
ADDWF WSKP,f
GOTO check1

 check1
movfw WSKP
ANDLW 0xF0;check if wskp=100 if so cleat it and increment wskl
SUBLW 0x60
BTFSS STATUS, Z
RETURN
clrf WSKP
incf WSKL,f
movfw WSKL
andlw 0x0F;check if wskl=10,20,...,90 if so add 0x06 to display correct number
sublw 0x0A
btfss STATUS, Z
RETURN
movlw 0x06
addwf WSKL, f
movfw WSKL
andlw 0xf0;if wskl=100 that means we displayed 9999 then clear to start counting from 0
sublw 0x60
btfss STATUS, Z
RETURN
clrf WSKP
CLRF WSKL
return

 display
bcf BI
bsf LEL
bcf LEH
movfw WSKP
movwf PORTD
bcf LEL
bsf LEL
movfw WSKL
movwf PORTD
bcf LEH
bsf LEH
bsf BI
return
END 

1 ответ

Прежде всего, я предлагаю вам также инициировать INTCON зарегистрироваться, чтобы избежать непредсказуемого поведения.

После этого я думаю, что проблема в коде MainLoop и Interrupt. Для MainLoop вы устанавливаете банк памяти для INTCON но не для PORTB; для процедуры прерывания вы не устанавливаете банк памяти при запуске и не устанавливаете банк памяти при запуске check, check1 а также display код. Таким образом, все переменные, которые вы читаете, записываете и тестируете, должны находиться в одном банке памяти INTCON, Вы уверены, что это так?

Другие вопросы по тегам