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

📄 08ndj.asm

📁 本程序里包含MAX7219 X5045 TLC1549 等应用软件 汇编文件
💻 ASM
📖 第 1 页 / 共 3 页
字号:

;-----------控制处理----------------------
KZCL:	JNB	D22,ENT4	;不是"-30<=u<-25"吗?
	MOV	GZ3,#CN3S	;取开输出延时值
ENT33:	MOV	GZ4,#CN1S	;取关输出延时值
ENT32:	LCALL	PSKZ		;调排水控制
	LJMP	ENTED	

ENT4:	JNB	D20,ENT5	;不是"-25<=u<-20"吗?
	MOV	GZ3,#CN3S	;取开输出延时值
	SJMP	ENT33

ENT5:	JNB	D18,ENT6	;不是"-20<=u<-15"吗?
	MOV	GZ3,#CN3S	;取开输出延时值
	SJMP	ENT33
	
ENT6:	JNB	D16,ENT7	;不是"-15<=u<-10"吗?
	MOV	GZ3,#CN2S	;取开输出延时值
	SJMP	ENT33

ENT7:	JNB	D14,ENT8	;不是"-10<=u<-5"吗?
	MOV	GZ3,#CN0S	;取开输出延时值
	MOV	GZ4,#CN1S	;取关输出延时值
	SJMP	ENT32

ENT8:	JNB	D11,ENT9	;不是"5<u<=10"吗?
	MOV	GZ3,#CN0S	;取开输出延时值
	MOV	GZ4,#CN1S	;取关输出延时值
ENT82:	LCALL	GSKZ		;调给水控制
	SJMP	ENTED	

ENT9:	JNB	D9,ENTA		;不是"10<u<=15"吗?
	MOV	GZ3,#CN2S	;取开输出延时值
ENT91:	MOV	GZ4,#CN1S	;取关输出延时值
	SJMP	ENT82

ENTA:	JNB	D7,ENTB		;不是"15<u<=20"吗?
	MOV	GZ3,#CN3S	;取开输出延时值
	SJMP	ENT91

ENTB:	JNB	D5,ENTC		;不是"20<u<=25"吗?
	MOV	GZ3,#CN3S	;取开输出延时值
	SJMP	ENT91

ENTC:	JNB	D3,ENTED	;不是"25<u<=30"吗?
	MOV	GZ3,#CN3S	;取开输出延时值
	SJMP	ENT91
		
ENTED:	CLR	21H.5		;清控制处理标志
	RET

;-----------排水控制程序-----------
PSKZ:	JB	21H.6,PSKZ1	;有输出标志吗?
	SETB	21H.6		;置输出标志
	MOV	GZ1,GZ3		;取延时值
	CLR	OUT4		;置排水输出
	SETB	D29		;置排水显示
PSKZ2:	LCALL	LAMP		;指示灯更新
	SETB	21H.7		;置LED指示灯延时标志
	RET

PSKZ1:	CLR	21H.6		;清输出标志
	MOV	GZ1,GZ4		;取延时值
	SETB	OUT4		;清排水输出
	CLR	D29		;清排水显示
	SJMP	PSKZ2

;-----------给水控制程序-----------
GSKZ:	JB	21H.6,GSKZ1	;有输出标志吗?
	SETB	21H.6		;置输出标志
	MOV	GZ1,GZ3		;取延时值
	CLR	OUT3		;置给水输出
	SETB	D30		;置给水显示
GSKZ2:	LCALL	LAMP		;指示灯更新
	SETB	21H.7		;置LED指示灯延时标志
	RET

GSKZ1:	CLR	21H.6		;清输出标志
	MOV	GZ1,GZ4		;取延时值
	SETB	OUT3		;清给水输出
	CLR	D30		;清给水显示
	SJMP	GSKZ2

;---------有关X5045芯片子程序---------

;-----------发'写使能'命令-----------
EN5045: MOV 	RAM45,#08H	;取数据位个数
	MOV 	A,#00000110B	;使能控制字
	CLR 	PSW.5		;清多字节数据标志
	LCALL 	WR5045
	SETB 	CS5045
	RET

;-----------写状态----------
WS5045: LCALL 	EN5045		;发使能命令
	MOV 	RAM45,#16	;取数据位个数
	MOV	R0,#DSRAM	;取命令区地址
	MOV 	@R0,#00000010B	;看门狗定时1.4秒(状态字)
	INC	R0
	MOV 	@R0,#00000001B	;写状态命令			
	MOV 	RAM45_1,#2	;确定字节数
	SETB 	PSW.5		;置多字节数据标志
	LCALL 	WR5045
	SETB 	CS5045
WS_1:	LCALL 	RS5045		;读状态
	JB 	ACC.0,WS_1	;写操作未完毕吗?
	RET

;-----------读状态--------------
RS5045: MOV 	A,#00000101B	;读状态命令
	MOV 	RAM45,#08H	;取数据位个数
	CLR 	PSW.5		;清多字节数据标志
	LCALL 	WR5045
	MOV 	R7,#01H		;读1个字节数据
	MOV 	R0,#RTEMP	;取临时单元地址
	LCALL 	RD5045
	SETB 	CS5045
	RET

;-----------读数据-----------
RD5045: MOV 	R2,#08H		;取1个字节数据位数
	MOV 	C,SO5045	;读入数据(下降沿)
	RLC 	A
	DEC 	R2
R25_1:	NOP
	SETB 	CK5045		;发脉冲
	NOP
	NOP
	CLR 	CK5045
	NOP
	NOP
	MOV 	C,SO5045	;读入数据(下降沿)
	RLC 	A
	DJNZ 	R2,R25_1	;1个字节数据完毕了吗?
	MOV 	@R0,A		;存数据
	INC 	R0		;调整数据区地址
	MOV 	R2,#08H		;取1个字节数据位数
	DJNZ 	R7,R25_1	;数据未读完吗?
	RET

;------------写操作-----------
WR5045: CLR 	CK5045		;端口引脚初始化
	CLR 	CS5045
	NOP
W25_2:	RLC 	A		;传送数据
	JNB 	PSW.5,W25_3	;不是多字节数据写入吗?
	MOV 	R0,#DSRAM	;取地址
	MOV 	R3,RAM45_1	;取字节数
W25_4:	MOV 	A,@R0
	RLC 	A
	MOV 	@R0,A
	INC 	R0
	DJNZ 	R3,W25_4
W25_3:	MOV 	SI5045,C	;读入数据
	NOP
	NOP
	NOP
	SETB 	CK5045		;上升沿锁存
	NOP
	NOP
	CLR 	CK5045
	DJNZ 	RAM45,W25_2	;移位数据未完毕吗?
	RET

;------------保存数据------------
SAVE:	LCALL 	EN5045		;发使能命令
	MOV 	RAM45,#40	;取数据位个数
	MOV	R0,#DSRAM	;取命令区地址
	MOV	@R0,#55H	;存旧片标志字
	INC	R0
	MOV	@R0,SDRAM1+1	;设定值低位
	INC	R0
	MOV	@R0,SDRAM1	;设定值高位
	INC	R0
	MOV 	@R0,#00000000B	;EEPROM数据地址
	INC	R0
	MOV 	@R0,#00000010B	;存数据命令			
	MOV 	RAM45_1,#5	;确定字节数
	SETB 	PSW.5		;置多字节数据标志
	LCALL	 WR5045
	SETB 	CS5045
SV1_1:	LCALL 	RS5045		;读状态
	JB 	ACC.0,SV1_1	;写操作未完毕吗?
	RET

;-----------读数据区-------------
DS5045: MOV 	RAM45,#16	;取数据位个数
	MOV	R0,#DSRAM	;取命令区地址
	MOV 	@R0,#00000000B	;EEPROM数据地址
	INC	R0
	MOV 	@R0,#00000011B	;读数据命令			
	MOV 	RAM45_1,#2	;确定字节数
	SETB 	PSW.5		;置多字节数据标志
	LCALL	 WR5045
	MOV 	R0,#SDRAM1	;读出设定值(BCD码)
	MOV 	R7,#03H
	LCALL 	RD5045
	SETB 	CS5045
	RET

;-----------防止看门狗复位操作----------
REST:	CLR 	CS5045
	NOP
	NOP
	NOP
	SETB 	CS5045
	CLR 	BRST		;清看门狗复位标志
	RET

;----------有关MAX7219芯片子程序-----------

;-------------传送命令-------------
SM19:	MOV 	RAM19_1,#16	;设置传送数据位个数
M19_1:	MOV 	A,RAM19_2	;传送数据(RAM19_3)(RAM19_2)
	RLC 	A
	MOV 	RAM19_2,A
	MOV 	A,RAM19_3
	RLC 	A
	MOV 	RAM19_3,A
	MOV 	DIN19,C
	CLR 	CLK19		;发脉冲(上升沿移入数据)
	NOP
	NOP
	SETB 	CLK19
	DJNZ 	RAM19_1,M19_1
	CLR 	LOAD19		;锁存数据(上升沿锁存数据)
	NOP
	NOP
	SETB 	LOAD19
	RET

;-------------显字符(3位)---------------
SM39:	MOV 	DPTR,#TAB_1	;取字符显示表
	MOV 	R1,#DSRAM	;取显示单元区首址
	MOV 	R4,#01H		;显位0(初值)
M39_1:	MOV 	A,@R1		;取出显示内容
	MOV 	RAM19_3,R4	;确定显示位置
	MOVC 	A,@A+DPTR	;变换为字符代码
	CJNE 	R4,#02H,M39_2	;不是第二位吗?
	SETB	ACC.6		;点亮'.'
M39_2:	MOV 	RAM19_2,A	;显示字符
	LCALL 	SM19
	INC 	R1		;调整显示单元区地址
	INC 	R4		;调整显示位置
	CJNE 	R4,#04H,M39_1	;显完毕了吗?
	RET

;----------显现在值---------------
XXZZ:	MOV	DSRAM+3,XZRAM	;取现在值
	MOV	DSRAM+4,XZRAM+1
	MOV	R0,#DSRAM+3	;转为BCD码
	LCALL	HBCD2
	MOV	A,DSRAM+3	;取百位
	MOV	DSRAM,A
	MOV	A,DSRAM+4	;取十位
	SWAP	A
	ANL	A,#0FH
	MOV	DSRAM+1,A
	MOV	A,DSRAM+4	;取个位
	ANL	A,#0FH
	MOV	DSRAM+2,A
	LCALL	SM39
	RET

;----------显设定值---------------
XSDZ:	MOV	A,SDRAM1	;取百位
	MOV	DSRAM,A
	MOV	A,SDRAM1+1	;取十位
	SWAP	A
	ANL	A,#0FH
	MOV	DSRAM+1,A
	MOV	A,SDRAM1+1	;取个位
	ANL	A,#0FH
	MOV	DSRAM+2,A
	LCALL	SM39
	RET

;-------------显灯(4位,共32个)----------------
LAMP:	MOV 	R1,#RLED1	;取灯显示单元区首址
	MOV 	R4,#04H		;显位3(初值)
LMP_1:	MOV 	RAM19_2,@R1	;取出显示内容
	MOV 	RAM19_3,R4	;确定显示位置
	LCALL 	SM19
	INC 	R1		;调整显示单元区地址
	INC 	R4		;调整显示位置
	CJNE 	R4,#08H,LMP_1	;显完毕了吗?
	RET

;-----------开机闪烁------------
KJSS:	CLR	D1
	CLR	D24
	LCALL	LAMP		;显灯
	MOV	RAMJT,#TNUM1	;延时400ms
	LCALL	SPJT
	CLR	D2
	CLR	D23
	LCALL	LAMP		;显灯
	MOV	RAMJT,#TNUM1	;延时400ms
	LCALL	SPJT
	CLR	D3
	CLR	D22
	LCALL	LAMP		;显灯
	MOV	RAMJT,#TNUM1	;延时400ms
	LCALL	SPJT
	CLR	D4
	CLR	D21
	LCALL	LAMP		;显灯
	MOV	RAMJT,#TNUM1	;延时400ms
	LCALL	SPJT
	CLR	D5
	CLR	D20
	LCALL	LAMP		;显灯
	MOV	RAMJT,#TNUM1	;延时400ms
	LCALL	SPJT
	CLR	D6
	CLR	D19
	LCALL	LAMP		;显灯
	MOV	RAMJT,#TNUM1	;延时400ms
	LCALL	SPJT
	CLR	D7
	CLR	D18
	LCALL	LAMP		;显灯
	MOV	RAMJT,#TNUM1	;延时400ms
	LCALL	SPJT
	CLR	D8
	CLR	D17
	LCALL	LAMP		;显灯
	MOV	RAMJT,#TNUM1	;延时400ms
	LCALL	SPJT
	CLR	D9
	CLR	D16
	LCALL	LAMP		;显灯
	MOV	RAMJT,#TNUM1	;延时400ms
	LCALL	SPJT
	CLR	D10
	CLR	D15
	LCALL	LAMP		;显灯
	MOV	RAMJT,#TNUM1	;延时400ms
	LCALL	SPJT
	CLR	D11
	CLR	D14
	LCALL	LAMP		;显灯
	MOV	RAMJT,#TNUM1	;延时400ms
	LCALL	SPJT
	CLR	D12
	CLR	D13
	LCALL	LAMP		;显灯
	MOV	RAMJT,#TNUM1	;延时400ms
	LCALL	SPJT
	CLR	20H.7		;清初始化显示标志
	RET

;----------设定值转为二进制----------------
ZBCDH:	MOV	SDRAM2,SDRAM1
	MOV	SDRAM2+1,SDRAM1+1
	MOV	R0,#SDRAM2
	LCALL	BCDH2
	RET
	
;------单字节BCD码->二进制--------
BCDH:	MOV 	B,#10H 
	DIV 	AB
	MOV 	R3,B
	MOV 	B,#10
	MUL 	AB
	ADD 	A,R3
	RET

;------双字节BCD码->二进制--------
BCDH2:	INC 	R0 
	MOV 	A,@R0
	LCALL 	BCDH
	MOV 	@R0,A
	DEC 	R0
	MOV 	A,@R0
	LCALL 	BCDH
	MOV 	B,#100
	MUL 	AB
	INC 	R0
	ADD 	A,@R0
	MOV 	@R0,A
	CLR 	A
	ADDC 	A,B
	DEC 	R0
	MOV 	@R0,A
	RET

;------双字节二进制->BCD码(5位)--------
HBCD2:	MOV 	A,R0		;入口(R0)(R0+1)
	INC 	A		;出口R3(R0)(R0+1)
	MOV 	R1,A
	CLR 	A
	MOV 	R3,A
	MOV 	R4,A
	MOV 	R5,A
	MOV 	R2,#10H
HBCD20: MOV 	A,@R1
	RLC 	A
	MOV 	@R1,A
	MOV 	A,@R0
	RLC 	A
	MOV 	@R0,A
	MOV 	A,R5
	ADDC 	A,R5
	DA 	A
	MOV 	R5,A
	MOV 	A,R4
	ADDC 	A,R4
	DA 	A
	MOV 	R4,A
	MOV 	A,R3
	ADDC 	A,R3
	MOV 	R3,A
	DJNZ 	R2,HBCD20
	MOV 	A,R4
	MOV 	@R0,A
	MOV 	A,R5
	MOV 	@R1,A
	RET

;---------------双字节乘法子程序----------------
MML:	MOV	A,R1		;实现R0R1*R2R3->R4R5R6R7
	MOV	B,R3
	MUL	AB		;R1*R3
	MOV	R7,A		;部分积->R6R7
	MOV	R6,B
	MOV	A,R0		;R0*R3
	MOV	B,R3
	MUL	AB
	ADD	A,R6		;部分积加到结果寄存器中
	MOV	R6,A
	MOV	A,B
	ADDC	A,#00H
	MOV	R5,A
	MOV	A,R1		;R1*R2
	MOV	B,R2
	MUL	AB
	ADD	A,R6		;部分积加到结果寄存器中
	MOV	R6,A
	MOV	A,B
	ADDC	A,R5
	MOV	R5,A
	CLR	A
	ADDC	A,#00H
	MOV	R4,A
	MOV	A,R0		;R0*R2
	MOV	B,R2
	MUL	AB
	ADD	A,R5		;部分积加到结果寄存器中
	MOV	R5,A
	MOV	A,B
	ADDC	A,R4
	MOV	R4,A
	RET

;-----------启动计时子程序---------------
SPJT:	SETB	BJT		;启动计时延时
JT_1:	JNB	BJT,JT_2	;计时延时到了吗?
	JNB	BRST,JT_1	;无看门狗标志吗?
	LCALL	REST		;防止看门狗复位操作
	SJMP	JT_1
JT_2:	RET

;-----------定时器T0中断---------------
IET0:	DJNZ 	RT4MS,ET01
	MOV 	RT4MS,#16	;4ms
	SJMP	ET02
ET01:	LJMP	ET0_1

ET02:	DJNZ	RT45,ET0_2
	MOV	RT45,#250	;看门狗250*4ms=1s延时
	SETB	BRST		;置看门狗处理标志
	JB	20H.7,ET0_2	;有初始化显示标志吗?
	JNB	D26,ET0_2	;无设定指示吗?
	DJNZ	RSDYS,ET0_2
	SETB	20H.0		;置设定延时到标志

ET0_2:	JNB	BJT,ET0_3	;有计时延时标志吗?
	DJNZ	RAMJT,ET0_3
	CLR	BJT		;计时延时到,清标志

ET0_3:	JB	20H.7,ET0_1	;有初始化显示标志吗?
	JNB 	20H.3,ET0_4	;有键按下标志吗?
	DJNZ 	TKEY,ET0_4	;键延时
	SETB 	20H.4		;置键有效标志

ET0_4:	DJNZ	TMCY,ET0_5	;采样延时未到吗?
	MOV	TMCY,#125	;500ms
	SETB	20H.6		;置采样标志
	
ET0_5:	JNB	21H.7,ET0_1	;无输出控制延时标志吗?
	DJNZ	GZ2,ET0_1	;100ms未到吗?
	MOV	GZ2,#25		;100ms
	DJNZ	GZ1,ET0_1	;输出控制延时未到吗?
	CLR	21H.7		;清输出控制延时标志
	SETB	21H.5		;置输出控制标志

ET0_1:	RETI

;---------------键值表----------------
TABKY:	
      DB	01H,02H,04H,08H
	   DB	10H,20H,40H,80H

;------------字符显示表-----------
TAB_1:	
   DB 	9FH,03H,0ADH	;0,1,2
	DB 	0A7H,33H,0B6H	;3,4,5
	DB 	0BEH,93H,0BFH	;6,7,8
	DB 	0B7H,00H,20H	;9, ,-

	END

⌨️ 快捷键说明

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