📄 main(jm).asm
字号:
CJNE A,#08,ReadSetTempDate1 ;若8次读取不正确则显示错误码(818)
ErrorDisplay:
CLR EA ;禁止中断
MOV Mumber0,#0AH
MOV Mumber1,#0AH
MOV Mumber2,#0BH ;错误代码(ERR)
LCALL Display ;显示数码
LCALL Dealy
SJMP ErrorDisplay
;保存设定温度
WriterSetTempDate:
LCALL CloseDisplay
LCALL OpenI2c
MOV B,SetTempH
MOV A,#SetTempHE2PROM1
LCALL WriteI2CDate
LCALL DealyLong
MOV B,SetTempH
MOV A,#SetTempHE2PROM2
LCALL WriteI2CDate
LCALL DealyLong
MOV B,SetTempH
MOV A,#SetTempHE2PROM3
LCALL WriteI2CDate
LCALL DealyLong
MOV B,SetTempL
MOV A,#SetTempLE2PROM1
LCALL WriteI2CDate
LCALL DealyLong
MOV B,SetTempL
MOV A,#SetTempLE2PROM2
LCALL WriteI2CDate
LCALL DealyLong
MOV B,SetTempL
MOV A,#SetTempLE2PROM3
LCALL WriteI2CDate
LCALL DealyLong
LCALL CloseI2c
RET
;*************************************************************
;定时中断1子程序:
DINS1:
POP ProgramAddressT1
POP ProgramAddressT1+1
PUSH ProgramAddressT1+1
PUSH ProgramAddressT1
PUSH ACC
PUSH PSW
PUSH DPH
PUSH DPL
PUSH B
;------------------------------------------------------------
;在中断程序中判断堆栈指针及程序是否处于正常范围内运行
MOV A,SP
CJNE A,#STACK,AdjustSpT11
AdjustSpT11:
JC AdjustSpT12;堆栈指针出错
CLR C
MOV A,ProgramAddressT1+1
SUBB A,#LOW(START)
MOV A,ProgramAddressT1
SUBB A,#HIGH(START)
JC AdjustSpT12 ;断点小于START则转
MOV A,#LOW(ProgramEndAddress)
SUBB A,ProgramAddressT1+1
MOV A,#HIGH(ProgramEndAddress)
SUBB A,ProgramAddressT1
JC AdjustSpT12 ;断点大于ProgramEndAddress则转
;------------------------------------------------------------
JB DisplayStatu,DINS10
MOV TH1,#0E0H
MOV TL1,#0BFH ;8ms中断一次
LCALL ReadKey
LCALL Display
POP B
POP DPL
POP DPH
POP PSW
POP ACC
RETI
NOP
NOP
DINS10:
MOV TH1,#00H
MOV TL1,#00H ;8ms中断一次
INC Timer
MOV A,Timer
CJNE A,#SetTimer,DINS11
MOV Timer,#00H
CPL XSBJ
DINS11:
INC Timer1
MOV A,Timer1
CJNE A,#SetWaitTimer,DINS12
MOV Timer1,#00H
SETB FHBJ
SETB FHBJ
DINS12:
INC Timer2
MOV A,Timer2
CJNE A,ChangSpeed,DINS13
MOV Timer2,#00H
CPL ChangOk
DINS13:
POP B
POP DPL
POP DPH
POP PSW
POP ACC
RETI
AdjustSpT12:
MOV ProgramAddressT1+1,#00H
MOV ProgramAddressT1,#00H
PUSH ProgramAddressT1+1
PUSH ProgramAddressT1
RETI
;-------------------------------------------------------------
;定时中断0子程序:
DINS:
PUSH ACC
PUSH PSW
SETB RS0
CLR TR0 ;定时器初始化
LCALL CloseDisplay
MOV TH0,#0
MOV TL0,#0
CLR RC ;电容开始充电
CLR RC ;电容开始充电
SETB TR0 ;开始计时
ADC1:
JNB JUDE,ADC1 ;等待充电达到Vi
CLR TR0 ;冻结定时器
CLR TR0 ;冻结定时器
MOV R3,TL0 ;读取充电时间间隔
MOV R2,TH0
MOV TH0,#068H ;约38mS定时
MOV TL0,#000H
SETB TR0 ;定时器继续工作
SETB RC ;放电,准备下次充电
SETB RC ;放电,准备下次充电
MOV A,R3 ;累加采样值
ADD A,TOTALL
MOV TOTALL,A
MOV A,R2
ADDC A,TOTALM
MOV TOTALM,A
CLR A
ADDC A,TOTALH
MOV TOTALH,A
INC CLOCK ;检测次数加一
MOV A,CLOCK
ANL A,#0FH
NOP
NOP
JZ ADC2
DINSE:
POP PSW
POP ACC
RETI ;检测未满16次,中断返回
NOP
NOP
ADC2:
MOV A,TOTALL ;检测满16次,求平均充电时间,保存到R2R3
SWAP A
ANL A,#0FH
MOV R3,A
MOV A,TOTALM
SWAP A
ANL A,#0F0H
ORL A,R3
MOV R3,A
MOV VIL,A
MOV A,TOTALM
SWAP A
ANL A,#0FH
MOV R2,A
MOV A,TOTALH
SWAP A
ORL A,R2
MOV R2,A
MOV VIH,A
CLR A ;清零累加器,为下一次检测作准备
MOV TOTALH,A
MOV TOTALM,A
MOV TOTALL,A
SETB ReadTempOK
LJMP DINSE
;******************************************************
;*******************************************************
CloseDisplay:
MOV P3,#0FFH
SETB XM0
SETB XM1
SETB XM2
MOV P3,#0FFH
SETB XM0
SETB XM1
SETB XM2
RET
;显示数码
Display:
PUSH PSW
SETB RS1
MOV A,DisPort
CJNE A,#SetDisplayBit,Display1
MOV DisPort,#00H
MOV A,#00H
Display1:
LCALL DisplayMumber ;每循环一次显示1位数码管
INC DisPort
POP PSW
RET
;-------------------------------------------
;显示一位数码
;输入: A 数码管端口号
; Mumber0 -- Mumber2
;输出 A 键值
DisplayMumber:
LCALL CloseDisplay
JNB XSBJ,DisplayMumber3
MOV B,A
MOV R0,#Mumber0
ADD A,R0
MOV R0,A
MOV A,@R0
MOV DPTR,#MumberTemp
MOVC A,@A+DPTR
MOV P3,A
MOV A,B
CJNE A,#00H,DisplayMumber1
SETB XM0
SETB XM1
CLR XM2
RET
DisplayMumber1:
CJNE A,#01H,DisplayMumber2
SETB XM0
CLR XM1
SETB XM2
RET
DisplayMumber2:
CJNE A,#02H,DisplayMumber3
CLR XM0
SETB XM1
SETB XM2
MOV A,KeyCodeTemp
RET
DisplayMumber3:
RET
;*************************************************************
;二进制整数转换为十进制数
;输入二进在R2R3中
;输出在Mumber0--Mumber4中
IBTD2:
CLR A
MOV R4,A
MOV R5,A
MOV R6,A
MOV R7,#16
IBTD21:
CLR C
MOV A,R3
RLC A
MOV R3,A
MOV A,R2
RLC A
MOV R2,A
MOV A,R6
ADDC A,R6
DA A
MOV R6,A
MOV A,R5
ADDC A,R5
DA A
MOV R5,A
MOV A,R4
ADDC A,R4
DA A
MOV R4,A
NOP
NOP
DJNZ R7,IBTD21
MOV R0,#Mumber0
MOV A,R6
XCHD A,@R0
INC R0
SWAP A
XCHD A,@R0
INC R0
MOV A,R5
XCHD A,@R0
RET
;*************************************************************
;设置显示模式
;输入 A 0 不闪烁
; 1 闪烁
SetDisplayMode:
CLR TR1
CLR ET1
SETB XSBJ ;数码管显示
JZ SetDisplayMode1
SETB DisplayStatu ;闪烁显示
SETB DisplayStatu ;闪烁显示
MOV TH1,#00H
MOV TL1,#00H
SETB TR1
SETB ET1
SETB EA
RET
SetDisplayMode1:
CLR DisplayStatu ;正常显示
CLR DisplayStatu ;正常显示
MOV TH1,#0E0H
MOV TL1,#0BFH ;8ms中断一次
SETB TR1
SETB ET1
SETB EA
RET
;*************************************************************
;读键盘
;键值在KeyCode中
ReadKey:
SETB KeyPort
SETB KeyPort
MOV P3,#0FFH
SETB XM0
SETB XM1
CLR XM2
JB KeyPort,ReadKey1
MOV A,KeyCodeTemp
CJNE A,#UpKey,ReadKey01 ;上一次按键为上键吗
INC KeyCount ;为上键则相同按键次数加1
MOV A,KeyCount
CJNE A,#SetCompKey,ReadKey00
MOV KeyCount,#00H
MOV Timer1,#00H ;有键按下时清等待返回计数器
MOV KeyCode,#UpKey
ReadKey00:
RET
ReadKey01:
MOV KeyCodeTemp,#UpKey
MOV KeyCount,#00H
RET
;---------------------------------------------------------------
ReadKey1:
SETB XM0
CLR XM1
SETB XM2
JB KeyPort,ReadKeyE
MOV A,KeyCodeTemp
CJNE A,#DownKey,ReadKey11 ;上一次按键为上键吗
INC KeyCount ;为上键则相同按键次数加1
MOV A,KeyCount
CJNE A,#SetCompKey,ReadKey10
MOV KeyCount,#00H
MOV Timer1,#00H ;有键按下时清等待返回计数器
MOV KeyCode,#DownKey
ReadKey10:
RET
ReadKey11:
MOV KeyCodeTemp,#DownKey
MOV KeyCount,#00H
RET
;---------------------------------------------------------------
ReadKeyE:
MOV KeyCount,#00H
MOV KeyCodeTemp,#UnKey
MOV KeyCode,#UnKey
RET
NOP
NOP
Dealy:
MOV R2,#07H
Delay1:
MOV R3,#088H
Delay2:
NOP
NOP
DJNZ R3,Delay2
DJNZ R2,Delay1
RET
NOP
NOP
;***************************************************************
; 系统加密
;名称: SystemEncrypt
;描述: 先通过仿真器,把MainLoop程序起始地址放入片外24c02芯片中,
;然后通过该程序把地址读入,并放入堆栈顶部,执行RET指令时,程序跳到
;MainLoop中执行
;---------------------------------------------------------------
SystemEncrypt:
CLR A
MOV R1,A
MOV @R1,#STACK
SETB RS0
LCALL ReadAddress
CLR RS0
MOV @R0,A
INC R0
MOV A,B
MOV @R0,A
RET
;***************************************************************
; 读24C02中的地址
;名称: ReadAddress
;描述: A中为地址低字节,B中为地址高字节
;堆栈操作:
;若SP=60H,则当执行一调用指令后,PC进栈,PCL保护到61H,PCH保护到62H,
;(SP)=62H.
;---------------------------------------------------------------
ReadAddress:
MOV A,#029H
LCALL ReadI2CDate
MOV B,A
PUSH B
LCALL DealyLong
MOV A,#028H
LCALL ReadI2CDate
POP B
RET
;****************************************************************
TempTab:
DW 1078, 0, 3624, 50, 6231,100, 8821,150, 11508,200
DW 14213,250, 17012,300, 19813,350
NOP
NOP
NOP
LJMP 0000H
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -