📄 1.asm
字号:
;这个原程序不一定有用,但有注解
ORG 0000H
JMP Q0030
ORG 001BH
JMP Q0246
ORG 0030H
;***************************************
Q0030: MOV SP,#2FH ;设堆栈
CALL Q0215 ;(08H~2FH),(40H~7FH)内存清0
CALL Q0233 ;单片机初始化
Q0037: CALL Q00FF ;74LS165的键扫描
CALL Q011B ;P3口的键扫描
CALL Q017C ;P3口键处理
CALL Q01E8 ;蜂鸣器
CALL Q0046 ;电机运行情况
JMP Q0037
;***************************************
Q0045: RET
Q0046: JB 20H.5,Q0045 ;有LOCK键按下不处理别的按键
MOV C,24H.2 ;A-UP键按下
MOV ACC.0,C
MOV C,24H.7 ;A-DOWN键按下
MOV ACC.1,C
MOV C,24H.0 ;B-UP键按下
MOV ACC.2,C
MOV C,24H.1 ;B-DOWN键按下
MOV ACC.3,C
ANL A,#0FH
MOV 29H,A ;通过74LS165扫描的键值存入29H的低半字节
;---------------------------------------
;29H.0 = 1 A-UP键按下
;29H.1 = 1 A-DOWN键按下
;29H.2 = 1 B-UP键按下
;29H.3 = 1 B-DOWN键按下
ORL A,2AH ;与P3口扫描的键值或
ANL A,#0FH
MOV B,A ;74LS165和P3口扫描的键值送入B
;---------------------------------------
MOV A,28H
CPL A
ANL A,B
JZ Q006D
MOV 0BH,#0AH ;鸣叫时间0AH*10MS=100MS
Q006D: MOV 28H,B
MOV A,28H
JZ Q009B ;再次核对一下键值
;---------------------------------------
CPL A
MOV C,ACC.0
MOV P1.3,C ;A电机UP
JNB 24H.5,Q0081 ;A-K键按下
SETB P1.2 ;A电机DOWN
JMP Q0085
;=======================================
Q0081: MOV C,ACC.1
MOV P1.2,C ;A电机DOWN
Q0085: JNB 24H.4,Q008D ;B-K键按下
SETB P1.5 ;B电机UP
JMP Q0091
;=======================================
Q008D: MOV C,ACC.2
MOV P1.5,C ;B电机UP
Q0091: MOV C,ACC.3
MOV P1.4,C ;B电机DOWN
CLR 21H.1
CLR 21H.4
RET
;=======================================
Q009B: JNB 21H.1,Q00CB
CLR 21H.4
JNB 24H.5,Q00A5 ;A-K键按下
CLR 21H.2
Q00A5: JNB 24H.4,Q00AA ;B-K键按下
CLR 21H.3
Q00AA: SETB P1.3 ;A电机
SETB P1.4 ;B电机
MOV C,21H.2
CPL C
MOV P1.2,C ;A电机
MOV A,0FH
JZ Q00BC
SETB P1.5 ;B电机
JMP Q00C1
;=======================================
Q00BC: MOV C,21H.3
CPL C
MOV P1.5,C ;B电机
Q00C1: JB 21H.2,Q00FC
JB 21H.3,Q00FC
CLR 21H.1
RET
Q00CB: JNB 21H.4,Q00F4
SETB P1.2 ;A电机
SETB P1.5 ;B电机
MOV A,0DH
JZ Q00DA
CLR P1.3 ;A电机
JMP Q00DC
Q00DA: SETB P1.3 ;A电机
Q00DC: MOV A,0FH
JNZ Q00E8
MOV A,0EH
JZ Q00E8
CLR P1.4 ;B电机
JMP Q00EA
Q00E8: SETB P1.4 ;B电机
Q00EA: MOV A,0DH
ORL A,0EH
JNZ Q00FC
CLR 21H.4
RET
Q00F4: SETB P1.3 ;A电机
SETB P1.2 ;A电机
SETB P1.5 ;B电机
SETB P1.4 ;B电机
Q00FC: RET
;=======================================
Q00FF: CALL Q0261 ;读键子程序
CPL A
ANL A,#0BFH ;因为165的P6脚没有接线
CJNE A,25H,Q0109
JMP Q010E ;判断是否真的有键按下
Q0109: MOV 25H,A
MOV 09H,#00H
Q010E: MOV A,09H
CJNE A,#04H,Q011A ;去抖动(延时40MS)
MOV 24H,25H
MOV C,24H.3
MOV 20H.5,C ;有LOCK键按下标志
Q011A: RET
;24H.0 = 1 时是B-UP键按下
;24H.1 = 1 时是B-DOWN键按下
;24H.2 = 1 时是A-UP键按下
;24H.3 = 1 时是LOCK键按下
;24H.4 = 1 时是B-K键按下
;24H.5 = 1 时是A-K键按下
;24H.6不读
;24H.7 = 1 时是A-DOWN键按下
;=======================================
Q011B: INC 0CH ;扫描寄存器(00H~03H)
Q011D: MOV A,0CH
CJNE A,#00H,Q0136
MOV A,27H
ANL A,#3FH ;P3.6,P3.7口因为没接按键
MOV C,P3.0
MOV ACC.0,C ;A-DOWN按下
MOV C,P3.1
MOV ACC.1,C ;A-UP按下
CLR P3.3
SETB P3.4
CLR P3.5
JMP Q0169
Q0136: CJNE A,#01H,Q014D
MOV A,27H
ANL A,#3FH
MOV C,P3.0
MOV ACC.2,C ;B-DOWN按下
MOV C,P3.1
MOV ACC.3,C ;B-UP按下
CLR P3.3
CLR P3.4
SETB P3.5
JMP Q0169
Q014D: CJNE A,#02H,Q0164
MOV A,27H
ANL A,#3FH
MOV C,P3.0
MOV ACC.4,C ;RESET按下
MOV C,P3.1
MOV ACC.5,C ;PLC按下
SETB P3.3
CLR P3.4
CLR P3.5
JMP Q0169
Q0164: MOV 0CH,#00H
JMP Q011D
;---------------------------------------
Q0169: CJNE A,27H,Q016E ;判断是否真的有键按下
JMP Q0173
Q016E: MOV 0AH,#00H
MOV 27H,A
Q0173: MOV A,0AH
CJNE A,#04H,Q017B ;去抖动(延时40MS)
MOV 26H,27H ;键值存在26H中
Q017B: RET
;26H.0 = 1 A-DOWN按下
;26H.1 = 1 A-UP按下
;26H.2 = 1 B-DOWN按下
;26H.3 = 1 B-UP按下
;26H.4 = 1 RESET按下
;26H.5 = 1 PLC按下
;26H.6 X
;26H.7 X
;=======================================
Q017C: JB 20H.5,Q01E7 ;有LOCK键按下不处理别的按键
MOV 2AH,#00H
MOV A,26H
JNZ Q018A
CLR 21H.0
RET
Q018A: JB 21H.0,Q01E7
;----------PLC键按下--------------------
CJNE A,#20H,Q01A2
SETB 21H.0 ;P3口有键按下标志
MOV 0BH,#0AH ;鸣叫时间0AH*10MS=100MS
MOV 0FH,#32H
CPL 21H.1
CLR 21H.4
SETB 21H.2
SETB 21H.3
RET
;----------RESET键按下------------------
Q01A2: CJNE A,#10H,Q01C5
SETB 21H.0 ;P3口有键按下标志
MOV 0BH,#0AH ;鸣叫时间0AH*10MS=100MS
MOV 0DH,#10H
MOV 0EH,#20H
MOV 0FH,#32H
CPL 21H.4
CLR 21H.1
JB 24H.5,Q01BD ;A-K键按下
MOV 0DH,#00H
Q01BD: JB 24H.4,Q01C3 ;B-K键按下
MOV 0EH,#00H
Q01C3: RET
;---------A-UP按下----------------------
Q01C5: CJNE A,#02H,Q01CD
MOV 2AH,#01H ;2AH中存入P3口扫描的键值
RET
;---------A-DOWN按下--------------------
Q01CD: CJNE A,#01H,Q01D5
MOV 2AH,#02H
RET
;---------B-UP按下----------------------
Q01D5: CJNE A,#08H,Q01DD
MOV 2AH,#04H
RET
;---------B-DOWN按下--------------------
Q01DD: CJNE A,#04H,Q01E5
MOV 2AH,#08H
RET
Q01E5: SETB 21H.0 ;P3口有键按下标志
Q01E7: RET
;2AH.0 = 1 A-UP按下
;2AH.1 = 1 A-DOWN按下
;2AH.2 = 1 B-UP按下
;2AH.3 = 1 B-DOWN按下
;=======================================
Q01E8: JNB 20H.0,Q0214 ;没有10MS标志返回
CLR 20H.0 ;清10MS标志
INC 09H
INC 0AH
MOV A,0BH ;鸣叫时间存在0BH中
JNZ Q01F9 ;鸣叫时间到停止
SETB P1.6 ;蜂鸣器停止
JMP Q01FD
Q01F9: DEC 0BH ;鸣叫时间减去10MS
CLR P1.6 ;鸣叫时间没到继续鸣叫
;---------------------------------------
Q01FD: MOV A,0FH ;以下程序可能是电机运行时间
JZ Q0203
DEC 0FH
Q0203: JNB 20H.2,Q0214 ;500MS定时标志
CLR 20H.2
MOV A,0DH
JZ Q020E
DEC 0DH
Q020E: MOV A,0EH
JZ Q0214
DEC 0EH
Q0214: RET
;=========内存清0=======================
Q0215: CLR RS0 ;(08H~2FH),(40H~7FH)内存清0
CLR RS1
CLR A
MOV R0,#08H
MOV R1,#28H
Q021E: MOV @R0,A
INC 00H
DJNZ R1,Q021E
MOV R0,#7FH
MOV R1,#40H
Q0227: MOV @R0,A
DEC 00H
DJNZ R1,Q0227
MOV 08H,#32H
MOV 0BH,#1EH ;鸣叫时间1EH*10=300MS
RET
;==========单片机初始化=================
Q0233: MOV P1,#0FFH
MOV P3,#0FFH
MOV TMOD,#11H ;设T1为定时方式1
MOV IE,#00H
SETB ET1
SETB TR1 ;打开定时
SETB EA ;打开中断
RET
;=========定时子程序====================
Q0246: MOV TL1,#00H
MOV TH1,#0ECH ;10MS定时
SETB 20H.0 ;10MS定时标志
DJNZ 08H,Q025E
MOV 08H,#32H
SETB 20H.2 ;500MS定时标志
Q025E: RETI
;=======读165键子程序===================
;出口: 键值存在A中
Q0261: PUSH B
CLR P1.0
SETB P1.1
CLR P1.1
SETB P1.1
MOV B,#08H
Q0270: MOV C,P3.7
RLC A
CLR P1.0
SETB P1.0
DJNZ B,Q0270
POP B
RET ;键值存入A中
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -