📄 数码管led显示器max7219的应用.asm
字号:
; Author: zhouxuan
; Date: 03/2/24
; Describe:已经ok,但只能用于直接烧入片子用,由于ICD防真占用RB6、RB7,RB6口不断产生中断
LIST P=16F877
#INCLUDE <P16F877.INC>
JIANR EQU 20H
FLAG EQU 21H
DEYH EQU 22H
DEYL EQU 23H
BUFF1 EQU 24H
BUFF2 EQU 25H
BUFF3 EQU 26H
BUFF4 EQU 27H
BUFF5 EQU 28H
BUFF6 EQU 29H
BUFF7 EQU 30H
BUFF8 EQU 31H
LINE EQU 32H
COUNT EQU 33H
SEND_A EQU 34H
SEND_D EQU 35H
TIMER1 EQU 36H
TRAIN EQU 38H
BUFFNEW EQU 39H
TIMER2 EQU 41H
;位定义
CLK EQU 3
LOAD EQU 4
DOUT EQU 5
ORG 000
GOTO START
ORG 004
GOTO INTSER
ORG 10H
START
BCF INTCON,RBIE
BCF INTCON,GIE
CLRF AS
CLRF JIANR
CLRF FLAG
MOVLW 0FH
MOVWF BUFF1
MOVWF BUFF2
MOVWF BUFF3
MOVWF BUFF4
MOVWF BUFF5
MOVWF BUFF6
MOVWF BUFF7
MOVWF BUFF8
MOVWF BUFFNEW
BSF STATUS,RP0
CLRF TRISC ;C口输出
MOVLW 0F0H
MOVWF TRISB ;设置B口
BCF OPTION_REG,7 ;弱上拉
BCF STATUS,RP0
CLRF JIANR
CLRF FLAG
MOVLW 0F0H
MOVWF PORTB;
NOP
NOP
MOVF PORTB,W
INIT7219 ;初始化MAX7219
MOVLW 09H ;设置每位译码方式为BCD译码
MOVWF SEND_A
MOVLW 0FFH
MOVWF SEND_D
CALL SEND ;调用串行通讯子程序
CALL DELAY
MOVLW 0AH ;设置亮度
MOVWF SEND_A
MOVLW 08H
MOVWF SEND_D
CALL SEND
CALL DELAY
MOVLW 0BH ;设置扫描界线为8位
MOVWF SEND_A
MOVLW 7H
MOVWF SEND_D
CALL SEND
CALL DELAY
MOVLW 0CH ;设置工作方式为正常
MOVWF SEND_A
MOVLW 01H
MOVWF SEND_D
CALL SEND
CALL DELAY
MOVLW 0FH
MOVWF SEND_A
MOVLW 0H
MOVWF SEND_D
CALL SEND
CALL DELAY
MOVLW 7H
MOVWF ADDR
CALL DISPLAY
MOVLW 0F0H
MOVWF PORTB
BCF INTCON,RBIF ;开放中断
BSF INTCON,RBIE
BSF INTCON,GIE
WAIT GOTO WAIT
;------------------------------------------------------------------
INTSER BTFSC INTCON,RBIF ;中断服务程序
GOTO INTRB
GOTO WAIT
RETURN
INTRB
BCF INTCON,RBIF ;B口键盘中断服务程序
CALL KEYDELAY ;延时,去抖
CALL KEYDELAY
MOVF PORTB,W
BCF STATUS,Z
ANDLW 0F0H
SUBLW 0F0H
BTFSC STATUS,Z
RETFIE ;为干扰,则返回,并可以屏蔽一次无用的中断
CALL KEYSERVE ;调用键服务子程序,确定键值
MOVWF BUFFNEW
CALL DISPLAY
MOVLW 0F0H
MOVWF PORTB
BCF INTCON,RBIF
RETFIE
KEYDELAY
MOVLW 0X7F
MOVWF DEYH
AGAIN2
MOVLW 0XFF
MOVWF DEYL
AGAIN1
DECFSZ DEYL,1
GOTO AGAIN1
DECFSZ DEYH,1
GOTO AGAIN2
RETURN
KEYSERVE
JIANZHI ;扫描端口,确定是那一个键按下
MOVLW 0FEH ;设置B0口为低
MOVWF PORTB
NOP
MOVF PORTB,W
BTFSS PORTB,4 ;若RB4为"0",则S3键按下
GOTO S3
BTFSS PORTB,5 ;若RB5为"0",则S2键按下
GOTO S2
BTFSS PORTB,6 ;若RB6为"0",则S1键按下
GOTO S1
BTFSS PORTB,7 ;若RB7为"0",则S0键按下
GOTO S0
MOVLW 0FDH ;设置B1口为低
MOVWF PORTB
NOP
MOVF PORTB,W
BTFSS PORTB,4 ;若RB4为"0",则S7键按下
GOTO S7
BTFSS PORTB,5 ;若RB5为"0",则S6键按下
GOTO S6
BTFSS PORTB,6 ;若RB6为"0",则S5键按下
GOTO S5
BTFSS PORTB,7 ;若RB7为"0",则S4键按下
GOTO S4
MOVLW 0FBH ;设置B2口为低
MOVWF PORTB
NOP
MOVF PORTB,W
BTFSS PORTB,4
GOTO S11
BTFSS PORTB,5
GOTO S10
BTFSS PORTB,6
GOTO S9
BTFSS PORTB,7
GOTO S8
MOVLW 07H ;设置B3口为低
MOVWF PORTB
NOP
MOVF PORTB,W
BTFSS PORTB,4
GOTO S15
BTFSS PORTB,5
GOTO S14
BTFSS PORTB,6
GOTO S13
BTFSS PORTB,7
GOTO S12
S0 MOVLW 0X00 ;以下为键返回值
MOVWF JIANR
GOTO JIANW
S1 MOVLW 0X01
MOVWF JIANR
GOTO JIANW
S2 MOVLW 0X02
MOVWF JIANR
GOTO JIANW
S3 MOVLW 0X03
MOVWF JIANR
GOTO JIANW
S4 MOVLW 0X04
MOVWF JIANR
GOTO JIANW
S5 MOVLW 0X05
MOVWF JIANR
GOTO JIANW
S6 MOVLW 0X06
MOVWF JIANR ;
GOTO JIANW
S7 MOVLW 0X07
MOVWF JIANR
GOTO JIANW
S8 MOVLW 0X08
MOVWF JIANR
GOTO JIANW
S9 MOVLW 0X09
MOVWF JIANR
GOTO JIANW;
S10 MOVLW 0X0A
MOVWF JIANR
GOTO JIANW
S11 MOVLW 0X0B
MOVWF JIANR
GOTO JIANW
S12 MOVLW 0X0C
MOVWF JIANR
GOTO JIANW
S13 MOVLW 0X0D
MOVWF JIANR
GOTO JIANW
S14 MOVLW 0X0E
MOVWF JIANR
GOTO JIANW
S15 MOVLW 0X0F
MOVWF JIANR ;以上根据按下的键把相应的值送给JIANR
JIANW
MOVWF JIANR
RETURN
;------------------------------------------------------------------
DELAY ;延时
MOVLW 33
MOVWF TIMER1
DEL_LOP
DECFSZ TIMER1,1
GOTO DEL_LOP
RETURN
;------------------------------------------------------------------
LDELAY
MOVLW 0FFH
MOVWF TIMER2
LDEL_LOP
CALL DELAY
DECFSZ TIMER2,1
GOTO LDEL_LOP
RETURN
DISPLAY ;显示
MOVF BUFF7,0
MOVWF BUFF8
MOVF BUFF6,0
MOVWF BUFF7
MOVF BUFF5,0
MOVWF BUFF6
MOVF BUFF4,0
MOVWF BUFF5
MOVF BUFF3,0
MOVWF BUFF4
MOVF BUFF2,0
MOVWF BUFF3
MOVF BUFF1,0
MOVWF BUFF2
MOVF BUFFNEW,0
MOVWF BUFF1 ;以上为显示移位
SEND8 MOVLW 8H ;发送各LED的显示值
MOVWF SEND_A
MOVF BUFF8,0
MOVWF SEND_D
CALL SEND
SEND7 MOVLW 7H
MOVWF SEND_A
MOVF BUFF7,0
MOVWF SEND_D
CALL SEND
SEND6 MOVLW 6H
MOVWF SEND_A
MOVF BUFF6,0
MOVWF SEND_D
CALL SEND
SEND5 MOVLW 5H
MOVWF SEND_A
MOVF BUFF5,0
MOVWF SEND_D
CALL SEND
SEND4 MOVLW 4H
MOVWF SEND_A
MOVF BUFF4,0
MOVWF SEND_D
CALL SEND
SEND3 MOVLW 3H
MOVWF SEND_A
MOVF BUFF3,0
MOVWF SEND_D
CALL SEND
SEND2 MOVLW 2H
MOVWF SEND_A
MOVF BUFF2,0
MOVWF SEND_D
CALL SEND
SEND1 MOVLW 1H
MOVWF SEND_A
MOVF BUFF1,0
MOVWF SEND_D
CALL SEND
RETURN
SEND ;MAX7219数据发送
MOVLW 8
MOVWF COUNT
BCF PORTC,LOAD ; 设置LOAD信号为低
CALL DELAY
SET_LP1 BCF STATUS,C ;传送前8位地址信息
BSF PORTC,CLK
RLF SEND_A,1
BCF PORTC,DOUT
BTFSC STATUS,C
BSF PORTC,DOUT
BCF PORTC,CLK
CALL DELAY
DECFSZ COUNT,1
GOTO SET_LP1
BSF PORTC,CLK
MOVLW 8
MOVWF COUNT
SET_LP2 BCF STATUS,C ;传送前8位地址信息
BSF PORTC,CLK
RLF SEND_D,1
BCF PORTC,DOUT
BTFSC STATUS,C
BSF PORTC,DOUT
BCF PORTC,CLK
CALL DELAY
DECFSZ COUNT,1
GOTO SET_LP2
BSF PORTC,CLK
CALL DELAY
BSF PORTC,LOAD
BSF PORTC,DOUT
RETURN
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -