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

📄 6t.asm

📁 用单片机做的多路遥控,接收控制板,很好用的.
💻 ASM
字号:
	;*************************************
	;*	(SEND.ASM)	*
	;*	十五路遥控发送控制器	*
	;*	2001.7.18	*
	;*************************************
	;
	;**********************************************************************
	;*	*
	;*	KEYX0	P1.0	1	40	VCC	*
	;*	KEYX1	P1.1	2	39	P0.0	KEYY0	*
	;*	KEYX2	P1.2	3	38	P0.1	KEYY1	*
	;*	KEYX3	P1.3	4	37	P0.2	KEYY2	*
	;*	P1.4	5	36	P0.3	KEYY3	*
	;*	P1.5	6	35	P0.4	KEYY4	*
	;*	P1.6	7	34	P0.5	KEYY5	*
	;*	P1.7	8	33	P0.6	KEYY6	*
	;*	RST	9	32	P0.7	KEYY7	*
	;*	P3.0	10	MCS-51	31	EA	VDD	*
	;*	P3.1	11	30	ALE	*
	;*	P3.2	12	29	PSEN	*
	;*	P3.3	13	28	P2.7	*
	;*	P3.4	14	27	P2.6	*
	;*	REMOTEOUT	T1	P3.5	15	26	P2.5	*
	;*	P3.6	16	25	P2.4	*
	;*	P3.7	17	24	P2.3	*
	;*	XTAL2	18	23	P2.2	*
	;*	XTAL1	19	22	P2.1	*
	;*	VSS	20	21	P2.0	*
	;*	*
	;*	*
	;**********************************************************************
	;
	;
	;
	;伪定义
	KEYX0	EQU	P1.0	;P1.0	--	P1.3位键盘行扫描
	KEYX1	EQU	P1.1	;本系统采用4	*	8	键盘阵列
	KEYX2	EQU	P1.2
	KEYX3	EQU	P1.3
	KEYY	EQU	P0	;P0	口键盘列扫描
	;
	;
	;
	;
	;*************************************
	;*	*
	;*	主程序和中断程序入口	*
	;*	*
	;*************************************
	ORG	0000H	;程序执行开始地址
	AJMP	START	;跳至START执行
	ORG	0003H	;外中断0中断入口地址
	RETI	;中断返回(不开中断)
	ORG	000BH	;定时器T0中断入口地址
	RETI	;中断返回(不开中断)
	ORG	0013H	;外中断1中断入口地址
	RETI	;中断返回(不开中断)
	ORG	001BH	;定时器T1中断入口地址
	LJMP	INTT1	;跳至INTT1中断服务程序
	ORG	0023H	;串行口中断入口地址
	RETI	;中断返回(不开中断)
	ORG	002BH	;定时器T2中断入口地址
	RETI	;中断返回(不开中断)
	;
	;*************************************
	;*	*
	;*	初	始	化	程	序	*
	;*	*
	;*************************************
CLEARMEMIO:	CLR	A	;A清0
	DEC	A	;A为#0FFH
	MOV	P0,A	;P0-P3口置1
	MOV	P1,A	;
	MOV	P2,A	;
	MOV	P3,A	;
	CLR	P3.5	;关遥控输出
CLEARMEM:	MOV	SP,#70H	;设堆栈基址为70H
	MOV	IE,#00H	;关所有中断
	MOV	IP,#01H	;设优先级
	MOV	TMOD,#22H	;8位自动重装初值模式
	MOV	TH1,#0F3H	;定时为13微秒初值
	MOV	TL1,#0F3H	;
	SETB	EA	;开总中断允许
	RET	;返回
	;
	;
	;
	;
	;*************************************
	;*	*
	;*	主	程	序	*
	;*	*
	;*************************************
START:	LCALL	CLEARMEMIO	;调用初始化子程序
	;
MAIN:	LCALL	KEYWORK	;主体程序。调用查键子程序
	LJMP	MAIN	;转MAIN循环
	NOP	;PC值出错处理
	NOP
	NOP
	LJMP	START	;重新初始化
	;
	;*************************************
	;*	*
	;*	T1中断服务程序	*
	;*	*
	;*************************************
INTT1:	CPL	P3.5	;40KHZ红外线遥控信号产生
	RETI	;中断返回
	;
	;
	;*************************************
	;*	*
	;*	键盘工作子程序(4	*	8	阵列)	*
	;*	出口为各键工作程序入口	*
	;*************************************
KEYWORK:	MOV	KEYY,#0FFH	;置列线输入状态
	CLR	KEYX0	;行线(P1口)全置0
	CLR	KEYX1
	CLR	KEYX2
	CLR	KEYX3
	MOV	A,KEYY	;读入P0口值
	MOV	B,A	;KEYY口值暂存B中
	CJNE	A,#0FFH,KEYHIT	;不等于#0FFH,转KEYHIT(有键按下)
KEYOUT:	RET	;没有键按下返回
	;
KEYHIT:	LCALL	DL10MS	;延时去抖动
	MOV	A,KEYY	;再读入P0口值至A
	CJNE	A,B,KEYOUT	;A不等于B(是干扰),子程序返回
	SETB	KEYX1	;有键按下,找键号开始,查0行
	SETB	KEYX2
	SETB	KEYX3
	MOV	A,KEYY	;读入P0口值
	CJNE	A,#0FFH,KEYVAL0	;P0不等于#0FFH,按下键在第0行
	SETB	KEYX0	;不在第0行,开始查1行
	CLR	KEYX1
	MOV	A,KEYY	;读入P0口值
	CJNE	A,#0FFH,KEYVAL1	;P0口不等于#0FFH,按下键在第1行
	SETB	KEYX1	;不在第1行,开始查2行
	CLR	KEYX2
	MOV	A,KEYY	;读入P0口值
	CJNE	A,#0FFH,KEYVAL2	;P0口不等于#0FFH,按下键在第2行
	SETB	KEYX2	;不在第2行,开始查3行
	CLR	KEYX3
	MOV	A,KEYY	;读入P0口值
	CJNE	A,#0FFH,KEYVAL3	;P0口不等于#0FFH,按下键在第3行
	LJMP	KEYOUT	;不在第3行,子程序返回
	;
KEYVAL0:	MOV	R2,#00H	;按下键在第0行,R2赋行号初值0
	LJMP	KEYVAL4	;跳到KEYVAL4
	;
KEYVAL1:	MOV	R2,#08H	;按下键在第1行,R2赋行号初值8
	LJMP	KEYVAL4	;跳到KEYVAL4
	;
KEYVAL2:	MOV	R2,#10H	;按下键在第2行,R2赋行号初值16
	LJMP	KEYVAL4	;跳到KEYVAL4
	;
KEYVAL3:	MOV	R2,#18H	;按下键在第3行,R2赋行号初值24
	LJMP	KEYVAL4	;跳到KEYVAL4
	;
KEYVAL4:	MOV	DPTR,#KEYVALTAB	;键值翻译成连续数字
	MOV	B,A	;P0口值暂存B内
	CLR	A	;清A
	MOV	R0,A	;清R0
KEYVAL5:	MOV	A,R0	;查列号开始,R0数据放入A
	SUBB	A,#08H	;A中数减8
	JNC	KEYOUT	;借位C为0,查表出错,返回
	MOV	A,R0	;查表次数小于8,继续查,
	MOVC	A,@A+DPTR	;查列号表
	INC	R0	;R0加1
	CJNE	A,B,KEYVAL5	;查得值和P0口值不等,转KEYVAL5再查
	DEC	R0	;查得值和P0口值相等,R0减1
	MOV	A,R0	;放入A(R0中数值即为列号值)
	ADD	A,R2	;与行号初值相加成为键号值(0-31)
	MOV	B,A	;键号乘3处理用于JMP散转指令
	RL	A	;键号乘3处理用于JMP散转指令
	ADD	A,B	;键号乘3处理用于JMP散转指令
	MOV	DPTR,#KEYFUNTAB	;取散转功能程序(表)首址
	JMP	@A+DPTR	;散转至对应功能程序标号
KEYFUNTAB:	LJMP	KEYFUN00	;跳到键号0对应功能程序标号
	LJMP	KEYFUN01	;跳到键号1对应功能程序标号
	LJMP	KEYFUN02	;跳到键号2对应功能程序标号
	LJMP	KEYFUN03	;跳到键号3对应功能程序标号
	LJMP	KEYFUN04	;跳到键号4对应功能程序标号
	LJMP	KEYFUN05	;跳到键号5对应功能程序标号
	LJMP	KEYFUN06	;跳到键号6对应功能程序标号
	LJMP	KEYFUN07	;跳到键号7对应功能程序标号
	LJMP	KEYFUN08	;跳到键号8对应功能程序标号
	LJMP	KEYFUN09	;跳到键号9对应功能程序标号
	LJMP	KEYFUN10	;跳到键号10对应功能程序标号
	LJMP	KEYFUN11	;跳到键号11对应功能程序标号
	LJMP	KEYFUN12	;跳到键号12对应功能程序标号
	LJMP	KEYFUN13	;跳到键号13对应功能程序标号
	LJMP	KEYFUN14	;跳到键号14对应功能程序标号
	LJMP	KEYFUN15	;跳到键号15对应功能程序标号
	LJMP	KEYFUN16	;跳到键号16对应功能程序标号
	LJMP	KEYFUN17	;跳到键号17对应功能程序标号
	LJMP	KEYFUN18	;跳到键号18对应功能程序标号
	LJMP	KEYFUN19	;跳到键号19对应功能程序标号
	LJMP	KEYFUN20	;跳到键号20对应功能程序标号
	LJMP	KEYFUN21	;跳到键号21对应功能程序标号
	LJMP	KEYFUN22	;跳到键号22对应功能程序标号
	LJMP	KEYFUN23	;跳到键号23对应功能程序标号
	LJMP	KEYFUN24	;跳到键号24对应功能程序标号
	LJMP	KEYFUN25	;跳到键号25对应功能程序标号
	LJMP	KEYFUN26	;跳到键号26对应功能程序标号
	LJMP	KEYFUN27	;跳到键号27对应功能程序标号
	LJMP	KEYFUN28	;跳到键号28对应功能程序标号
	LJMP	KEYFUN29	;跳到键号29对应功能程序标号
	LJMP	KEYFUN30	;跳到键号30对应功能程序标号
	LJMP	KEYFUN31	;跳到键号31对应功能程序标号
	RET
	;列号对应数据表
KEYVALTAB:	DB	0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,7FH
;对应列号:	0	1	2	3	4	5	6	7
	RET
	;
KEYFUN00:	MOV	A,#02H	;发2个脉冲
	LJMP	REMOTE	;转发送程序
	RET
	;
KEYFUN01:	MOV	A,#03H	;发3个脉冲
	LJMP	REMOTE	;转发送程序
	RET
	;
KEYFUN02:	MOV	A,#04H	;发4个脉冲
	LJMP	REMOTE	;转发送程序
	RET
	;
KEYFUN03:	MOV	A,#05H	;发5个脉冲
	LJMP	REMOTE	;转发送程序
	RET
	;
KEYFUN04:	MOV	A,#06H	;发6个脉冲
	LJMP	REMOTE	;转发送程序
	RET
	;
KEYFUN05:	MOV	A,#07H	;发7个脉冲
	LJMP	REMOTE	;转发送程序
	RET
	;
KEYFUN06:	MOV	A,#08H	;发8个脉冲
	LJMP	REMOTE	;转发送程序
	RET
	;
KEYFUN07:	MOV	A,#09H	;发9个脉冲
	LJMP	REMOTE	;转发送程序
	RET
	;
	;
KEYFUN08:	MOV	A,#0AH	;发10个脉冲
	LJMP	REMOTE	;转发送程序
	RET
	;
KEYFUN09:	MOV	A,#0BH	;发11个脉冲
	LJMP	REMOTE	;转发送程序
	RET
	;
KEYFUN10:	MOV	A,#0CH	;发12个脉冲
	LJMP	REMOTE	;转发送程序
	RET
	;
KEYFUN11:	MOV	A,#0DH	;发13个脉冲
	LJMP	REMOTE	;转发送程序
	RET
	;
KEYFUN12:	MOV	A,#0EH	;发14个脉冲
	LJMP	REMOTE	;转发送程序
	RET
	;
KEYFUN13:	MOV	A,#0FH	;发15个脉冲
	LJMP	REMOTE	;转发送程序
	RET
	;
KEYFUN14:	MOV	A,#10H	;发16个脉冲
	LJMP	REMOTE	;转发送程序
	RET
	;
KEYFUN15:	MOV	A,#11H	;发17个脉冲
	LJMP	REMOTE	;转发送程序
	RET
KEYFUN16:	RET	;备用功能
KEYFUN17:	RET	;备用功能
KEYFUN18:	RET	;备用功能
KEYFUN19:	RET	;备用功能
KEYFUN20:	RET	;备用功能
KEYFUN21:	RET	;备用功能
KEYFUN22:	RET
KEYFUN23:	RET
KEYFUN24:	RET
KEYFUN25:	RET
KEYFUN26:	RET
KEYFUN27:	RET
KEYFUN28:	RET
KEYFUN29:	RET
KEYFUN30:	RET
KEYFUN31:	RET	;备用功能
	;
	;
	;*************************************
	;*	*
	;*	编	码	发	射	程	序	*
	;*	*
	;*************************************
	;
REMOTE:	MOV	R1,A	;装入发射脉冲个数
	LJMP	OUT3	;转第一个码发射处理
OUT:	MOV	R0,#55H	;1MS宽低电平发射控制数据
OUT1:	SETB	ET1	;开T1中断
	SETB	TR1	;开启定时器T1
	NOP	;延时
	NOP
	NOP
	NOP
	NOP
	DJNZ	R0,OUT1	;时间不到转OUT1再循环
	MOV	R0,#32H	;1MS高电平间隙控制数据
OUT2:	CLR	TR1	;关定时器T1
	CLR	ET1	;关T1中断
	CLR	P3.5	;关脉冲输出
	NOP	;空操作延时
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	DJNZ	R0,OUT2	;时间不到转OUT2再循环
	DJNZ	R1,OUT	;脉冲未发完,转OUT再循环发射
	LCALL	DL500MS	;
	RET	;
OUT3:	MOV	R0,#0FFH	;装发谢3MS宽控制数据
	LJMP	OUT1	;转OUT1
	;
	;*************************************
	;*	*
	;*	延时513	US	*
	;*	*
	;*************************************
	;
	;513微秒延时程序
DELAY:	MOV	R2,#0FFH
DELAY1:	DJNZ	R2,DELAY1
	RET
	;
	;
	;
	;*************************************
	;*	*
	;*	延时10MS	*
	;*	*
	;*************************************
	;
	;10毫秒延时程序
DL10MS:	MOV	R3,#14H
DL10MS1:	LCALL	DELAY
	DJNZ	R3,DL10MS1
	RET
	;500毫秒延时程序
DL500MS:	MOV	R4,#32H
DL500MS1:	LCALL	DL10MS
	DJNZ	R4,DL500MS1
	RET
	;
	END	;程序结束
	END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -