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

📄 数码管led显示器max7219的应用.asm

📁 pic16f877控制MAX7219LED数码显示器的程序
💻 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 + -