⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 showled1.asm

📁 Using 16f876 & matrix led to show time.
💻 ASM
📖 第 1 页 / 共 4 页
字号:
                LIST    p=PIC16F876,f=INHX8M
                INCLUDE "P16F876.INC"

#define   RESET_8255  PORTA,0
#define   _WR         PORTA,1
#define   MIN_B       PORTA,2
#define   A1          PORTA,3
#define   HOUR_B      PORTA,4
#define   A0          PORTA,5
;; =========================================================
;; Varaible address assignment
;;allocate in BANK0
Delay_counter1 EQU     0x3a    
Delay_counter2 EQU     0x3b
TX_BUFFER      EQU     0x22
COLUM_1        EQU     0x23
COLUM_2        EQU     0x24
COLUM_3        EQU     0x25
COLUM_4        EQU     0x26
COLUM_5        EQU     0x27
COLUM_6        EQU     0x28
COLUM_7        EQU     0x29
COLUM_8        EQU     0x2a
COLUM_9        EQU     0x2b
COLUM_10       EQU     0x2c
COLUM_11       EQU     0x2d
COLUM_12       EQU     0x2e
COLUM_13       EQU     0x2f
COLUM_14       EQU     0x30
COLUM_15       EQU     0x31
COLUM_16       EQU     0x32
COUNTER        EQU     0x33
SECOND_0       EQU     0x34
SECOND_1       EQU     0x35
MINUTE_0       EQU     0x36
MINUTE_1       EQU     0x37
HOUR           EQU     0x38
LED_COUNTER    EQU     0x39
;; =========================================================
;; Define Macro for bank switching
BANK_0    macro
          bcf    STATUS,RP0
          bcf    STATUS,RP1
          endm

BANK_1    macro
          bsf    STATUS,RP0
          bcf    STATUS,RP1
          endm

BANK_2    macro
          bcf    STATUS,RP0
          bsf    STATUS,RP1
          endm

BANK_3    macro
          bsf    STATUS,RP0
          bsf    STATUS,RP1
          endm

MOV_PORTA macro
          bcf     A0
          bcf     A1                
          nop
          bcf     _WR
          nop
          nop
          bsf     _WR    
          endm

MOV_PORTB macro
          bsf     A0
          bcf     A1                
          nop
          bcf     _WR
          nop
          nop
          bsf     _WR    
          endm

MOV_PORTC macro
          bcf     A0
          bsf     A1                
          nop
          bcf     _WR
          nop
          nop
          bsf     _WR    
          endm
;; *********************************************************
;; initial program address
;; PIC reset from this 
;; *********************************************************
                ORG     0x000
RESET:
                nop
                goto    MAIN

;; *********************************************************
;; Interrupt subrouting
;; PIC will generate 1 interrupt in 100ms
;; 1 second = 100ms*10
;; The display char(time) will be fixed after 10 times interrupt
;; *********************************************************
                ORG     0x004
                btfss   PIR1,TMR1IF
                goto    NO_DO
                decfsz  COUNTER,F
                goto    TMR1_END
                movlw   0x0a
                movwf   COUNTER
                incf    LED_COUNTER,F
                movlw   0x3c
                subwf   LED_COUNTER,W
                btfss   STATUS,Z
                goto    CHECK_TIME
                incf    MINUTE_0,F
                clrf    LED_COUNTER
CHECK_TIME:
                call    CHECK_CHAR2
                call    CHECK_CHAR3
                call    CHECK_HOUR
TMR1_END:         
                movlw   0x05
                subwf   COUNTER,W
                btfss   STATUS,Z
                goto    ON_DOT
                movlw   0x1b
                movwf   COLUM_8
                movwf   COLUM_9
                goto    FIX_TMR1
ON_DOT:
                movlw   0x0a
                subwf   COUNTER,W
                btfss   STATUS,Z
                goto    FIX_TMR1
                clrf    COLUM_8
                clrf    COLUM_9
FIX_TMR1:
                bcf     PIR1,TMR1IF
                movlw   0x1f
                movwf   TMR1H
NO_DO:
                nop
                nop
                nop
                nop
                RETFIE
;; *********************************************************
;; the main paogram
;; *********************************************************
                ORG     0x050
