📄 xyiji kongzi.asm
字号:
ORG 0000H
JMP MAIN
ORG 0003H
JMP INTPT_0
ORG 0013H
JMP INTPT_1
W_C_ADD EQU 2070H ;写命令子地址
W_D_ADD EQU 2071H ;写数据地址
R_S_ADD EQU 2072H ;读状态字地址
R_D_ADD EQU 2073H ;读数据地址
TIM0 EQU 30H ;延迟时间副变量
V_TIM EQU 31H ;延迟时间主变量
HORIZEN EQU 32H ;水位判断值
HOR_JUDGE EQU 33H ;设定的水位值
ALARM EQU 34H ;水位警报所用衡量
NUMBER1 EQU 35H ;各种计数
WORK_STY EQU 36H ;设定浸泡、洗涤、漂洗、甩干
WORK_STY1 EQU 37H ;洗衣机工作方式选定1
WORK_STY2 EQU 38H ;洗衣机工作方式选定2
DATA1 EQU 39H ;存放待显示字符的ASCII码
WORK_STY3 EQU 3AH ;高中低洗涤控制
WORK_STY1_1 EQU 3BH ;设定浸泡和洗涤
WORK_STY2_2 EQU 3CH ;设定漂洗和甩干
BLEACH_NUM EQU 3DH;漂洗次数
WAT_HOR_NUM EQU 3EH ;水位高中低的对应数字“0、1、2”
BLE_NUM EQU 3FH
ORG 0100H
MAIN: MOV SP,#60H ;栈指针初始化
MOV IE,#85H ;定义中断
MOV IP,#04H ;定义中断优先级
MOV TCON,#01H ;定义中断方式
MOV DPTR,#2003H ;定义8255命令口
MOV A,#8AH ;8255 A口输出、B口输入、C口高4位输入、低4位输出
MOVX @DPTR,A
MOV R0,#04H ;60次计数
MOV R6,#78H ;顺逆旋转的针摆动次数
LCALL INI ;LED初始化
CLR IT0
CLR IT1
;-------------水位设定-------------
WAT_HOR:MOV DPTR,#2001H ;通过8255的B口PB.5和PB.4确定上水水位
MOVX A,@DPTR
ANL A,#30H
SWAP A
CJNE A,#00H,WAT_HOR1
MOV A,#25H
JMP WAT_HOR3
WAT_HOR1:CJNE A,#01H,WAT_HOR2
MOV A,#50H
JMP WAT_HOR3
WAT_HOR2:CJNE A,#02H,WAT_HOR
MOV A,#0A0H
WAT_HOR3:MOV HOR_JUDGE,A ;将水位设定值传送给固定存储单元
LCALL DCHAR1 ;调用第一行汉字“欢迎使用全自动洗衣机”显示
LCALL WATER_HOR_LCD ;调用“水位设定为:”显示子程序
MOV DPTR,#2001H
MOVX A,@DPTR
MOV A,#1H
JB ACC.0,WOR_STY
JMP WAT_HOR
;------------工作状态选定-----------------
WOR_STY:MOV DPTR,#2002H ;通过8255的c口PC.5和PC.4确定漂洗次数
MOVX A,@DPTR
ANL A,#0F0H
SWAP A
CJNE A,#00H,WOR_STY1
MOV A,#03H
JMP WOR_STY3
WOR_STY1:CJNE A,#01H,WOR_STY2
MOV A,#04H
JMP WOR_STY3
WOR_STY2:CJNE A,#02H,WOR_STY
MOV A,#05H
WOR_STY3:MOV BLEACH_NUM,A ;将漂洗次数传送给固定存储单元
MOV DPTR,#2001H ;工作状态选定
MOVX A,@DPTR
MOV WORK_STY,A
LCALL INI ;调用初始化子程序
LCALL BLEACH_NUM_LCD ;调用漂洗次数字符显示子程序
LCALL DCHAR2 ;调用浸泡、洗涤字符显示子程序
LCALL DCHAR3 ;调用漂洗、甩干字符显示子程序
LCALL TURN_STY ;读取洗涤状态 高 中 低
LCALL WASH_END_LCD ;结束
JMP WOR_STY
INTPT_0:MOV A,#00H ;中断0,即洗衣机工作开关
LCALL CONVER ;读取上水、判断水位子程序
;-------------浸泡------------------
SOAK: MOV A,WORK_STY1 ;判断是否进行浸泡
JB ACC.1,TRUN_S1
LCALL SOAK_LCD ;调用浸泡字符显示子程
MOV V_TIM,#10 ;DELAYMS中用到的延时变量
MOV NUMBER1,#120 ;运行延时的次数
SOAK1: DJNZ NUMBER1,SOAK2
JMP TRUN_S1
SOAK2: LCALL DELAYMS
JMP SOAK1
;-------------强洗------------------
TRUN_S1: MOV A,WORK_STY1 ;判断是否进行洗涤
JB ACC.0,BLEACH1
MOV R2,WORK_STY3 ;判断是否进行强洗
CJNE R2,#03H,TRUN_M1
MOV DPTR,#DB_S1 ;调用强洗字符显示子程
LCALL TURN_LCD
MOV V_TIM,#10 ;控制延时程序即控制转速
MOV NUMBER1,#2
TRUN_S2: DJNZ NUMBER1,TRUN_S3
MOV WORK_STY3,#00H ;调整洗涤方式选择
JMP TRUN_M1
TRUN_S3: MOV A,#01H
LCALL CIRCLE1
JMP TRUN_S2
;-------------中洗------------------
TRUN_M1: MOV R2,WORK_STY3 ;判断是否进行中洗
CJNE R2,#00H,TRUN_L1
MOV DPTR,#DB_M1 ;调用中洗字符显示子程
LCALL TURN_LCD
MOV V_TIM,#30
MOV NUMBER1,#2
TRUN_M2: DJNZ NUMBER1,TRUN_M3
JMP TRUN_L1
TRUN_M3: MOV A,#01H
LCALL CIRCLE1
JMP TRUN_M2
;-------------弱洗------------------
TRUN_L1: MOV DPTR,#DB_L1 ;调用弱洗字符显示子程
LCALL TURN_LCD
MOV V_TIM,#50
MOV NUMBER1,#2
TRUN_L2: DJNZ NUMBER1,TRUN_L3
JMP BLEACH1
TRUN_L3: MOV A,#01H
LCALL CIRCLE1
JMP TRUN_L2
;-------------漂洗------------------
BLEACH1: MOV A,WORK_STY2 ;判断是否进行漂洗
JB ACC.1,SWING1
MOV NUMBER1,#2
BLEACH4: LCALL WAT_OUT1
LCALL CONVER ;上水
LCALL BLEACH_LCD ;调用漂洗字符显示子程
MOV V_TIM,#60
BLEACH2: DJNZ NUMBER1,BLEACH3
MOV NUMBER1,#2
DJNZ BLEACH_NUM,BLEACH4
JMP SWING1
BLEACH3: MOV A,#01H
LCALL CIRCLE1
JMP BLEACH2
;-------------甩干------------------
SWING1: MOV A,WORK_STY2 ;判断是否进行甩干
JB ACC.0,WASH_END
LCALL SWING_LCD ;调用甩干字符显示子程
MOV V_TIM,#10
MOV NUMBER1,#2
MOV A,#01H
SWING2: DJNZ NUMBER1,SWING3
JMP WASH_END
SWING3: RL A ;创建甩干单独顺转程序
LCALL DELAYMS
MOV P1,A
DJNZ R6,SWING4
MOV R6,#78H
JMP SWING2
SWING4: CJNE A,#10H,SWING5
MOV A,#01H
MOV P1,A
SWING5: JMP SWING3
WASH_END:RETI
;-------------中断1结束--------------
INTPT_1:PUSH ACC
PUSH DPH
PUSH DPL
PUSH B
STOP: JMP $ ;洗衣机工作时强行中断按钮
POP B
POP DPL
POP DPH
POP ACC
RETI
;------------顺转----------------
CIRCLE1:RL A ;顺转移位
LCALL DELAYMS ;转动速度控制子程序
MOV P1,A
DJNZ R6,GOON1
MOV R6,#78H
JMP CIRCLE2
GOON1: CJNE A,#10H,CIR_AGAIN1 ;转动一次调整回初值
MOV A,#01H
MOV P1,A
CIR_AGAIN1:JMP CIRCLE1
;---------逆转-----------------
CIRCLE2:RR A ;逆转移位
LCALL DELAYMS ;转动速度控制子程序
MOV P1,A
DJNZ R6,GOON2
MOV R6,#78H
RET ;结束旋转
GOON2: CJNE A,#80H,CIR_AGAIN2 ;转动一次调整回初值
MOV A,#08H
MOV P1,A
CIR_AGAIN2:JMP CIRCLE2
;----------蜂鸣水位报警-----------
HOR_ALARM:CLR C
MOV A,HORIZEN
CJNE A,HOR_JUDGE,ALARM1 ;转换至与设定值之间判断并存入c
ALARM1: RET
;-----------脱水------------------
WAT_OUT1: LCALL WAT_OUT_LCD ;调用脱水字符显示子程
CLR C
MOV A,HORIZEN
CJNE A,#05H,WAT_OUT2
WAT_OUT2: JC WAT_OUT_END
MOV DPTR,#2002H
MOV A,#00H
MOVX @DPTR,A
JMP WAT_OUT1
WAT_OUT_END: RET
;-------------上水-----------------
CONVER:
LCALL WAT_IN_LCD ;调用上水字符显示子程序
LCALL HOR_ALARM ;水位报警
JC START
MOV DPTR,#2002H
MOV A,#00H
MOVX @DPTR,A
JMP CONVER
START: MOV DPTR,#2002H
MOV A,#01H
MOVX @DPTR,A
MOV P1,A
RET
;----------洗衣机转速控制---------
DELAYMS: PUSH V_TIM
PUSH TIM0
MOV V_TIM,#01H ;减速程序
DELAY1: MOV TIM0,#100
DELAY2: NOP
NOP
DJNZ TIM0,DELAY2
DJNZ V_TIM,DELAY1
POP TIM0
POP V_TIM
RET
;----------洗涤状态 高 中 低------------
TURN_STY: PUSH DPH
PUSH DPL
PUSH ACC
PUSH WORK_STY
MOV A,WORK_STY
ANL A,#0CH
RR A
RR A
MOV WORK_STY3,A ;形成洗涤状态
POP WORK_STY
POP ACC
POP DPL
POP DPH
RET
;---------LCD字符显示第1行--------------
DCHAR1: PUSH DPH
PUSH DPL
PUSH ACC
MOV DPTR,#DB_LCD ;第一行"全自动洗衣机"
MOV B,#12 ;所显汉字字数*2
MOV A,#80H
LCALL CMD_LCD ;写行命令
DCH0: MOV A,#00H
MOVC A,@A+DPTR ;调用程序空间表中数据,并传递给A
MOV DATA1,A
MOV A,DATA1
LCALL W_LCD ;写数据命令
INC DPTR
DJNZ B,DCH0 ;提取次数
POP ACC
POP DPL
POP DPH
RET
;---------LCD字符显示第2行--------------
DCHAR2: PUSH DPH
PUSH DPL
PUSH ACC
PUSH WORK_STY
MOV DPTR,#DB_LCD1 ;第二行"浸泡 洗涤"
MOV A,#90H ;写行首地址
LCALL CMD_LCD
MOV A,WORK_STY
ANL A,#03H
MOV WORK_STY1,A
MOV B,#0CH
MUL AB
MOV WORK_STY1_1,A ;得到所需显示的行首偏移地址
MOV B,#12
DCH1: MOV A,WORK_STY1_1
MOVC A,@A+DPTR
MOV DATA1,A
MOV A,DATA1
LCALL W_LCD
INC DPTR
DJNZ B,DCH1
POP WORK_STY
POP ACC
POP DPL
POP DPH
RET
;---------LCD字符显示第3行--------------
DCHAR3: PUSH DPH
PUSH DPL
PUSH ACC
PUSH WORK_STY
MOV DPTR,#DB_LCD2 ;第三行"漂洗 甩干"
MOV A,#88H
LCALL CMD_LCD
MOV A,WORK_STY
ANL A,#30H
SWAP A
MOV B,#0CH
MOV WORK_STY2,A
MUL AB
MOV WORK_STY2_2,A ;得到所需显示的行首偏移地址
MOV B,#12
DCH2: MOV A,WORK_STY2_2
MOVC A,@A+DPTR
MOV DATA1,A
MOV A,DATA1
LCALL W_LCD
INC DPTR
DJNZ B,DCH2
POP WORK_STY
POP ACC
POP DPL
POP DPH
RET
;-----------上水LCD-------------------------
WAT_IN_LCD:PUSH DPH
PUSH DPL
PUSH ACC
MOV DPTR,#DB_WAT_IN ;"上水"
MOV B,#10
MOV A,#98H ;在第四行写
LCALL CMD_LCD ;写行命令
WAT_IN_LCD0: MOV A,#00H
MOVC A,@A+DPTR
MOV DATA1,A
MOV A,DATA1
LCALL W_LCD ;写数据命令
INC DPTR
DJNZ B,WAT_IN_LCD0
POP ACC
POP DPL
POP DPH
RET
;-----------浸泡LCD------------------------
SOAK_LCD:PUSH DPH
PUSH DPL
PUSH ACC
MOV DPTR,#DB_SOAK ;"浸泡"
MOV B,#10
MOV A,#98H
LCALL CMD_LCD ;写行命令
SOAK_LCD0: MOV A,#00H
MOVC A,@A+DPTR
MOV DATA1,A
MOV A,DATA1
LCALL W_LCD ;写数据命令
INC DPTR
DJNZ B,SOAK_LCD0
POP ACC
POP DPL
POP DPH
RET
;-----------高中低洗涤LCD------------------------------
TURN_LCD:PUSH DPH
PUSH DPL
PUSH ACC
MOV B,#10
MOV A,#98H
LCALL CMD_LCD ;写行命令
TURN_LCD0: MOV A,#00H
MOVC A,@A+DPTR
MOV DATA1,A
MOV A,DATA1
LCALL W_LCD ;写数据命令
INC DPTR
DJNZ B,TURN_LCD0
POP ACC
POP DPL
POP DPH
RET
;-----------漂洗LCD-----------------------
BLEACH_LCD:PUSH DPH
PUSH DPL
PUSH ACC
MOV DPTR,#DB_BLEACH ;"漂洗"
MOV B,#10
MOV A,#98H
LCALL CMD_LCD ;写行命令
BLEACH_LCD0: MOV A,#00H
MOVC A,@A+DPTR
MOV DATA1,A
MOV A,DATA1
LCALL W_LCD ;写数据命令
INC DPTR
DJNZ B,BLEACH_LCD0
POP ACC
POP DPL
POP DPH
RET
;-----------甩干LCD------------------------
SWING_LCD:PUSH DPH
PUSH DPL
PUSH ACC
MOV DPTR,#DB_SWING ;"甩干"
MOV B,#10
MOV A,#98H
LCALL CMD_LCD ;写行命令
SWING_LCD0: MOV A,#00H
MOVC A,@A+DPTR
MOV DATA1,A
MOV A,DATA1
LCALL W_LCD ;写数据命令
INC DPTR
DJNZ B,SWING_LCD0
POP ACC
POP DPL
POP DPH
RET
;-----------脱水LCD-------------------------
WAT_OUT_LCD:PUSH DPH
PUSH DPL
PUSH ACC
MOV DPTR,#DB_WAT_OUT ;"脱水"
MOV B,#10
MOV A,#98H
LCALL CMD_LCD ;写行命令
WAT_OUT_LCD0: MOV A,#00H
MOVC A,@A+DPTR
MOV DATA1,A
MOV A,DATA1
LCALL W_LCD ;写数据命令
INC DPTR
DJNZ B,WAT_OUT_LCD0
POP ACC
POP DPL
POP DPH
RET
;---------结束LCD--------------------
WASH_END_LCD:PUSH DPH
PUSH DPL
PUSH ACC
MOV DPTR,#DB_WASH_END ;"结束"
MOV B,#4
MOV A,#98H
LCALL CMD_LCD ;写行命令
WASH_END_LCD0: MOV A,#00H
MOVC A,@A+DPTR
MOV DATA1,A
MOV A,DATA1
LCALL W_LCD ;写数据命令
INC DPTR
DJNZ B,WASH_END_LCD0
POP ACC
POP DPL
POP DPH
RET
;-------水位设定LCD------------------
WATER_HOR_LCD:PUSH DPH
PUSH DPL
PUSH ACC
MOV A,#90H
LCALL CMD_LCD ;写行命令
MOV DPTR,#2001H
MOVX A,@DPTR
ANL A,#30H
SWAP A
MOV B,#06H
MUL AB
MOV WAT_HOR_NUM,A ;得到所需显示的行首偏移地址
MOV DPTR,#DB_WAT
MOV B,#6
WATER_HOR_LCD0: MOV A,WAT_HOR_NUM
MOVC A,@A+DPTR
LCALL W_LCD ;写数据命令
INC DPTR
DJNZ B,WATER_HOR_LCD0
POP ACC
POP DPL
POP DPH
RET
;-------漂洗次数LCD------------------
BLEACH_NUM_LCD:PUSH DPH
PUSH DPL
PUSH ACC
MOV A,#80H
LCALL CMD_LCD ;写行命令
MOV DPTR,#2002H
MOVX A,@DPTR
ANL A,#0F0H
SWAP A
MOV B,#0CH
MUL AB
MOV BLE_NUM,A ;得到所需显示的行首偏移地址
MOV DPTR,#DB_BLEACH_NUM
MOV B,#12
BLEACH_NUM_LCD0:MOV A,BLE_NUM
MOVC A,@A+DPTR
MOV DATA1,A
MOV A,DATA1
LCALL W_LCD ;写数据命令
INC DPTR
DJNZ B,BLEACH_NUM_LCD0
POP ACC
POP DPL
POP DPH
RET
;-------LCD初始化--------------------
INI: PUSH ACC
MOV A,#38H
LCALL CMD_LCD
LCALL DELAYLC
MOV A,#38H
LCALL CMD_LCD
LCALL DELAYLC
MOV A,#38H
LCALL CMD_LCD
MOV A,#0CH
LCALL CMD_LCD
MOV A,#01H
LCALL CMD_LCD
MOV A,#02H
LCALL CMD_LCD
POP ACC
RET
DELAYLC:MOV R6,#00H ;延时50ms子程序
MOV R7,#00H
DELAYLC1: NOP
DJNZ R7,DELAYLC1
DJNZ R6,DELAYLC1
RET
CHKBUSY:PUSH DPH ;忙状态检测
PUSH DPL
PUSH PSW
PUSH ACC
MOV DPTR,#R_S_ADD
CHK: MOVX A,@DPTR ;从液晶模块读状态
MOV A,0H
JB ACC.7,CHK
POP ACC
POP PSW
POP DPL
POP DPH
RET
;--------LCD写命令-------------------
CMD_LCD:PUSH DPH
PUSH DPL
LCALL CHKBUSY
MOV DPTR,#W_C_ADD
MOVX @DPTR,A
POP DPL
POP DPH
RET
;---------LCD写数据------------------
W_LCD: PUSH DPH
PUSH DPL
LCALL CHKBUSY
MOV DPTR,#W_D_ADD
MOVX @DPTR,A
POP DPL
POP DPH
RET
DB_LCD: DW 0C8ABH,0D7D4H,0B6AFH,0CFB4H,0D2C2H,0BBFAH
DB_LCD1: DW 0A1CCH,0BDFEH,0C5DDH,0A1CCH,0CFB4H,0B5D3H
DW 0A1CCH,0BDFEH,0C5DDH,0A1C1H,0CFB4H,0B5D3H
DW 0A1C1H,0BDFEH,0C5DDH,0A1CCH,0CFB4H,0B5D3H
DW 0A1C1H,0BDFEH,0C5DDH,0A1C1H,0CFB4H,0B5D3H
DB_LCD2: DW 0A1CCH,0C6AFH,0CFB4H,0A1CCH,0CBA6H,0B8C9H
DW 0A1CCH,0C6AFH,0CFB4H,0A1C1H,0CBA6H,0B8C9H
DW 0A1C1H,0C6AFH,0CFB4H,0A1CCH,0CBA6H,0B8C9H
DW 0A1C1H,0C6AFH,0CFB4H,0A1C1H,0CBA6H,0B8C9H
DB_WAT_IN: DW 0C9CFH,0CBAEH,0A1F1H,0A1F1H,0A1F1H
DB_SOAK: DW 0BDFEH,0C5DDH,0A1F1H,0A1F1H,0A1F1H
DB_S1: DW 0C7BFH,0CFB4H,0A1F1H,0A1F1H,0A1F1H
DB_M1: DW 0D6D0H,0CFB4H,0A1F1H,0A1F1H,0A1F1H
DB_L1: DW 0C8F5H,0CFB4H,0A1F1H,0A1F1H,0A1F1H
DB_BLEACH: DW 0C6AFH,0CFB4H,0A1F1H,0A1F1H,0A1F1H
DB_SWING: DW 0CBA6H,0B8C9H,0A1F1H,0A1F1H,0A1F1H
DB_WAT_OUT: DW 0CDD1H,0CBAEH,0A1F1H,0A1F1H,0A1F1H
DB_WASH_END: DW 0CDA3H,0D6B9H
DB_BLEACH_NUM: DW 0C6AFH,0CFB4H,0B4CEH,0CAFDH,0A1C3H,0A3B3H
DW 0C6AFH,0CFB4H,0B4CEH,0CAFDH,0A1C3H,0A3B4H
DW 0C6AFH,0CFB4H,0B4CEH,0CAFDH,0A1C3H,0A3B5H
DB_WAT: DW 0B5CDH,0CBAEH,0CEBBH
DW 0D6D0H,0CBAEH,0CEBBH
DW 0B8DFH,0CBAEH,0CEBBH
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -