Вторник, Май 26, 2020

Вывод числа на семисегментный индикатор PIC ASM

;Тут уже нормально выведем число на экран с помощью динамической индикации.Тоесть зажигаем один сегмент,тушим ,зажигаем следующий словно кадры в кино.Можете в программе задержки заменить число 4 на 255 и увидете как все на самом деле.)     
            LIST        P=16F628A
            INCLUDE     P16F628A.INC
            __CONFIG    _INTOSC_OSC_NOCLKOUT&_WDT_OFF&_PWRTE_ON&_MCLRE_OFF&_LVP_OFF
            ERRORLEVEL  -302
            CBLOCK      20H
            W_TEMP:1,STATUS_TEMP:1,FSR_TEMP:1
            J:1,K:1
            LED3:1,LED2:1,LED1:1,LED0:1
            TEMPL:1,TEMPH:1
            COUNT:1,MEM:1,CATOD:1,INDEX:1
            ENDC
BANK0       MACRO
            BCF         STATUS,RP0
            BCF         STATUS,RP1
            ENDM
BANK1       MACRO
            BSF         STATUS,RP0
            BCF         STATUS,RP1
            ENDM
            ORG         0
            GOTO        START
            ORG         4
            GOTO        ISR
START       MOVLW       7
            MOVWF       CMCON

            CLRF        PORTB
            CLRF        PORTA
            BANK1
            MOVLW       B'11110000'
            MOVWF       TRISA
            MOVLW       B'00000001'
            MOVWF       TRISB
            BANK0
            
            MOVLW       B'00000100'
            MOVWF       TEMPH       ;Загружаем старший байт
            MOVLW       B'11010010'
            MOVWF       TEMPL       ;Загружаем младший байт
            CALL        BIN2BCD     ;На выходе в LED0-LED3 наше число
            
MAIN        MOVLW       LED3        ;Загружаем в FSR
            MOVWF       FSR         ;адрес последнего числа
            MOVLW       1           ;На 1 катод последнего сегмента
            MOVWF       CATOD       ;подаем напряжение,остальные отключены
LOOP        MOVFW       INDF        ;Берем число по адресу загруженному в FSR
            CALL        TABLE       ;Идем за кодом числа
            MOVWF       PORTB       ;Грузим его в порт
            MOVFW       CATOD       ;Берем значение Катода в W
            MOVWF       PORTA       ;Грузим в порт катода
            CALL        DELAY       ;Задержка
            CLRF        PORTA       ;Всё выключаем
            INCF        FSR,F       ;Переходим к следующему адресу
            RLF         CATOD,1     ;Двигаем 1 в право
            BTFSS       CATOD,4     ;Проверяем,у нас 4 катода
            GOTO        LOOP        ;Всё сначала 4 раза
            GOTO        MAIN
            
DELAY       MOVLW       .4
            MOVWF       J
JLOOP       MOVLW       .255
            MOVWF       K
KLOOP       DECFSZ      K,F
            GOTO        KLOOP
            DECFSZ      J,F
            GOTO        JLOOP
            RETURN
            
TABLE       ADDWF       PCL,F
            RETLW       B'10000000'
            RETLW       B'11110010'
            RETLW       B'01001000'
            RETLW       B'01100000'
            RETLW       B'00110010'
            RETLW       B'00100100'
            RETLW       B'00000100'
            RETLW       B'11110000'
            RETLW       B'00000000'
            RETLW       B'00100000'
            
BIN2BCD     MOVLW       .16
            MOVWF       COUNT
            CLRF        LED0
            CLRF        LED1
            CLRF        LED2
            CLRF        LED3
LOOP8       RLF         TEMPL,F
            RLF         TEMPH,F
            RLF         LED0,F
            RLF         LED1,F
            DECFSZ      COUNT,F
            GOTO        ADJDEC
            
            SWAPF       LED1,W
            ANDLW       0FH
            MOVWF       LED3
            
            MOVFW       LED1
            ANDLW       0FH
            MOVWF       LED2
            
            SWAPF       LED0,W
            ANDLW       0FH
            MOVWF       LED1
            
            MOVFW       LED0
            ANDLW       0FH
            MOVWF       LED0
            RETURN
ADJDEC      MOVLW       LED0
            MOVWF       FSR
            CALL        ADJBCD
            MOVLW       LED1
            MOVWF       FSR
            CALL        ADJBCD
            GOTO        LOOP8
ADJBCD      MOVLW       3
            ADDWF       INDF,W
            MOVWF       MEM
            BTFSC       MEM,3
            MOVWF       INDF
            MOVLW       30H
            ADDWF       INDF,W
            MOVWF       MEM
            BTFSC       MEM,7
            MOVWF       INDF
            RETLW       0            
            
ISR         MOVWF       W_TEMP
            SWAPF       STATUS,W
            BCF         STATUS,RP0
            MOVWF       STATUS_TEMP
            MOVFW       FSR
            MOVWF       FSR_TEMP   
                     
EXIT_ISR    MOVFW       FSR_TEMP
            MOVWF       FSR
            SWAPF       STATUS_TEMP,W
            MOVWF       STATUS
            SWAPF       W_TEMP,F
            SWAPF       W_TEMP,W
            RETFIE
            END



НАЗАД                                        Cи ATtiny2313                                   ASSEMBLER ATtiny2313                             ДАЛЕЕ


Back to Top