📄 max7219Ц-
字号:
;本程序实用于测试芯片:MAX7219演示
;使用AT89C51单片机,使用晶振24MHz
;使用小板编号:无
;*************************************************************
;以下为常量定义
;*************************************************************
;以下为变量定义
CLOOP1 EQU 2CH
CLOOP2 EQU 2DH
DISD EQU 2EH ;输入的模拟电压
DNUM EQU 2FH ;显示的数据量
CABUF EQU 30H ;MAX7219控制或地址寄存器
DABUF EQU 38H ;MAX7219数据寄存器
ADCBUF EQU 40H ;转换后的DA值,共32字节
;*************************************************************
;以下为位控变量的定义
GOOD BIT 00H ;测试结果标志
;*************************************************************
;以下为各口地址的定义
PIN01 BIT P0.0 ;PIN01
PIN02 BIT P0.1 ;PIN02
PIN03 BIT P0.2 ;PIN03
PIN04 BIT P0.3 ;PIN04
PIN05 BIT P0.4 ;PIN05
PIN06 BIT P0.5 ;PIN06
SPEAKER BIT P0.6 ;PIN07
FLASH BIT P0.7 ;PIN08
PIN09 BIT P1.0 ;PIN09
PIN10 BIT P1.1 ;PIN10
PIN11 BIT P1.2 ;PIN11
PIN12 BIT P1.3 ;PIN12
PIN13 BIT P1.4 ;PIN13
PIN14 BIT P1.5 ;PIN14
PIN15 BIT P1.6 ;PIN15
PIN16 BIT P1.7 ;PIN16
PIN17 BIT P2.0 ;PIN17
PIN18 BIT P2.1 ;PIN18
PIN19 BIT P2.2 ;PIN19
PIN20 BIT P2.3 ;PIN20
PIN21 BIT P2.4 ;PIN21
PIN22 BIT P2.5 ;PIN22
PIN23 BIT P2.6 ;PIN23
PIN24 BIT P2.7 ;PIN24
PIN25 BIT P3.0 ;PIN25
PIN26 BIT P3.1 ;PIN26
PIN27 BIT P3.2 ;PIN27
PIN28 BIT P3.3 ;PIN28
PIN29 BIT P3.4 ;PIN29
DIN BIT P3.5 ;PIN30
CSLD BIT P3.6 ;PIN31
CLK BIT P3.7 ;PIN32
;*************************************************************
;以下为各程序及其功能
;1. START 主程序
;2. TESTOK 测试OK子程序
;3. ERROR 测试bad子程序
;4. DEL40MS 软件延时40ms
;5. DEL50MS 软件延时50ms
;6. DEL100MS 软件延时100ms
;7. DEL120MS 软件延时120ms
;8. DEL250MS 软件延时250ms
;9. INT0INT INT0中断子程序
;10. INT1INT INT1中断子程序
;11. T0INT T0中断子程序
;12. T1INT T1中断子程序
;13. UART UART串口中断子程序
;*************************************************************
;MAIN PROGRAM START
ORG 0000H
LJMP START
ORG 0003H
LJMP INT0INT ;外部中断0
ORG 000BH
LJMP T0INT ;T0中断
ORG 0013H
LJMP INT1INT ;外部中断1
ORG 001BH
LJMP T1INT ;T1中断
ORG 0023H
LJMP UART ;未来通信使用
ORG 0040H
DB 00H,02H,00H,00H,02H,00H,00H
START: CLR EA
MOV P2,#0FFH
MOV P1,#0FFH
MOV P0,#0FFH
MOV R7,#0AH ;24.0MHz晶振,上电延时1ms
LOOP1: MOV R6,#64H
LOOP2: DJNZ R6,LOOP2
DJNZ R7,LOOP1
MOV P2,#0FFH
MOV P1,#0FFH
MOV P0,#0FFH
CLR EA
MOV SP,#60H ;堆栈设置
MOV TCON,#00H ;关闭所有定时器中断
MOV IE,#00H ;关闭所有中断
MAIN: LCALL CSHDIS
TT11: MOV DISD,#00H
TT12: MOV R0,#ADCBUF
MOV R6,#04H
TT13: MOV A,DISD
MOV @R0,A
INC R0
DJNZ R6,TT13
LCALL DISADC
CLR C
MOV A,#11H
ADD A,DISD
MOV DISD,A
JNC TT12
SJMP TT11
NOP ;测试完毕
;*********************************************************************
;程序功能:显示读取的数据
;直接调用子程序:
;入口参数:无
;出口参数:无
;占用资源:
;修改记录:
;*********************************************************************
DISADC: MOV R4,#01H ;控制循环次数
MOV CLOOP1,#01H ;显示的第几个通道参数
MOV CLOOP2,#ADCBUF ;CLOOP2指向ADCBUF首址
DISA1: MOV R0,#CABUF ;显示位置寄存器首址
MOV R1,#DABUF ;显示数据寄存器首址
MOV DNUM,#08H ;显示8个数据
MOV @R0,#01H
MOV @R1,#7EH ;0
INC R0
INC R1
MOV @R0,#02H
MOV @R1,#30H ;1
INC R0
INC R1
MOV @R0,#03H
MOV @R1,#08H ;下划线"_"
INC R0
INC R1
MOV @R0,#04H
MOV A,CLOOP1 ;第几个通道的参数
ANL A,#0F0H ;取出高4位
SWAP A ;调整到低4位上
MOV DPTR,#LEDTAB ;获取显示代码
MOVC A,@A+DPTR
MOV @R1,A ;显示类型寄存器数据
INC R0
INC R1
MOV @R0,#05H
MOV A,CLOOP1
ANL A,#0FH ;取出低4位
MOV DPTR,#LEDTAB
MOVC A,@A+DPTR
MOV @R1,A
INC R0
INC R1
MOV @R0,#06H
MOV @R1,#00H
INC R0
INC R1
MOV @R0,#07H
MOV @R1,#00H
INC R0
INC R1
MOV @R0,#08H
MOV @R1,#00H
; LCALL DISPLAY
; LCALL DEL600MS
; LCALL DEL600MS
; LCALL DEL600MS
MOV R0,CLOOP2
LCALL DIS1_2 ;将数据拆分并到缓冲区并显示2S
INC CLOOP1 ;显示下一个通道
MOV A,CLOOP2
ADD A,#04H ;指向下一个通道(或一个通道的后4个)的数据地址
MOV CLOOP2,A
DJNZ R4,DISA1
RET
;*********************************************************************
;程序功能:将数据缓冲区的数据进行拆分后进行显示
;调用子程序:
;入口参数:
;出口参数:
;占用资源:
;修改记录:
;*********************************************************************
DIS1_2: MOV R1,#DABUF
MOV R5,#04H
MOV DPTR,#LEDTAB
DIS1_21:MOV A,@R0 ;先将数据进行拆分
ANL A,#0F0H
SWAP A
MOVC A,@A+DPTR ;取LED代码
MOV @R1,A
INC R1 ;指向缓冲区下一个单元
MOV A,@R0
ANL A,#0FH
MOVC A,@A+DPTR ;取LED代码
MOV @R1,A
INC R0
INC R1
DJNZ R5,DIS1_21
MOV R0,#CABUF
MOV @R0,#01H
INC R0
MOV @R0,#02H
INC R0
MOV @R0,#03H
INC R0
MOV @R0,#04H
INC R0
MOV @R0,#05H
INC R0
MOV @R0,#06H
INC R0
MOV @R0,#07H
INC R0
MOV @R0,#08H
MOV DNUM,#08H
LCALL DISPLAY
LCALL DEL600MS
; LCALL DEL600MS
; LCALL DEL600MS
; LCALL DEL600MS
; LCALL DEL600MS
; LCALL DEL600MS
; LCALL DEL600MS
RET
;*********************************************************************
;程序功能:初使化显示
;直接调用子程序:
;入口参数:无
;出口参数:无
;占用资源:
;修改记录:
;*********************************************************************
CSHDIS: MOV R0,#CABUF ;初始化显示
MOV R1,#DABUF
MOV DNUM,#05H ;输出5个参数
MOV @R0,#09H ;设置译码方式为"全部不译码"
MOV @R1,#00H
INC R0
INC R1
MOV @R0,#0AH ;设置亮度为"07H"
MOV @R1,#07H
INC R0
INC R1
MOV @R0,#0BH ;设置扫描范围是"0-7段全部"
MOV @R1,#07H
INC R0
INC R1
MOV @R0,#0CH ;设置为正常显示模式
MOV @R1,#01H
INC R0
INC R1
MOV @R0,#0FH ;设置为"非测试模式"
MOV @R1,#00H
LCALL DISPLAY
MOV DPTR,#DISNON ;不显示
LCALL DISBUF
RET
;*********************************************************************
;程序功能:调数据到显示缓冲区并显示
;调用子程序:
;入口参数:
;出口参数:
;占用资源:
;修改记录:
;*********************************************************************
DISBUF: NOP ;调数据到显示缓冲区并显示
MOV R0,#CABUF
MOV R1,#DABUF
MOV R6,#08H
DTO1: CLR A
MOVC A,@A+DPTR
MOV @R0,A ;存储地址或控制字节
CLR A
INC DPTR ;指向数据
MOVC A,@A+DPTR
MOV @R1,A ;存储数据
INC R0
INC R1
INC DPTR
DJNZ R6,DTO1
MOV DNUM,#08H
LCALL DISPLAY
RET
;*********************************************************************
;程序功能:显示子程序
;调用子程序:
;入口参数:DNUM--需要显示的数据量(最多8个)
;出口参数:无
;占用资源:R0--指向控制字/地址缓冲区首址
; R1--指向数据缓冲区首址
; R6--8位控制循环
;修改记录:
;*********************************************************************
DISPLAY:NOP ;显示子程序,LOAD=0
MOV R5,DNUM ;要显示的数据量到R5
MOV R0,#CABUF ;控制字或地址
MOV R1,#DABUF ;数据首址
DIS0: CLR CSLD
MOV R6,#08H ;先送8位地址
MOV A,@R0 ;送控制字或地址
INC R0 ;指向下一个地址
DIS1: RLC A
MOV DIN,C
CLR CLK
SETB CLK
DJNZ R6,DIS1
MOV R6,#08H ;再送8位数据
MOV A,@R1 ;送数据
INC R1 ;指向下一个数据
DIS2: RLC A
MOV DIN,C
CLR CLK
SETB CLK
DJNZ R6,DIS2
SETB CSLD ;LOAD上升沿
DJNZ R5,DIS0
RET
;*********************************************************************
;程序功能:测试OK程序
;直接调用子程序:DEL100MS,DEL250MS
;入口参数:无
;出口参数:无
;占用资源:R5,R6
;修改记录:
;*********************************************************************
TESTOK: CLR SPEAKER ;蜂鸣器响100MS
LCALL DEL100MS
SETB SPEAKER
FL: CLR FLASH
LCALL DEL250MS ;亮0.25S
SETB FLASH
LCALL DEL250MS ;灭0.25S
SJMP FL
RET
;*********************************************************************
;程序功能:测试ERROR程序
;直接调用子程序:DEL40MS,DEL120MS,DEL250MS
;入口参数:无
;出口参数:无
;占用资源:R5,R6
;修改记录:
;*********************************************************************
ERROR: NOP
; LCALL DISADC
CLR SPEAKER ;蜂鸣器响0.40MS,三声
LCALL DEL40MS
SETB SPEAKER
LCALL DEL40MS
CLR SPEAKER
LCALL DEL40MS
SETB SPEAKER
LCALL DEL40MS
CLR SPEAKER
LCALL DEL40MS
SETB SPEAKER
ERR: CLR FLASH ;亮0.12S
LCALL DEL120MS
SETB FLASH ;灭0.12S
LCALL DEL120MS
CLR FLASH
LCALL DEL120MS
SETB FLASH
LCALL DEL120MS
CLR FLASH
LCALL DEL120MS
SETB FLASH
LCALL DEL120MS
LCALL DEL250MS ;中间停0.35S
SJMP ERR
RET
;*********************************************************************
;程序功能:软件延时5US
;直接调用子程序:无
;入口参数:无
;出口参数:无
;占用资源:R6
;修改记录:
;*********************************************************************
DEL5US: MOV R6,#05H
DEL5U1: DJNZ R6,DEL5U1
RET
;*********************************************************************
;程序功能:软件延时100US
;直接调用子程序:无
;入口参数:无
;出口参数:无
;占用资源:R6
;修改记录:
;*********************************************************************
DEL100US:MOV R6,#64H
DEL100U1:DJNZ R6,DEL100U1
RET
;*********************************************************************
;程序功能:软件延时40ms
;直接调用子程序:无
;入口参数:无
;出口参数:无
;占用资源:R5,R6
;修改记录:
;*********************************************************************
DEL40MS:MOV R6,#0C8H ;延时40ms
DEL40M1:MOV R5,#0C8H
DEL40M2:DJNZ R5,DEL40M2
DJNZ R6,DEL40M1
RET
;*********************************************************************
;程序功能:软件延时50ms
;直接调用子程序:无
;入口参数:无
;出口参数:无
;占用资源:R5,R6
;修改记录:
;*********************************************************************
DEL50MS:MOV R6,#0C8H ;延时50MS
DEL501: MOV R5,#0FAH
DEL502: DJNZ R5,DEL502
DJNZ R6,DEL501
RET
;*********************************************************************
;程序功能:软件延时100ms
;直接调用子程序:DEL50MS
;入口参数:无
;出口参数:无
;占用资源:R5,R6
;修改记录:
;*********************************************************************
DEL100MS:LCALL DEL50MS ;延时100ms
LCALL DEL50MS
RET
;*********************************************************************
;程序功能:软件延时120ms
;直接调用子程序:DEL40MS
;入口参数:无
;出口参数:无
;占用资源:R5,R6
;修改记录:
;*********************************************************************
DEL120MS:LCALL DEL40MS ;延时120ms
LCALL DEL40MS
LCALL DEL40MS
RET
;*********************************************************************
;程序功能:软件延时250ms
;直接调用子程序:DEL50MS
;入口参数:无
;出口参数:无
;占用资源:R5,R6
;修改记录:
;*********************************************************************
DEL250MS:LCALL DEL50MS ;延时150ms
LCALL DEL50MS
LCALL DEL50MS
LCALL DEL50MS
LCALL DEL50MS
RET
;*********************************************************************
;程序功能:软件延时600ms
;直接调用子程序:DEL250MS,DEL100MS
;入口参数:无
;出口参数:无
;占用资源:R5,R6
;修改记录:
;*********************************************************************
DEL600MS:LCALL DEL250MS ;延时600ms
LCALL DEL250MS
LCALL DEL100MS
RET
;*********************************************************************
;程序功能:INT0中断入口
;直接调用子程序:
;入口参数:
;出口参数:
;占用资源:
;修改记录:
;*********************************************************************
INT0INT:NOP ;INT0中断
NOP
NOP
RETI
;*********************************************************************
;程序功能:INT1中断入口
;直接调用子程序:
;入口参数:
;出口参数:
;占用资源:
;修改记录:
;*********************************************************************
INT1INT:NOP ;INT1中断
NOP
NOP
RETI
;*********************************************************************
;程序功能:T0中断入口
;直接调用子程序:
;入口参数:
;出口参数:
;占用资源:
;修改记录:
;*********************************************************************
T0INT: NOP ;T0中断
NOP
NOP
RETI
;*********************************************************************
;程序功能:T1中断入口
;直接调用子程序:
;入口参数:
;出口参数:
;占用资源:
;修改记录:
;*********************************************************************
T1INT: NOP ;T1中断
NOP
NOP
RETI
;*********************************************************************
;程序功能:UART串口中断入口
;直接调用子程序:
;入口参数:
;出口参数:
;占用资源:
;修改记录:
;*********************************************************************
UART: NOP
NOP
NOP
RETI
ORG 0800H
DISBAD: DB 01H,1FH,02H,0FDH,03H,3DH,04H,00H ;显示BaD
DB 05H,00H,06H,00H,07H,00H,08H,00H
DISNON: DB 01H,00H,02H,00H,03H,00H,04H,00H ;不显示
DB 05H,00H,06H,00H,07H,00H,08H,00H
;*********************************************************************
;以下是LED的译码表
ORG 0A00H
LEDTAB: DB 7EH,30H,6DH,79H,33H,5BH,5FH,70H ;0-7
DB 7FH,7BH,77H,1FH,4EH,3DH,4FH,47H ;8-F
DB 3EH ;地址10H,显示"U"
DB 01H ;地址11H,显示"-"
ADCTAB: DB 0CH,85H,0CH,0B0H,0DH,82H,0DH,0AAH
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -