📄 showled1.asm
字号:
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 + -