主流程调用没反应!求解
时间:10-02
整理:3721RD
点击:
ORG 0000H ;复位入口
LJMP MAIN ;转往主程序
;ORG 0003H ;外部中断0服务子程序入口
;LJMP IX0P ;INT0下降沿请求中断:将小时数加1
;ORG 000BH ;定时器0中断服务子程序入口
;LJMP IT0P ;对T0输入负脉冲每计满1次即请求中断:将分钟数加1
ORG 001BH ;定时器1中断服务子程序入口
LJMP IT1P ;定时中断:进行实时钟计时
ORG 0030H ;主程序
MAIN:MOV SP,#6FH ;总初始化,设定栈底指针
ACALL D40MS ;稍加延时(40mS),以待各芯片均退出复位状态
MOV DPTR,#0FEFFH ;对8255A(U3)接口芯片初始化
MOV A,#89H ;设定为A输出(驱动字段)、B口输出(驱动字位),C口输入
MOVX @DPTR,A ;写入方式控制字
MOV DPTR,#0FEFCH ;DPTR指向U3-A口
MOV A,#0FFH ;置八段均不亮的字段码(8255A初始化后输出寄存器全‘0')
MOVX @DPTR,A ;输出,关数码显示器(段输出口初始驱动全为‘1'无效)
MOV DPTR,#0FDFFH ;对8255A(U5)接口芯片初始化
MOV A,#8BH ;设定为A口输出(驱L8~15),B口输入(按钮PB0~7),C口输入(开关SW0~7)
MOVX @DPTR,A ;写入方式控制字
MOV DPTR,#0FDFCH ;DPTR指向U5-A口
MOV A,#0FFH ;置八位输出均为‘1'无效
MOVX @DPTR,A ;输出,令L8-15初始不亮
MOV 40H,#00H ;判断当前工作是否正常(正常/警告)
MOV 41H,#00H ;判断警告错误方式(溢出/干烧)
MOV 42H,#00H ;判断当前工作状态(待机/启动)
MOV 43H,#00H ;判断当前功能选择状态(豆浆/果汁)
MOV 44H,#00H ;编辑状态下判断闪烁位
MOV 45H,#00H ;判断是否进入保温模式
MOV 46H,#00H ;判断是否进入时钟编辑模式
MOV 47H,#00H ;判断是否闪烁
MOV 48H,#00H ;倒计时秒单元
MOV 50H,#00H ;倒计时分单元
MOV 51H,#00H ;工序号存储单元
MOV 52H,#00H ;存储当前温度单元
MOV 53H,#23H ;35度控制温度存储单元
MOV 54H,#32H ;50度控制温度存储单元
MOV 55H,#00H ;溢出警告单元
MOV 56H,#00H ;干烧警告单元
MOV 59H,#00H ;判断计时是否满5秒
MOV 30H,#10H ;30H-37H为显示缓冲单元,初始值令显示‘12-59-45’
MOV 31H,#05H
MOV 33H,#09H
MOV 34H,#05H
MOV 36H,#59H
MOV 37H,#12H
SETB EA ;开中断总允许
MOV 38H,#00H ;38H单元为实时钟200uS计数单元,清0
MOV 39H,#00H ;39H单元为10mS计数单元,清0
MOV 3AH,#45H ;秒单元初值
MOV 3BH,#59H ;分单元初值
MOV 3CH,#12H ;时单元初值,时钟初值12-59-45
MOV TL1,#0 ;置T1计数初值。00H-48H=C8H=184,184×TM≈200uS(199.6527778μS)
MOV TH1,#0 ;即每约200uS请求中断。(TM=12×1/11.0592MHZ=1.085069444μS)
SETB ET1 ;开T1中断允许
SETB TR1 ;启动T1定时工作
MOV 2EH,#00H
MOV 2FH,#00H
LOOP:ACALL FGS ;调用液位判断报警子模块
ACALL TPB ;调用PB0,PB1功能选择子模块
ACALL XDPB ;调用消抖单按键输入
ACALL KT ;调用K0-K3时分调校子模块
ACALL CZ ;调用显示内容送显缓子程序(拆字)(将时分秒送右6位显示缓冲单元)
ACALL KEY ;调用键盘扫描子程序 (扫描到按键压下时在左第3位显示键号)
ACALL DISP ;调用显示更新子程序 (动态驱动8位数码显示器一遍,约8mS)
ACALL LNP1 ;调用功能指示子模块
;ACALL ADSUB ;调用A/D子模块采取当前温度
SJMP LOOP ;反复循环主流程
FGS:MOV DPTR,#0FDFEH ;电平开关SW0~7检测且控制L8~L15子程序
MOVX A,@DPTR ;输入SW0~7电平
JNB ACC.0,LP1 ;开关0为0则溢出状态
JNB ACC.1,LP2
RET
LP1:MOV 40H,#01H
CLR P3.2
MOV P1,#00H ;输入驱动L0-L7
ACALL EE ;调用500毫秒延时
SETB P3.2
MOV P1,#0FFH ;灭L0-L7
ACALL EE ;调用500毫秒延时
ACALL D03S ;调用3秒延时
JNB ACC.0,LP1
RET
LP2:MOV 40H,#01H
MOV 41H,#01H
CLR P3.2
MOV P1,#00H ;输入驱动L0-L5
ACALL EE ;调用500毫秒延时
SETB P3.2
MOV P1,#0FFH ;灭L0-L5
ACALL EE ;调用500毫秒延时
JNB ACC.1,LP2
RET
EE:MOV R5,#5 ;延时500ms
EE1:MOV R6,#200
EE2:MOV R7,#250
EE3:DJNZ R7,EE3
DJNZ R6,EE2
DJNZ R5,EE1
RET
AA0:MOV R4,#3 ;延时一分钟
AA:MOV R5,#200
AA1:MOV R6,#200
AA2:MOV R7,#250
AA3:DJNZ R7,AA3
DJNZ R6,AA2
DJNZ R5,AA1
DJNZ R4,AA0
RET
D03S:MOV R7,#25
D03S2:MOV R6,#200
D03S1:MOV R5,#200 ;3秒延时
D03S0:NOP
DJNZ R5,D03S0
DJNZ R6,D03S1
DJNZ R7,D03S2
RET
LNP1:MOV A,43H
CJNE A,#2,LNP2
CLR P1.3
LNP2:CJNE A,#1,LNP3
CLR P1.2
LNP3: RET
TPB:JNB 2FH.5,TPB ;(启动/取消)判PB5下降沿
JB 2EH.5,TPB
TPB1:JNB 2FH.6,TPB1 ;(豆浆/果汁)判PB6下降沿
JB 2EH.6,TPB1
MOV 43H,#01H ;判断当前功能选择状态(豆浆/果汁)
JNB 2FH.6,TPB2 ;(豆浆/果汁)判PB6下降沿
JNB 2EH.6,TPB2
MOV 43H,#02H ;判断当前功能选择状态(豆浆/果汁)
SJMP TPB1
TPB2:MOV R1,#120
JNB 2FH.6,TPB1 ;(豆浆/果汁)判PB6下降沿
JB 2EH.6,TPB1
JNB 2FH.5,TPB ;(启动/取消)判PB5下降沿
JB 2EH.5,TPB
ACALL EE
DJNZ R1,TPB2
MOV 42H,#01H ;启动
GN:MOV A,43H ;判断当前功能选择状态(豆浆/果汁)
CJNE A,#00H,GK
ACALL GN0
CJNE A,#01H,GK
ACALL GN15
GK:RET
GN0:INC 51H
GN2:MOV A,52H
MOV R0,53H ;加热至35度
CLR P1.0
SUBB A,@R0
JC GN3
SJMP GN2
GN3:INC 51H
GN4:SETB P1.0
CLR P1.1 ;打浆25秒
ACALL D15S
SETB P1.1
ACALL D25S
GN5:INC 51H
GN6:MOV A,52H
MOV R1,54H ;加热至50度
CLR P1.0
SUBB A,@R1
JC GN7
SJMP GN6
GN7:INC 51H
GN8:SETB P1.0 ;打浆25秒
CLR P1.1
ACALL D25S
SETB P1.1
ACALL D25S
GN9:INC 51H
GN10:MOV A,53H ;加热至50度
MOV R0,54H
CLR P1.0
SUBB A,@R0
JC GN11
SJMP GN10
GN11:INC 51H
GN12:MOV R1,#4
JNB ACC.3,GN13 ;煮浆4分钟
DJNZ R1,GN12
GN13:MOV R0,#10
ACALL EE ;调用5秒延时
JNB ACC.3,GN12
SJMP GN14
GN14:SETB P1.0
CLR P1.4
CLR P3.2
ACALL AA0 ;一分钟后进入保温
RET
GN15:INC 51H
GN16:MOV R3,#4
CLR P1.3 ;启动预打浆
ACALL D25S ;调用25秒延时
SETB P1.3
ACALL D15S ;调用15秒延时
DJNZ R3,GN15
RET
D15S:MOV R7,#125
D15S2:MOV R6,#200
D15S1:MOV R5,#200
D15S0:NOP ;15秒延时
DJNZ R5,D15S0
DJNZ R6,D15S1
DJNZ R7,D15S2
RET
D25S:MOV R7,#210
D25S2:MOV R6,#200
D25S1:MOV R5,#200 ;25秒延时
D25S0:NOP
DJNZ R5,D25S0
DJNZ R6,D25S1
DJNZ R7,D25S2
RET
;CZ: ;MOV A,4OH
;CJNE A,#OOH,CZ1 ;当前未无警告状态
;MOV A,41H
;CJNE A,#OOH,CZ4 ;判断当前警告模式
;CZ: MOV A,51H ;取当前数据单元BCD码
;ANL A,#0FH ;保留低4位(个位)
;MOV 36H,A ;送显缓当前个位单元
;ANL A,#0F0H ;保留高4位(十位)
;SWAP A ;交换到低4位
;MOV 37H,A ;送显缓当前十位单元
;MOV A,48H ;取当前数据单元BCD码
;ANL A,#0FH ;保留低4位(个位)
;MOV 32H,A ;送显缓当前个位单元
;ANL A,#0F0H ;保留高4位(十位)
;SWAP A ;交换到低4位
;MOV 33H,A ;送显缓当前十位单元
;MOV A,50H ;取当前数据单元BCD码
;ANL A,#0FH ;保留低4位(个位)
;MOV 34H,A ;送显缓当前个位单元
;ANL A,#0F0H ;保留高4位(十位)
;SWAP A ;交换到低4位
;MOV 35H,A ;送显缓当前十位单元
;MOV A,52H ;取当前数据单元BCD码
;ANL A,#0FH ;保留低4位(个位)
;MOV 30H,A ;送显缓当前个位单元
;ANL A,#0F0H ;保留高4位(十位)
;SWAP A ;交换到低4位
;MOV 31H,A ;送显缓当前十位单元
;RET ;子程序返回
CZ: ;MOV A,46H
;CJNE A,#01H,CZ3 ;当前为时钟编辑状态
MOV A,3AH ;取当前数据单元BCD码
ANL A,#0FH ;保留低4位(个位)
MOV 30H,A ;送显缓当前个位单元
ANL A,#0F0H ;保留高4位(十位)
SWAP A ;交换到低4位
MOV 31H,A ;送显缓当前十位单元
MOV A,3BH ;取当前数据单元BCD码
ANL A,#0FH ;保留低4位(个位)
MOV 33H,A ;送显缓当前个位单元
ANL A,#0F0H ;保留高4位(十位)
SWAP A ;交换到低4位
MOV 34H,A ;送显缓当前十位单元
MOV A,3CH ;取当前数据单元BCD码
ANL A,#0FH ;保留低4位(个位)
MOV 36H,A ;送显缓当前个位单元
ANL A,#0F0H ;保留高4位(十位)
SWAP A ;交换到低4位
MOV 37H,A ;送显缓当前十位单元
MOV 32H,#16H
MOV 33H,#16H
RET ;子程序返回
;CZ3:MOV A,3BH ;取当前数据单元BCD码
;ANL A,#0FH ;保留低4位(个位)
;MOV 32H,A ;送显缓当前个位单元
;ANL A,#0F0H ;保留高4位(十位)
;SWAP A ;交换到低4位
;MOV 33H,A ;送显缓当前十位单元
;MOV A,3CH ;取当前数据单元BCD码
;ANL A,#0FH ;保留低4位(个位)
;MOV 36H,A ;送显缓当前个位单元
; ANL A,#0F0H ;保留高4位(十位)
;SWAP A ;交换到低4位
;MOV 37H,A ;送显缓当前十位单元
;RET
KEY:MOV 65H,64H ;将上次扫描键号存为前键号
MOV DPTR,#0FEFFH ;键盘扫描子程序(反转法)。
MOV A,#81H
MOVX @DPTR,A ;C口先初始化为高4位输出方式驱键行线、低4位输入方式键列线
MOV A,#0FFH ;消除窜显
MOV DPTR,#0FEFCH
MOVX @DPTR,A
MOV DPTR,#0FEFEH ;DPTR指向C口
MOV A,#00H
MOVX @DPTR,A ;键盘行线(高4位)输出驱动全'0'
MOVX A,@DPTR ;输入键盘列线电平(低4位)存60H单元
MOV 60H,A
MOV DPTR,#0FEFFH
MOV A,#88H
MOVX @DPTR,A ;C口改初始化为高4位输入驱键行线、低4位输出驱键列线
MOV A,#0FFH ;消除窜显
MOV DPTR,#0FEFCH
MOVX @DPTR,A
MOV DPTR,#0FEFEH ;DPTR指向C口
MOV A,#00H
MOVX @DPTR,A ;键盘列线(低4位)输出驱动全'0'
MOVX A,@DPTR ;输入键盘行线电平(高4位)在A中
ANL 60H,#0FH ;保留列线电平值所在的低4位
ANL A,#0F0H ;保留行线电平值所在的高4位
ORL 60H,A ;将列线电平值、行线电平值组合成8位行列码于60H单元中
MOV 61H,#00H ;键号值从00H开始
MOV R5,#10H ;设定最多进行16次的键码查表
MOV DPTR,#KEY_N ;DPTR指向键码表首地址
KY:MOV A,61H ;置当前键号于A中
MOVC A,@A+DPTR ;查表读取键码表中当前键号对应位置的键码
CJNE A,60H,NK ;与8位行列码比较,不同则转NK查下一个
SJMP KN ;相同,表明查到了当前按下的键号,转KN进行键功能处理
KEY_N:DB 0EEH,0EDH,0EBH,0E7H ;键码表。K0,K1,K2,K3键码
DB 0DEH,0DDH,0DBH,0D7H ;K4,K5,K6,K7键码
DB 0BEH,0BDH,0BBH,0B7H ;K8,K9,K10,K11键码
DB 7EH,7DH,7BH,77H ;K12,K13,K14,K15键码
NK:INC 61H ;键号值加1
DJNZ R5,KY ;未查完键值表则继续
;查完,说明无按键或出现异常行列码,结束并返回
KN:MOV 64H,61H
RET
KT:MOV A,65H ;K0进入时钟编辑模式
CJNE A,#10H,LKD ;前面无按键,则跳转LK1
MOV A,64H
CJNE A,#00H,LKD ;检测键0是否有按下
MOV 46H,#01H
LK0:MOV A,46H
JZ LKD
MOV A,65H ;K1,K2时分调校子模块
CJNE A,#10H,LK1 ;前面无按键,则跳转LK1
MOV A,64H
CJNE A,#01H,LK1 ;检测键1是否有按下
MOV 3AH,#00H ;清零秒单位及其前一级计数单位
MOV 39H,#00H
MOV A,3CH ;键1按下,则小时单元加1
ADD A,#01H
DA A
MOV 3CH,A
CJNE A,#24H,LK1
MOV 3CH,#00H
RET
LK1:MOV A,46H
JZ LKD
MOV A,65H
CJNE A,#10H,LK2 ;前面无按键则跳转到LK2
MOV A,64H
CJNE A,#02H,LK2 ;检测键2是否有按下
MOV 3AH,#00H ;清零秒单位及其前一级计数单位
MOV 39H,#00H
MOV A,3BH ;分钟单位按百分之一秒BCD加1
ADD A,#01H
DA A
MOV 3BH,A
CJNE A,#60H,LK2
MOV 3BH,#00H
RET
LK2:MOV A,65H
CJNE A,#10H,LKD ;前面无按键则跳转到LKD
MOV A,64H
CJNE A,#03H,LKD ;检测键3是否有按下
MOV 46H,#00H
LKD:RET
;ADSUB:MOV DPTR,#0FBF8H ;A/D子程序。
;MOVX @DPTR,A ;启动对IN0输入模拟电压信号的A/D转换
;LCALL D1MS ;延时等待A/D转换结束
;MOVX A,@DPTR ;读取A/D转换结果的8位二进制数字值
;MOV 52H,A
;MOV B,A ;A/D转换结果拆送最左两位显示缓冲单元
;ANL A,#0FH
;MOV 30H,A
;MOV A,B
;ANL A,#0F0H
;SWAP A
;MOV 31H,A
;RET
DISP:MOV R0,#30H ;显示缓冲单元首地址
MOV R3,#01H ;字位码初值(从最右位起)
PDNZ:MOV A,46H
CJNE A,#01H,DISP1_1_C ;判断是否进入编辑模式
NZ:MOV A,44H ;判断闪烁状态
CJNE A,#00H,ZT ;亮
MOV A,R3
LJMP DISP1_1
ZT:MOV A,R3 ;暗
ANL A,47H
LJMP DISP1_1
DISP1_1_C:MOV A,R3
DISP1_1:MOV DPTR,#0FEFDH ; 8255B口(字位码输出口)
MOVX @DPTR,A ; 输出字位码
MOV A,@R0 ; 取显示数据码
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV DPTR,#0FEFCH
MOVX @DPTR,A ; 输出字段码
LCALL D1MS ; 保持显示1毫秒
MOV A,#0FFH
MOVX @DPTR,A
INC R0 ; 指向下一显示缓冲单元
MOV A,R3 ; 取出字位码
JB ACC.7,DISP2 ; 判已显示到最左位否
RL A ; 未完,字位码左移1位
MOV R3,A
AJMP PDNZ
DISP2:RET ; 转下一位显示
TAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H ;"0"~"9" 显示字段码表
DB 88H,83H,0C6H,0A1H,86H,8EH,0BFH,0C8H ;"A"-"F","-","N",
DB 40H,79H,24H,30H,19H,12H,02H,78H,00H,10H,01H ;"0."~"9." 显示字段码表
D1MS:MOV R7,#250 ;延时1毫秒子程序
D1MS1:NOP
NOP
NOP
NOP
DJNZ R7,D1MS1
RET
XDPB:MOV 2FH,2EH ;原新态存为前态,滚动滤波法消除按键抖动
MOV 2DH,2CH ;前4次输入的电平值推至2AH~2DH单元
MOV 2CH,2BH
MOV 2BH,2AH
MOV 2AH,29H
MOV DPTR,#0FDFDH ;输入pb0~7新电平值,存29H单元
MOVX A,@DPTR
MOV 29H,A
MOV A,2DH ;比较近5次输入的电平值不一致则新态照旧
CJNE A,2CH,XDR
CJNE A,2BH,XDR
CJNE A,2AH,XDR
CJNE A,29H,XDR
MOV 2EH,A ;近5次输入的电平值一致则存为新态
XDR:RET
;IX0P:PUSH ACC ;外部中断0服务子程序。保护现场
;PUSH PSW
;MOV A,3CH ;小时单元(按BCD码)加1
;ADD A,#1
;DA A
;MOV 3CH,A
;CJNE A,#24H,X0R ;满24小时?
MOV 3CH,#0 ;满:将小时单元清零
; X0R:POP PSW ;恢复现场
;POP ACC
;RETI ;中断返回
;IT0P:PUSH ACC ;外部中断0服务子程序。保护现场
;PUSH PSW
;MOV A,3BH ;分钟单元(按BCD码)加1
;;ADD A,#1
;DA A
;MOV 3BH,A
;CJNE A,#60H,T0R ;满60分钟?
;MOV 3BH,#0 ;满:将分钟单元清零
;T0R:POP PSW ;恢复现场
;POP ACC
;RETI ;中断返回
IT1P:PUSH ACC ;定时器1服务子程序。保护现场
PUSH PSW
INC 38H ;每200uS加1
MOV A,38H
CJNE A,#36,DONE ;满10mS?
MOV 38H,#0 ;200uS计数单元清0
MOV A,39H ;BCD表示百分之一秒
ADD A,#01H
DA A
MOV 39H,A
CJNE A,#00H,DONE;满1秒?
MOV 39H,#0 ;10mS计数单元清0
MOV A,3AH ;秒单元(按BCD码)加1
ADD A,#1
DA A
MOV 3AH,A
CJNE A,#60H,DONE;满1分钟?
MOV 3AH,#0 ;秒单元清零
MOV A,3BH ;分钟单元(按BCD码)加1
ADD A,#1
DA A
MOV 3BH,A
CJNE A,#60H,DONE;满1小时?
MOV 3BH,#0 ;分钟单元清零
MOV A,3CH ;小时单元(按BCD码)加1
ADD A,#1
DA A
MOV 3CH,A
CJNE A,#24H,DONE;满24小时?
MOV 3CH,#0 ;小时单元清零
DONE:POP PSW ;恢复现场
POP ACC
RETI ;中断返回
D40MS:MOV R6,#61 ;软件延时约40mS子程序
D30MS1:MOV R5,#200 ;[1+(1+3*200+2)*61+4]*12/11059.2KHz=39.9mS
D30MS0:NOP
DJNZ R5,D30MS0
DJNZ R6,D30MS1
RET
END
LJMP MAIN ;转往主程序
;ORG 0003H ;外部中断0服务子程序入口
;LJMP IX0P ;INT0下降沿请求中断:将小时数加1
;ORG 000BH ;定时器0中断服务子程序入口
;LJMP IT0P ;对T0输入负脉冲每计满1次即请求中断:将分钟数加1
ORG 001BH ;定时器1中断服务子程序入口
LJMP IT1P ;定时中断:进行实时钟计时
ORG 0030H ;主程序
MAIN:MOV SP,#6FH ;总初始化,设定栈底指针
ACALL D40MS ;稍加延时(40mS),以待各芯片均退出复位状态
MOV DPTR,#0FEFFH ;对8255A(U3)接口芯片初始化
MOV A,#89H ;设定为A输出(驱动字段)、B口输出(驱动字位),C口输入
MOVX @DPTR,A ;写入方式控制字
MOV DPTR,#0FEFCH ;DPTR指向U3-A口
MOV A,#0FFH ;置八段均不亮的字段码(8255A初始化后输出寄存器全‘0')
MOVX @DPTR,A ;输出,关数码显示器(段输出口初始驱动全为‘1'无效)
MOV DPTR,#0FDFFH ;对8255A(U5)接口芯片初始化
MOV A,#8BH ;设定为A口输出(驱L8~15),B口输入(按钮PB0~7),C口输入(开关SW0~7)
MOVX @DPTR,A ;写入方式控制字
MOV DPTR,#0FDFCH ;DPTR指向U5-A口
MOV A,#0FFH ;置八位输出均为‘1'无效
MOVX @DPTR,A ;输出,令L8-15初始不亮
MOV 40H,#00H ;判断当前工作是否正常(正常/警告)
MOV 41H,#00H ;判断警告错误方式(溢出/干烧)
MOV 42H,#00H ;判断当前工作状态(待机/启动)
MOV 43H,#00H ;判断当前功能选择状态(豆浆/果汁)
MOV 44H,#00H ;编辑状态下判断闪烁位
MOV 45H,#00H ;判断是否进入保温模式
MOV 46H,#00H ;判断是否进入时钟编辑模式
MOV 47H,#00H ;判断是否闪烁
MOV 48H,#00H ;倒计时秒单元
MOV 50H,#00H ;倒计时分单元
MOV 51H,#00H ;工序号存储单元
MOV 52H,#00H ;存储当前温度单元
MOV 53H,#23H ;35度控制温度存储单元
MOV 54H,#32H ;50度控制温度存储单元
MOV 55H,#00H ;溢出警告单元
MOV 56H,#00H ;干烧警告单元
MOV 59H,#00H ;判断计时是否满5秒
MOV 30H,#10H ;30H-37H为显示缓冲单元,初始值令显示‘12-59-45’
MOV 31H,#05H
MOV 33H,#09H
MOV 34H,#05H
MOV 36H,#59H
MOV 37H,#12H
SETB EA ;开中断总允许
MOV 38H,#00H ;38H单元为实时钟200uS计数单元,清0
MOV 39H,#00H ;39H单元为10mS计数单元,清0
MOV 3AH,#45H ;秒单元初值
MOV 3BH,#59H ;分单元初值
MOV 3CH,#12H ;时单元初值,时钟初值12-59-45
MOV TL1,#0 ;置T1计数初值。00H-48H=C8H=184,184×TM≈200uS(199.6527778μS)
MOV TH1,#0 ;即每约200uS请求中断。(TM=12×1/11.0592MHZ=1.085069444μS)
SETB ET1 ;开T1中断允许
SETB TR1 ;启动T1定时工作
MOV 2EH,#00H
MOV 2FH,#00H
LOOP:ACALL FGS ;调用液位判断报警子模块
ACALL TPB ;调用PB0,PB1功能选择子模块
ACALL XDPB ;调用消抖单按键输入
ACALL KT ;调用K0-K3时分调校子模块
ACALL CZ ;调用显示内容送显缓子程序(拆字)(将时分秒送右6位显示缓冲单元)
ACALL KEY ;调用键盘扫描子程序 (扫描到按键压下时在左第3位显示键号)
ACALL DISP ;调用显示更新子程序 (动态驱动8位数码显示器一遍,约8mS)
ACALL LNP1 ;调用功能指示子模块
;ACALL ADSUB ;调用A/D子模块采取当前温度
SJMP LOOP ;反复循环主流程
FGS:MOV DPTR,#0FDFEH ;电平开关SW0~7检测且控制L8~L15子程序
MOVX A,@DPTR ;输入SW0~7电平
JNB ACC.0,LP1 ;开关0为0则溢出状态
JNB ACC.1,LP2
RET
LP1:MOV 40H,#01H
CLR P3.2
MOV P1,#00H ;输入驱动L0-L7
ACALL EE ;调用500毫秒延时
SETB P3.2
MOV P1,#0FFH ;灭L0-L7
ACALL EE ;调用500毫秒延时
ACALL D03S ;调用3秒延时
JNB ACC.0,LP1
RET
LP2:MOV 40H,#01H
MOV 41H,#01H
CLR P3.2
MOV P1,#00H ;输入驱动L0-L5
ACALL EE ;调用500毫秒延时
SETB P3.2
MOV P1,#0FFH ;灭L0-L5
ACALL EE ;调用500毫秒延时
JNB ACC.1,LP2
RET
EE:MOV R5,#5 ;延时500ms
EE1:MOV R6,#200
EE2:MOV R7,#250
EE3:DJNZ R7,EE3
DJNZ R6,EE2
DJNZ R5,EE1
RET
AA0:MOV R4,#3 ;延时一分钟
AA:MOV R5,#200
AA1:MOV R6,#200
AA2:MOV R7,#250
AA3:DJNZ R7,AA3
DJNZ R6,AA2
DJNZ R5,AA1
DJNZ R4,AA0
RET
D03S:MOV R7,#25
D03S2:MOV R6,#200
D03S1:MOV R5,#200 ;3秒延时
D03S0:NOP
DJNZ R5,D03S0
DJNZ R6,D03S1
DJNZ R7,D03S2
RET
LNP1:MOV A,43H
CJNE A,#2,LNP2
CLR P1.3
LNP2:CJNE A,#1,LNP3
CLR P1.2
LNP3: RET
TPB:JNB 2FH.5,TPB ;(启动/取消)判PB5下降沿
JB 2EH.5,TPB
TPB1:JNB 2FH.6,TPB1 ;(豆浆/果汁)判PB6下降沿
JB 2EH.6,TPB1
MOV 43H,#01H ;判断当前功能选择状态(豆浆/果汁)
JNB 2FH.6,TPB2 ;(豆浆/果汁)判PB6下降沿
JNB 2EH.6,TPB2
MOV 43H,#02H ;判断当前功能选择状态(豆浆/果汁)
SJMP TPB1
TPB2:MOV R1,#120
JNB 2FH.6,TPB1 ;(豆浆/果汁)判PB6下降沿
JB 2EH.6,TPB1
JNB 2FH.5,TPB ;(启动/取消)判PB5下降沿
JB 2EH.5,TPB
ACALL EE
DJNZ R1,TPB2
MOV 42H,#01H ;启动
GN:MOV A,43H ;判断当前功能选择状态(豆浆/果汁)
CJNE A,#00H,GK
ACALL GN0
CJNE A,#01H,GK
ACALL GN15
GK:RET
GN0:INC 51H
GN2:MOV A,52H
MOV R0,53H ;加热至35度
CLR P1.0
SUBB A,@R0
JC GN3
SJMP GN2
GN3:INC 51H
GN4:SETB P1.0
CLR P1.1 ;打浆25秒
ACALL D15S
SETB P1.1
ACALL D25S
GN5:INC 51H
GN6:MOV A,52H
MOV R1,54H ;加热至50度
CLR P1.0
SUBB A,@R1
JC GN7
SJMP GN6
GN7:INC 51H
GN8:SETB P1.0 ;打浆25秒
CLR P1.1
ACALL D25S
SETB P1.1
ACALL D25S
GN9:INC 51H
GN10:MOV A,53H ;加热至50度
MOV R0,54H
CLR P1.0
SUBB A,@R0
JC GN11
SJMP GN10
GN11:INC 51H
GN12:MOV R1,#4
JNB ACC.3,GN13 ;煮浆4分钟
DJNZ R1,GN12
GN13:MOV R0,#10
ACALL EE ;调用5秒延时
JNB ACC.3,GN12
SJMP GN14
GN14:SETB P1.0
CLR P1.4
CLR P3.2
ACALL AA0 ;一分钟后进入保温
RET
GN15:INC 51H
GN16:MOV R3,#4
CLR P1.3 ;启动预打浆
ACALL D25S ;调用25秒延时
SETB P1.3
ACALL D15S ;调用15秒延时
DJNZ R3,GN15
RET
D15S:MOV R7,#125
D15S2:MOV R6,#200
D15S1:MOV R5,#200
D15S0:NOP ;15秒延时
DJNZ R5,D15S0
DJNZ R6,D15S1
DJNZ R7,D15S2
RET
D25S:MOV R7,#210
D25S2:MOV R6,#200
D25S1:MOV R5,#200 ;25秒延时
D25S0:NOP
DJNZ R5,D25S0
DJNZ R6,D25S1
DJNZ R7,D25S2
RET
;CZ: ;MOV A,4OH
;CJNE A,#OOH,CZ1 ;当前未无警告状态
;MOV A,41H
;CJNE A,#OOH,CZ4 ;判断当前警告模式
;CZ: MOV A,51H ;取当前数据单元BCD码
;ANL A,#0FH ;保留低4位(个位)
;MOV 36H,A ;送显缓当前个位单元
;ANL A,#0F0H ;保留高4位(十位)
;SWAP A ;交换到低4位
;MOV 37H,A ;送显缓当前十位单元
;MOV A,48H ;取当前数据单元BCD码
;ANL A,#0FH ;保留低4位(个位)
;MOV 32H,A ;送显缓当前个位单元
;ANL A,#0F0H ;保留高4位(十位)
;SWAP A ;交换到低4位
;MOV 33H,A ;送显缓当前十位单元
;MOV A,50H ;取当前数据单元BCD码
;ANL A,#0FH ;保留低4位(个位)
;MOV 34H,A ;送显缓当前个位单元
;ANL A,#0F0H ;保留高4位(十位)
;SWAP A ;交换到低4位
;MOV 35H,A ;送显缓当前十位单元
;MOV A,52H ;取当前数据单元BCD码
;ANL A,#0FH ;保留低4位(个位)
;MOV 30H,A ;送显缓当前个位单元
;ANL A,#0F0H ;保留高4位(十位)
;SWAP A ;交换到低4位
;MOV 31H,A ;送显缓当前十位单元
;RET ;子程序返回
CZ: ;MOV A,46H
;CJNE A,#01H,CZ3 ;当前为时钟编辑状态
MOV A,3AH ;取当前数据单元BCD码
ANL A,#0FH ;保留低4位(个位)
MOV 30H,A ;送显缓当前个位单元
ANL A,#0F0H ;保留高4位(十位)
SWAP A ;交换到低4位
MOV 31H,A ;送显缓当前十位单元
MOV A,3BH ;取当前数据单元BCD码
ANL A,#0FH ;保留低4位(个位)
MOV 33H,A ;送显缓当前个位单元
ANL A,#0F0H ;保留高4位(十位)
SWAP A ;交换到低4位
MOV 34H,A ;送显缓当前十位单元
MOV A,3CH ;取当前数据单元BCD码
ANL A,#0FH ;保留低4位(个位)
MOV 36H,A ;送显缓当前个位单元
ANL A,#0F0H ;保留高4位(十位)
SWAP A ;交换到低4位
MOV 37H,A ;送显缓当前十位单元
MOV 32H,#16H
MOV 33H,#16H
RET ;子程序返回
;CZ3:MOV A,3BH ;取当前数据单元BCD码
;ANL A,#0FH ;保留低4位(个位)
;MOV 32H,A ;送显缓当前个位单元
;ANL A,#0F0H ;保留高4位(十位)
;SWAP A ;交换到低4位
;MOV 33H,A ;送显缓当前十位单元
;MOV A,3CH ;取当前数据单元BCD码
;ANL A,#0FH ;保留低4位(个位)
;MOV 36H,A ;送显缓当前个位单元
; ANL A,#0F0H ;保留高4位(十位)
;SWAP A ;交换到低4位
;MOV 37H,A ;送显缓当前十位单元
;RET
KEY:MOV 65H,64H ;将上次扫描键号存为前键号
MOV DPTR,#0FEFFH ;键盘扫描子程序(反转法)。
MOV A,#81H
MOVX @DPTR,A ;C口先初始化为高4位输出方式驱键行线、低4位输入方式键列线
MOV A,#0FFH ;消除窜显
MOV DPTR,#0FEFCH
MOVX @DPTR,A
MOV DPTR,#0FEFEH ;DPTR指向C口
MOV A,#00H
MOVX @DPTR,A ;键盘行线(高4位)输出驱动全'0'
MOVX A,@DPTR ;输入键盘列线电平(低4位)存60H单元
MOV 60H,A
MOV DPTR,#0FEFFH
MOV A,#88H
MOVX @DPTR,A ;C口改初始化为高4位输入驱键行线、低4位输出驱键列线
MOV A,#0FFH ;消除窜显
MOV DPTR,#0FEFCH
MOVX @DPTR,A
MOV DPTR,#0FEFEH ;DPTR指向C口
MOV A,#00H
MOVX @DPTR,A ;键盘列线(低4位)输出驱动全'0'
MOVX A,@DPTR ;输入键盘行线电平(高4位)在A中
ANL 60H,#0FH ;保留列线电平值所在的低4位
ANL A,#0F0H ;保留行线电平值所在的高4位
ORL 60H,A ;将列线电平值、行线电平值组合成8位行列码于60H单元中
MOV 61H,#00H ;键号值从00H开始
MOV R5,#10H ;设定最多进行16次的键码查表
MOV DPTR,#KEY_N ;DPTR指向键码表首地址
KY:MOV A,61H ;置当前键号于A中
MOVC A,@A+DPTR ;查表读取键码表中当前键号对应位置的键码
CJNE A,60H,NK ;与8位行列码比较,不同则转NK查下一个
SJMP KN ;相同,表明查到了当前按下的键号,转KN进行键功能处理
KEY_N:DB 0EEH,0EDH,0EBH,0E7H ;键码表。K0,K1,K2,K3键码
DB 0DEH,0DDH,0DBH,0D7H ;K4,K5,K6,K7键码
DB 0BEH,0BDH,0BBH,0B7H ;K8,K9,K10,K11键码
DB 7EH,7DH,7BH,77H ;K12,K13,K14,K15键码
NK:INC 61H ;键号值加1
DJNZ R5,KY ;未查完键值表则继续
;查完,说明无按键或出现异常行列码,结束并返回
KN:MOV 64H,61H
RET
KT:MOV A,65H ;K0进入时钟编辑模式
CJNE A,#10H,LKD ;前面无按键,则跳转LK1
MOV A,64H
CJNE A,#00H,LKD ;检测键0是否有按下
MOV 46H,#01H
LK0:MOV A,46H
JZ LKD
MOV A,65H ;K1,K2时分调校子模块
CJNE A,#10H,LK1 ;前面无按键,则跳转LK1
MOV A,64H
CJNE A,#01H,LK1 ;检测键1是否有按下
MOV 3AH,#00H ;清零秒单位及其前一级计数单位
MOV 39H,#00H
MOV A,3CH ;键1按下,则小时单元加1
ADD A,#01H
DA A
MOV 3CH,A
CJNE A,#24H,LK1
MOV 3CH,#00H
RET
LK1:MOV A,46H
JZ LKD
MOV A,65H
CJNE A,#10H,LK2 ;前面无按键则跳转到LK2
MOV A,64H
CJNE A,#02H,LK2 ;检测键2是否有按下
MOV 3AH,#00H ;清零秒单位及其前一级计数单位
MOV 39H,#00H
MOV A,3BH ;分钟单位按百分之一秒BCD加1
ADD A,#01H
DA A
MOV 3BH,A
CJNE A,#60H,LK2
MOV 3BH,#00H
RET
LK2:MOV A,65H
CJNE A,#10H,LKD ;前面无按键则跳转到LKD
MOV A,64H
CJNE A,#03H,LKD ;检测键3是否有按下
MOV 46H,#00H
LKD:RET
;ADSUB:MOV DPTR,#0FBF8H ;A/D子程序。
;MOVX @DPTR,A ;启动对IN0输入模拟电压信号的A/D转换
;LCALL D1MS ;延时等待A/D转换结束
;MOVX A,@DPTR ;读取A/D转换结果的8位二进制数字值
;MOV 52H,A
;MOV B,A ;A/D转换结果拆送最左两位显示缓冲单元
;ANL A,#0FH
;MOV 30H,A
;MOV A,B
;ANL A,#0F0H
;SWAP A
;MOV 31H,A
;RET
DISP:MOV R0,#30H ;显示缓冲单元首地址
MOV R3,#01H ;字位码初值(从最右位起)
PDNZ:MOV A,46H
CJNE A,#01H,DISP1_1_C ;判断是否进入编辑模式
NZ:MOV A,44H ;判断闪烁状态
CJNE A,#00H,ZT ;亮
MOV A,R3
LJMP DISP1_1
ZT:MOV A,R3 ;暗
ANL A,47H
LJMP DISP1_1
DISP1_1_C:MOV A,R3
DISP1_1:MOV DPTR,#0FEFDH ; 8255B口(字位码输出口)
MOVX @DPTR,A ; 输出字位码
MOV A,@R0 ; 取显示数据码
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV DPTR,#0FEFCH
MOVX @DPTR,A ; 输出字段码
LCALL D1MS ; 保持显示1毫秒
MOV A,#0FFH
MOVX @DPTR,A
INC R0 ; 指向下一显示缓冲单元
MOV A,R3 ; 取出字位码
JB ACC.7,DISP2 ; 判已显示到最左位否
RL A ; 未完,字位码左移1位
MOV R3,A
AJMP PDNZ
DISP2:RET ; 转下一位显示
TAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H ;"0"~"9" 显示字段码表
DB 88H,83H,0C6H,0A1H,86H,8EH,0BFH,0C8H ;"A"-"F","-","N",
DB 40H,79H,24H,30H,19H,12H,02H,78H,00H,10H,01H ;"0."~"9." 显示字段码表
D1MS:MOV R7,#250 ;延时1毫秒子程序
D1MS1:NOP
NOP
NOP
NOP
DJNZ R7,D1MS1
RET
XDPB:MOV 2FH,2EH ;原新态存为前态,滚动滤波法消除按键抖动
MOV 2DH,2CH ;前4次输入的电平值推至2AH~2DH单元
MOV 2CH,2BH
MOV 2BH,2AH
MOV 2AH,29H
MOV DPTR,#0FDFDH ;输入pb0~7新电平值,存29H单元
MOVX A,@DPTR
MOV 29H,A
MOV A,2DH ;比较近5次输入的电平值不一致则新态照旧
CJNE A,2CH,XDR
CJNE A,2BH,XDR
CJNE A,2AH,XDR
CJNE A,29H,XDR
MOV 2EH,A ;近5次输入的电平值一致则存为新态
XDR:RET
;IX0P:PUSH ACC ;外部中断0服务子程序。保护现场
;PUSH PSW
;MOV A,3CH ;小时单元(按BCD码)加1
;ADD A,#1
;DA A
;MOV 3CH,A
;CJNE A,#24H,X0R ;满24小时?
MOV 3CH,#0 ;满:将小时单元清零
; X0R:POP PSW ;恢复现场
;POP ACC
;RETI ;中断返回
;IT0P:PUSH ACC ;外部中断0服务子程序。保护现场
;PUSH PSW
;MOV A,3BH ;分钟单元(按BCD码)加1
;;ADD A,#1
;DA A
;MOV 3BH,A
;CJNE A,#60H,T0R ;满60分钟?
;MOV 3BH,#0 ;满:将分钟单元清零
;T0R:POP PSW ;恢复现场
;POP ACC
;RETI ;中断返回
IT1P:PUSH ACC ;定时器1服务子程序。保护现场
PUSH PSW
INC 38H ;每200uS加1
MOV A,38H
CJNE A,#36,DONE ;满10mS?
MOV 38H,#0 ;200uS计数单元清0
MOV A,39H ;BCD表示百分之一秒
ADD A,#01H
DA A
MOV 39H,A
CJNE A,#00H,DONE;满1秒?
MOV 39H,#0 ;10mS计数单元清0
MOV A,3AH ;秒单元(按BCD码)加1
ADD A,#1
DA A
MOV 3AH,A
CJNE A,#60H,DONE;满1分钟?
MOV 3AH,#0 ;秒单元清零
MOV A,3BH ;分钟单元(按BCD码)加1
ADD A,#1
DA A
MOV 3BH,A
CJNE A,#60H,DONE;满1小时?
MOV 3BH,#0 ;分钟单元清零
MOV A,3CH ;小时单元(按BCD码)加1
ADD A,#1
DA A
MOV 3CH,A
CJNE A,#24H,DONE;满24小时?
MOV 3CH,#0 ;小时单元清零
DONE:POP PSW ;恢复现场
POP ACC
RETI ;中断返回
D40MS:MOV R6,#61 ;软件延时约40mS子程序
D30MS1:MOV R5,#200 ;[1+(1+3*200+2)*61+4]*12/11059.2KHz=39.9mS
D30MS0:NOP
DJNZ R5,D30MS0
DJNZ R6,D30MS1
RET
END