📄 08ndj.asm
字号:
MOV R3,#0 ;键值初始化
KY1_3: CLR A
MOVC A,@A+DPTR
CJNE A,DSRAM,KY1_1 ;与设定键值不相等吗?
SJMP KY1_2
KY1_1: INC R3 ;调整键值
INC DPTR ;调整键值表指针
DJNZ R2,KY1_3
SJMP KY5
KY1_2: MOV A,R3 ;取键值
JNB PSW.5,KY2 ;不是P2口键吗?
ADD A,#8 ;调整键值
KY2: JB 20H.3,KY4 ;有键按下标志吗?
MOV RKEY,A ;存键值
SETB 20H.3 ;置有键按下标志
MOV TKEY,#10 ;4ms*10=40ms
SJMP KY3
KY4: CJNE A,RKEY,KY5 ;是抖动吗?
SJMP KY3
KY5: CLR 20H.3 ;清有键按下标志
KY3: RET
;-------------TLC5615输出子程序--------------------
DA5615: CLR CK5615 ;CLK置低
NOP
NOP
NOP
NOP
NOP
NOP
CLR CS5615 ;CS有效
MOV R0,#DSRAM ;取数据低位单元地址(DSRAM+1,DSRAM)
MOV R2,#16 ;16位数据
DA_1: MOV A,@R0 ;串行左移(高位在前,低位在后)
RLC A
MOV @R0,A
INC R0
MOV A,@R0
RLC A
MOV @R0,A
MOV DI5615,C ;送出有效数据位
NOP
NOP
NOP
NOP
NOP
NOP
SETB CK5615 ;发脉冲
NOP
NOP
NOP
NOP
NOP
NOP
CLR CK5615
NOP
NOP
NOP
NOP
DEC R0 ;恢复R0地址
DJNZ R2,DA_1
SETB CS5615 ;退出DA
NOP
NOP
SETB CK5615
RET
;-------------DA转换程序---------------
DAZH: MOV R6,RAMDA+1
MOV R5,RAMDA
MOV R2,#2
DAZH1: MOV A,R6
RLC A
MOV R6,A
MOV A,R5
RLC A
MOV R5,A
DJNZ R2,DAZH1
MOV A,R5
ANL A,#0FH
MOV DSRAM+1,A ;存高位
MOV A,R6
ANL A,#0FCH
MOV DSRAM,A ;低位
LCALL DA5615 ;DA转换
RET
;---------有关TLC1549芯片子程序---------
CY549: CLR CK549 ;时钟置低
MOV RAMAD,#0 ;AD单元清0(RAMAD,RAMAD+1)
MOV RAMAD+1,#0
MOV R2,#10
CLR CS549 ;置片选有效
NOP
NOP
NOP
NOP
MOV C,DA549 ;取数据
MOV A,RAMAD+1
RLC A
MOV RAMAD+1,A
MOV A,RAMAD
RLC A
MOV RAMAD,A
DEC R2
C549_1: SETB CK549 ;发脉冲
NOP
NOP
NOP
NOP
CLR CK549
NOP
NOP
NOP
NOP
MOV C,DA549 ;取数据
MOV A,RAMAD+1
RLC A
MOV RAMAD+1,A
MOV A,RAMAD
RLC A
MOV RAMAD,A
DJNZ R2,C549_1
SETB CK549 ;发脉冲
NOP
NOP
NOP
NOP
CLR CK549
NOP
NOP
NOP
NOP
SETB CS549 ;置片选无效
NOP
NOP
SETB CK549
MOV A,RAMAD+1 ;数据取反
CPL A
MOV RAMAD+1,A
MOV A,RAMAD
CPL A
ANL A,#03H
MOV RAMAD,A
RET
;------------采样处理---------------
CYCL: LCALL CY549 ;采样
CYCL2: MOV DSRAM,RAMAD ;存放AD值
MOV DSRAM+1,RAMAD+1
MOV R2,#40H
CYCL1: DJNZ R2,CYCL1 ;延时
LCALL CY549 ;采样
MOV A,RAMAD
CJNE A,DSRAM,CYCL2 ;两次不等吗?
MOV A,RAMAD+1
CJNE A,DSRAM+1,CYCL2
JB 20H.5,CYCL3 ;不是首次采样吗?
MOV R2,#4
MOV R0,#30H ;保存AD值
CYCL7: MOV @R0,RAMAD
INC R0
MOV @R0,RAMAD+1
INC R0
DJNZ R2,CYCL7
SETB 20H.5 ;置非首次采样标志
SJMP CYCL4
CYCL3: MOV R2,#6
MOV R0,#37H ;移出旧AD,存放新AD
MOV R1,#35H
CYCL8: MOV A,@R1
MOV @R0,A
DEC R0
DEC R1
DJNZ R2,CYCL8
MOV 31H,RAMAD+1
MOV 30H,RAMAD
CYCL4: MOV DSRAM,#0 ;求新的AD累加和->DSRAM,DARAM+1
MOV DSRAM+1,#0
MOV R2,#4
MOV R0,#37H
CYCL5: MOV A,@R0
ADD A,DSRAM+1
MOV DSRAM+1,A
DEC R0
MOV A,@R0
ADDC A,DSRAM
MOV DSRAM,A
DEC R0
DJNZ R2,CYCL5
CLR C ;除2
MOV A,DSRAM
RRC A
MOV DSRAM,A
MOV A,DSRAM+1
RRC A
MOV DSRAM+1,A
CLR C ;除4
MOV A,DSRAM
RRC A
MOV DSRAM,A
MOV A,DSRAM+1
RRC A
MOV DSRAM+1,A
MOV R0,DSRAM ;求现在值
MOV R1,DSRAM+1
MOV R2,#CN1 ;取比例系数
MOV R3,#CN2
LCALL MML
MOV XZRAM,R4 ;存现在值
MOV XZRAM+1,R5
JNB D25,CYCL6 ;无显现在值指示吗?
LCALL XXZZ ;显现在值
;------------比较处理-------------
CYCL6: MOV RLED1,#0 ;指示灯D1-D24状态清0
MOV RLED2,#0
MOV RLED3,#0
CLR 21H.4 ;清不控制标志
CALL BJCX ;调比较大小子程序(u=|现在值-设定值|)
JB PSW.5,DCL ;有负标志吗?
LJMP NCL ;转浓处理
;-----淡处理
DCL: SETB OUT7 ;关闭过浓输出
JB D31,DCL1 ;是手动吗?
SETB OUT3 ;关闭给水输出
CLR D30 ;灭给水指示
DCL1: CJNE R2,#0,DCL2 ;高位不为0吗?(过淡)
CJNE R3,#5,DCL11
DCL111: LJMP ZCCL ;=5,则转正常处理
DCL11: JC DCL111 ;<5吗?
CJNE R3,#10,DCL12
SJMP DCL3 ;=10
DCL12: JC DCL3 ;<10吗?
CJNE R3,#20,DCL13
SJMP DCL4 ;=15
DCL13: JC DCL4 ;<15吗?
CJNE R3,#30,DCL14
SJMP DCL5 ;=20
DCL14: JC DCL5 ;<20吗?
CJNE R3,#40,DCL15
SJMP DCL6 ;=25
DCL15: JC DCL6 ;<25吗?
CJNE R3,#50,DCL16
SJMP DCL7 ;=30
DCL16: JC DCL7 ;<30吗?
DCL2: SETB D23 ;点亮D24,D23(u<-30)
SETB D24
JB D31,DCL21 ;是手动吗?
CLR OUT4 ;开启排水输出
SETB D29 ;点亮排水指示
SETB 21H.4 ;置不控制标志
DCL21: SJMP ADBJ91
DCL3: SETB D13 ;点亮D14,D13(-10<=u<-5)
SETB D14
SETB 21H.6
SETB OUT4 ;清排水输出
CLR D29 ;清排水显示
SETB OUT3 ;清给水输出
CLR D30 ;清给水显示
MOV 22H,#0 ;清DA标志
MOV 23H,#0
ADBJ61: SETB OUT6 ;清过淡输出
LJMP ADBJ42 ;+++++++++++++++++++++++
DCL4: SETB D15 ;点亮D16,D15(-15<=u<-10)
SETB D16
SJMP ADBJ61
DCL5: SETB D17 ;点亮D18,D17(-20<=u<-15)
SETB D18
SJMP ADBJ61
DCL6: SETB D19 ;点亮D20,D19(-25<=u<-20)
SETB D20
LJMP ADBJB3
ADBJ91: JNB D27,ADBJ92 ;无声音标志吗?
CLR OUT6 ;置过淡输出
ADBJ92: LJMP ADBJB1
DCL7: SETB D21 ;点亮D22,D21(-30<=u<-25)
SETB D22
SJMP ADBJ91
;-----浓处理
NCL: SETB OUT6 ;关闭过淡输出
JB D31,NCL1 ;是手动吗?
SETB OUT4 ;关闭排水输出
CLR D29 ;灭排水指示
NCL1: CJNE R2,#0,NCL2 ;高位不为0吗?(过浓)
CJNE R3,#5,NCL11
NCL111: LJMP ZCCL ;=5,则转正常处理
NCL11: JC NCL111 ;<5吗?
CJNE R3,#10,NCL12
SJMP NCL3 ;=10
NCL12: JC NCL3 ;<10吗?
CJNE R3,#20,NCL13
SJMP NCL4 ;=15
NCL13: JC NCL4 ;<15吗?
CJNE R3,#30,NCL14
SJMP NCL5 ;=20
NCL14: JC NCL5 ;<20吗?
CJNE R3,#40,NCL15
SJMP NCL6 ;=25
NCL15: JC NCL6 ;<25吗?
CJNE R3,#50,NCL16
SJMP NCL7 ;=30
NCL16: JC NCL7 ;<30吗?
NCL2: SETB D1 ;点亮D2,D1(u>30)
SETB D2
JB D31,NCL21 ;是手动吗?
CLR OUT3 ;开启给水输出
SETB D30 ;点亮给水指示
SETB 21H.4 ;置不控制标志
NCL21: SJMP ADBJB1
NCL3: SETB D11 ;点亮D12,D11(5<u<=10)
SETB D12
SETB 21H.6 ;
SETB OUT4 ;清排水输出
CLR D29 ;清排水显示
SETB OUT3 ;清给水输出
CLR D30 ;清给水显示
MOV 22H,#0 ;清DA标志
MOV 23H,#0
SJMP ADBJ41
NCL4: SETB D9 ;点亮D10,D9(10<u<=15)
SETB D10
ADBJ41: SETB OUT7 ;清过浓输出
ADBJ42: SETB OUT2 ;清烧饼控制
SETB OUT5 ;清蜂鸣输出
LJMP ADBJD
NCL5: SETB D7 ;;点亮D8,D7(15<u<=20)
SETB D8
SJMP ADBJ41
NCL6: SETB D5 ;点亮D6,D5(20<u<=25)
SETB D6
SJMP ADBJB3
ADBJB1: JNB D27,ADBJB2 ;无声音标志吗?
CLR OUT7 ;置过浓输出
ADBJB2: CLR OUT2 ;置烧饼控制
JNB D28,ADBJB3 ;无蜂鸣标志吗?
CLR OUT5 ;置蜂鸣输出
ADBJB3: SJMP ADBJD
NCL7: SETB D3 ;点亮D4,D3(25<u<=30)
SETB D4
SJMP ADBJB1
;----正常处理
ZCCL: SETB D12 ;点亮D13,D12(-5<=u<=5)
SETB D13
MOV 22H,#0 ;清DA标志
MOV 23H,#0
JB D31,ZCCL1 ;是手动吗?
SETB OUT4 ;清排水输出
CLR D29 ;清排水显示
SETB OUT3 ;清给水输出
CLR D30 ;清给水显示
SETB 21H.4 ;置不控制标志
ZCCL1: SETB OUT6 ;清过淡输出
SJMP ADBJ41
ADBJD: LCALL LAMP ;指示灯更新
JB 21H.3,DACL ;有DA正常转换标志吗?
LJMP EDCL
;----DA处理
DACL: JNB D24,DACL1 ;不是'+100'吗?
JB 23H.6,EDCL1 ;有'+100'标志吗?
MOV 22H,#00000111B ;清DA标志
MOV 23H,#10000000B
MOV RTEMP,#100
SETB 23H.6 ;置'+100'标志
SJMP EDDA1
DACL1: JNB D22,DACL2 ;不是'+50'吗?
JB 23H.7,EDCL1 ;有'+50'标志吗?
MOV 22H,#00000111B ;清DA标志
MOV 23H,#0
MOV RTEMP,#50
SETB 23H.7 ;置'+50'标志
SJMP EDDA1
DACL2: JNB D20,DACL3 ;不是'+20'吗?
JB 22H.0,EDCL1 ;有'+20'标志吗?
MOV 22H,#00000011B ;清DA标志
MOV 23H,#0
MOV RTEMP,#20
SETB 22H.0 ;置'+20'标志
SJMP EDDA1
DACL3: JNB D18,DACL4 ;不是'+10'吗?
JB 22H.1,EDCL1 ;有'+10'标志吗?
MOV 22H,#00000011B ;清DA标志
MOV 23H,#0
MOV RTEMP,#10
SETB 22H.1 ;置'+10'标志
SJMP EDDA1
DACL4: JNB D16,DACL5 ;不是'+5'吗?
JB 22H.2,EDCL1 ;有'+5'标志吗?
MOV 22H,#0 ;清DA标志
MOV 23H,#0
MOV RTEMP,#5
SETB 22H.2 ;置'+5'标志
EDDA1: MOV A,RAMDA+1 ;执行加法
ADD A,RTEMP
MOV RAMDA+1,A
MOV A,RAMDA
ADDC A,#0
MOV RAMDA,A
CJNE A,#02H,EDDA11
EDDA11: JC EDCL2
MOV RAMDA,#01H
MOV RAMDA+1,#0FFH
EDCL2: LCALL DAZH ;DA转换
EDCL1: SJMP EDCL
DACL5: JNB D9,DACL6 ;不是'-5'吗?
JB 22H.3,EDCL ;有'-5'标志吗?
MOV 22H,#0 ;清DA标志
MOV 23H,#0
MOV RTEMP,#5
SETB 22H.3 ;置'-5'标志
SJMP EDDA2
DACL6: JNB D7,DACL7 ;不是'-10'吗?
JB 22H.4,EDCL ;有'-10'标志吗?
MOV 22H,#00001000B ;清DA标志
MOV 23H,#0
MOV RTEMP,#10
SETB 22H.4 ;置'-10'标志
SJMP EDDA2
DACL7: JNB D5,DACL8 ;不是'-20'吗?
JB 22H.5,EDCL ;有'-20'标志吗?
MOV 22H,#00011000B ;清DA标志
MOV 23H,#0
MOV RTEMP,#20
SETB 22H.5 ;置'-20'标志
SJMP EDDA2
DACL8: JNB D3,DACL9 ;不是'-50'吗?
JB 22H.6,EDCL ;有'-50'标志吗?
MOV 22H,#00111000B ;清DA标志
MOV 23H,#0
MOV RTEMP,#50
SETB 22H.6 ;置'-50'标志
SJMP EDDA2
DACL9: JNB D1,DACLA ;不是'-100'吗?
JB 22H.7,EDCL ;有'-100'标志吗?
MOV 22H,#01111000B ;清DA标志
MOV 23H,#0
MOV RTEMP,#100
SETB 22H.7 ;置'-100'标志
EDDA2: CLR C ;执行减法
MOV A,RAMDA+1
SUBB A,RTEMP
MOV RAMDA+1,A
MOV A,RAMDA
SUBB A,#0
MOV RAMDA,A
JNC EDDA21
MOV RAMDA,#0
MOV RAMDA+1,#0
EDDA21: SJMP EDCL2
DACLA: MOV 22H,#0 ;清DA标志
MOV 23H,#0
EDCL: CLR 20H.6 ;清采样标志
RET
;--------------调比较子程序1-----------------
BJCX: CLR PSW.5 ;清负标志
CLR C ;求|现在值-设定值|->R2R3
MOV A,XZRAM+1 ;取现在值
SUBB A,SDRAM2+1 ;减设定值
MOV R3,A
MOV A,XZRAM
SUBB A,SDRAM2
MOV R2,A
JNC BJCX1 ;现在值>=设定值吗?
SETB PSW.5 ;置负标志
CLR C ;求绝对值
MOV A,#0
SUBB A,R3
MOV R3,A
MOV A,#0
SUBB A,R2
MOV R2,A
BJCX1: RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -