⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 1.asm

📁 按键可以动的小玩具,初学者可以试试,是反汇编的
💻 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 + -