MAIN:
;; *********************************************************
;; initial some registers, timer register ... etc.
;; *********************************************************
                call    SET_PORT

                ;;Reset 8255 
                ;;NOTE : Active high for 8255 Reset
                bsf     RESET_8255
                call    DELAY
                bsf     _WR
                bsf     A0
                bsf     A1  
                bcf     RESET_8255

                ;;Initial 8255 register
                ;;Set 8255 work in mode-0
                ;;Set PORTA,B,C work in output mode
                movlw   0x80
                movwf   PORTB
                nop
                bcf     _WR
                nop
                nop
                bsf     _WR

                ;;Clean LED display matrix
                movlw   0x00
                movwf   PORTB
                MOV_PORTA      

                movlw   0x00
                movwf   PORTB
                MOV_PORTB

                movlw   0xff
                movwf   PORTB
                MOV_PORTC

                movlw   0xff
                movwf   PORTC      

                ;;Initial TIMER-1 register
                movlw   0x1f
                movwf   TMR1H
                clrf    TMR1L
                bsf     INTCON,GIE
                bsf     INTCON,PEIE
                BANK_1
                bsf     PIR1,TMR1IE
                BANK_0
                movlw   0x35
                movwf   T1CON

                movlw   0x0a
                movwf   COUNTER

                clrf    SECOND_0
                clrf    SECOND_1      
                clrf    MINUTE_0
                clrf    MINUTE_1  
                movlw   0x01
                movwf   HOUR
                clrf    COLUM_8
                clrf    COLUM_9
                clrf    LED_COUNTER   
               
TIME_LOOP:
                call    CHECK_SECOND
                ;;Flash LED matrix
                call    SHOW_TIME
                ;;Check the push-button for Minutes
                btfss   MIN_B
                goto    INC_MINUTES
                btfss   HOUR_B
                ;;Check the push-button for Hours
                goto    INC_HOUR
                goto    TIME_LOOP
INC_MINUTES:
                ;;De_bounce subrouting
                call    DELAYL
                btfsc   MIN_B
                goto    TIME_LOOP
                incf    MINUTE_0,F
WAIT_MIN:
                btfss   MIN_B
                goto    WAIT_MIN
                goto    TIME_LOOP
INC_HOUR:
                ;;De_bounce subrouting
                call    DELAYL
                btfsc   HOUR_B
                goto    TIME_LOOP
                incf    HOUR,F
WAIT_HOUR:
                btfss   HOUR_B
                goto    WAIT_HOUR                    
                goto    TIME_LOOP


;; *********************************************************
;; CHECK_SECOND
;; There is one LED line to display second status.
;; Each LED will indicate 4 seconds. We will check the second 
;;   value, then adjust the LED length. 
;; *********************************************************
CHECK_SECOND:
                bsf     COLUM_1,6
                bsf     COLUM_16,6
                movlw   0x04
                subwf   LED_COUNTER,W
                btfss   STATUS,Z
                goto    CHECK_05
                bsf     COLUM_2,6
                goto    DISPLAY_TIME
CHECK_05:
                movlw   0x05
                subwf   LED_COUNTER,W
                btfss   STATUS,Z
                goto    CHECK_06
                bsf     COLUM_2,6
                goto    DISPLAY_TIME
CHECK_06:
                movlw   0x06
                subwf   LED_COUNTER,W
                btfss   STATUS,Z
                goto    CHECK_07
                bsf     COLUM_2,6
                goto    DISPLAY_TIME
CHECK_07:
                movlw   0x07
                subwf   LED_COUNTER,W
                btfss   STATUS,Z
                goto    CHECK_08
                bsf     COLUM_2,6
                goto    DISPLAY_TIME
CHECK_08:
                movlw   0x08
                subwf   LED_COUNTER,W
                btfss   STATUS,Z
                goto    CHECK_09
                bsf     COLUM_2,6
                bsf     COLUM_3,6
                goto    DISPLAY_TIME
CHECK_09:
                movlw   0x09
                subwf   LED_COUNTER,W
                btfss   STATUS,Z
                goto    CHECK_0a
                bsf     COLUM_2,6
                bsf     COLUM_3,6
                goto    DISPLAY_TIME
CHECK_0a:
                movlw   0x0a
                subwf   LED_COUNTER,W
                btfss   STATUS,Z
                goto    CHECK_0b
                bsf     COLUM_2,6
                bsf     COLUM_3,6
                goto    DISPLAY_TIME
CHECK_0b:
                movlw   0x0b
                subwf   LED_COUNTER,W
                btfss   STATUS,Z
                goto    CHECK_0c
                bsf     COLUM_2,6
                bsf     COLUM_3,6
                goto    DISPLAY_TIME
CHECK_0c:
                movlw   0x0c
                subwf   LED_COUNTER,W
                btfss   STATUS,Z
                goto    CHECK_0d
                bsf     COLUM_2,6
                bsf     COLUM_3,6
                bsf     COLUM_4,6
                goto    DISPLAY_TIME
CHECK_0d:
                movlw   0x0d
                subwf   LED_COUNTER,W
                btfss   STATUS,Z
                goto    CHECK_0e
                bsf     COLUM_2,6
                bsf     COLUM_3,6
                bsf     COLUM_4,6
                goto    DISPLAY_TIME
CHECK_0e:
                movlw   0x0e
                subwf   LED_COUNTER,W
                btfss   STATUS,Z
                goto    CHECK_0f
                bsf     COLUM_2,6
                bsf     COLUM_3,6
                bsf     COLUM_4,6
                goto    DISPLAY_TIME
CHECK_0f:
                movlw   0x0f
                subwf   LED_COUNTER,W
                btfss   STATUS,Z
                goto    CHECK_10
                bsf     COLUM_2,6
                bsf     COLUM_3,6
                bsf     COLUM_4,6
                goto    DISPLAY_TIME
CHECK_10:
                movlw   0x10
                subwf   LED_COUNTER,W
                btfss   STATUS,Z
                goto    CHECK_11
                bsf     COLUM_2,6
                bsf     COLUM_3,6
                bsf     COLUM_4,6
                bsf     COLUM_5,6
                goto    DISPLAY_TIME
CHECK_11:
                movlw   0x11
                subwf   LED_COUNTER,W
                btfss   STATUS,Z
                goto    CHECK_12
                bsf     COLUM_2,6
                bsf     COLUM_3,6
                bsf     COLUM_4,6
                bsf     COLUM_5,6
                goto    DISPLAY_TIME
CHECK_12:
                movlw   0x12
                subwf   LED_COUNTER,W
                btfss   STATUS,Z
                goto    CHECK_13
                bsf     COLUM_2,6
                bsf     COLUM_3,6
                bsf     COLUM_4,6
                bsf     COLUM_5,6
                goto    DISPLAY_TIME
CHECK_13:
                movlw   0x13
                subwf   LED_COUNTER,W
                btfss   STATUS,Z
                goto    CHECK_14
                bsf     COLUM_2,6
                bsf     COLUM_3,6
                bsf     COLUM_4,6
                bsf     COLUM_5,6
                goto    DISPLAY_TIME
CHECK_14:
                movlw   0x14
                subwf   LED_COUNTER,W
                btfss   STATUS,Z
                goto    CHECK_15
                bsf     COLUM_2,6
                bsf     COLUM_3,6
                bsf     COLUM_4,6
                bsf     COLUM_5,6
                bsf     COLUM_6,6
                goto    DISPLAY_TIME
CHECK_15:
                movlw   0x15
                subwf   LED_COUNTER,W
                btfss   STATUS,Z
                goto    CHECK_16
                bsf     COLUM_2,6
                bsf     COLUM_3,6
                bsf     COLUM_4,6
                bsf     COLUM_5,6
                bsf     COLUM_6,6
                goto    DISPLAY_TIME
CHECK_16:
                movlw   0x16
                subwf   LED_COUNTER,W
                btfss   STATUS,Z
                goto    CHECK_17
                bsf     COLUM_2,6
                bsf     COLUM_3,6
                bsf     COLUM_4,6
                bsf     COLUM_5,6
                bsf     COLUM_6,6
                goto    DISPLAY_TIME
CHECK_17:
                movlw   0x17
                subwf   LED_COUNTER,W
                btfss   STATUS,Z
                goto    CHECK_18

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -