📄 08ndj.asm
字号:
;-----------控制处理----------------------
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 + -