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

📄 irda1.asm

📁 MCS-51单片机实验 39个实用实验和源码
💻 ASM
字号:
C8279	EQU  	0F239H			;8279控制口
D8279	EQU		0F238H			;8279数据口

		ORG		0000H
		LJMP	MAIN
		ORG		000BH
		LJMP	CTC0
			
		ORG		0030H
MAIN:	MOV		SP,#60H			;设置堆栈
		LCALL	INIT8279		;调用8279初始化子程序
		LCALL	TXDINT			;调用单元初始化子程序
MAIN1:	LCALL	DISP			;调用显示子程序
		LCALL	INTKEY			;调用键控子程序
		LCALL	TRANSDAT				;调用数据发送子程序
		SJMP	MAIN1
		

	
INIT8279:                       ;8279初始化子程序
        PUSH   DPH              ;保存现场
        PUSH   DPL
        PUSH   ACC
        MOV    DPTR ,#C8279
        MOV    A,#00H		    ;置8279工作方式
        MOVX   @DPTR,A
        MOV    A,#2FH	        ;置键盘扫描速率
        MOVX   @DPTR,A
        MOV    A,#0C1H	        ;清除 LED 显示
	    MOVX   @DPTR,A
        POP    ACC              ;恢复现场
        POP    DPL
        POP    DPH
        RET	
        
TXDINT:	MOV		R0,#30H			;存储单元设初值
		MOV		R7,#30H
		MOV		A,#00H
TXDINT0:MOV		@R0,A			
		INC		R0
		DJNZ	R7,TXDINT0    
		MOV		30H,#00H		;用户码设置
		MOV		31H,#0FFH	
		SETB	04H	
		MOV		R0,#50H			;显示缓冲区初始设置
		MOV		R1,#30H
		MOV		R2,#02H
YHDIS:	MOV		A,@R1
		ANL		A,#0F0H
		SWAP	A
		MOV		@R0,A
		INC		R0
		MOV		A,@R1
		ANL		A,#0FH
		MOV		@R0,A
		INC		R0
		INC		R1
		DJNZ	R2,YHDIS
		MOV		54H,#10H
		MOV		55H,#10H	
		MOV		56H,#11H		
		MOV		57H,#11H
		MOV     TMOD,#01H		;设置定时器0工作方式1
		SETB    ET0				
		SETB	EA				;开中断				
		RET
		
INTKEY:	LCALL	GETKEY			;键控子程序
		CJNE	A,#0FFH,INTKEY
		MOV		A,B
		CJNE	A,#3AH,INTKEY1	;判是否为A键
		SJMP	GETKEYA
INTKEY1:CJNE	A,#3BH,INTKEY	;判是否为持续发码		
		SETB	04H				;置持续码标志
		RET
GETKEYA:LCALL	KEYA			;调用A键处理子程序
GETKEYB:LCALL	GETKEY
		CJNE	A,#0FFH,GETKEYB
		MOV		A,B
		CJNE	A,#3AH,KEYB1
		SJMP	GETKEYA
KEYB1:	CJNE	A,#3BH,NOKEYB	;判是否为B键
		CLR		04H				;置第一次发码标志
		SJMP	SREND
NOKEYB:	MOV		R2,#02H
		MOV		R0,#56H
		MOV		A,B	
		CLR		C
		SUBB	A,#30H
		MOV		@R0,A
		LCALL	DISP
		INC		R0
		LCALL	GETDATE1
		SJMP	GETKEYB
SREND:	RET
			
;A键处理子程		
KEYA:	MOV		R0,#56H			
		MOV		R2,#02H
GETDATE:LCALL	GETKEY			;取键
		CJNE	A,#0FFH,GETDATE
		MOV		A,B
		CLR		C
		SUBB	A,#30H
		MOV		@R0,A			;取到数据送显示缓冲区
		LCALL	DISP			;显示
		INC		R0
GETDATE1:
		DJNZ	R2,GETDATE		;取完2位输入数据?
		MOV		A,56H			;将取到数据送数据存储区
		SWAP	A
		ORL		A,57H
		MOV		32H,A
		CPL		A				;数据反码送数据存储区
		MOV		33H,A
		RET
		

		
TRANSDAT:
		MOV		R1,#30H
		MOV		R6,#08H
		MOV		R7,#04H
		CLR		P1.6
		MOV		R2,#0FFH		;发送引导码9200us(H)
TXDYD1:	LCALL	CARRYWAVE
		DJNZ	R2,TXDYD1
		MOV		R2,#63H
TXDYD2:	LCALL	CARRYWAVE
		DJNZ	R2,TXDYD2
		JB		04H,TXDREYD		;判是否为持续码	
		CLR		P1.6			;发送引导码4400us(L)
		MOV		TH0,#0F0H		;设置定时器初值
		MOV		TL0,#28H
		SJMP	S4400
TXDREYD:CLR		P1.6			;发送持续码2200us(L)
		MOV		TH0,#0F8H		;设置定时器初值
		MOV		TL0,#14H		
S4400:	SETB	TR0
		JNB		03H,$
		CLR		03H
		JB		04H,RES680
TXDDATE:MOV		5EH,@R1			
TXDBIT:	MOV		R2,#1AH			;发送数据码680us(H)
S680:	LCALL	CARRYWAVE
		DJNZ	R2,S680
		CLR		P1.6						
		MOV		A,5EH
		RRC		A		
		JC		S1600			;判数据位是否为‘1’?
		MOV		5EH,A
		MOV		TH0,#0FEH		;为‘0’定时500us(L)
		MOV		TL0,#34H
		SETB	TR0
		JNB		03H,$
		CLR		03H
		SJMP	TXDBEND
S1600:	MOV		5EH,A			
		MOV		TH0,#0FAH		;为‘1’定时1600uS(L)
		MOV		TL0,#3DH
		SETB	TR0
		JNB		03H,$
		CLR		03H
TXDBEND:DJNZ	R6,TXDBIT		;发送完8位数据?
		MOV		R6,#08H
		INC		R1
		DJNZ	R7,TXDDATE		;发送完4组数据?
RES680:	MOV		R2,#1AH			;发送结束码680us(H)		
JS:		LCALL	CARRYWAVE
		DJNZ	R2,JS		
		CLR		P1.6		
		RET
					
CARRYWAVE:
		SETB	P1.6			;载波子程序
		LCALL	DELAY4
		CLR		P1.6
		LCALL	DELAY4
		NOP
		NOP		
		RET
		
CTC0:	CLR		TR0				;中断子程序
		SETB	03H
		RETI
		
DELAY4:	NOP						;载波延时子程序
		NOP
		NOP
		RET	
		
;读取键盘子程序
;输入: 无   ; 输出: B: 读到的键码 A: 按键的标志
GETKEY: PUSH   DPH              ;保存现场
        PUSH   DPL
        PUSH   PSW
        MOV    DPTR,#C8279
        MOVX   A,@DPTR          ;读8279状态
        ANL    A,#07H           ;屏蔽D7-D3
        JNZ    GETVAL           ;判断是否有键输入
        MOV    A,#00H           ;置标志(无键输入)
        SJMP   NKBHIT
GETVAL: MOV    A,#40H           ;读 FIFO RAM 命令(40H)
        MOVX   @DPTR,A
        MOV    DPTR,#D8279
        MOVX   A,@DPTR          ;读键
        ANL    A,#3FH           ;屏蔽 SHIFT 和 CTRL 键
        MOV    DPTR,#KEYCODE    ;键码表起始地址
        MOVC   A,@A+DPTR        ;查表
        MOV    B,A              ;置返回键值
        MOV    A,#0FFH          ;置标志(有键输入)
NKBHIT: POP    PSW              ;恢复现场
        POP    DPL
        POP    DPH
        RET
					
DISP:	PUSH	DPL				;显示子程序
		PUSH	DPH
		PUSH	PSW
		PUSH	ACC				
		MOV		R1,#50H
		MOV		R4,#07H
DIS1:
		MOV		A,@R1
		MOV		R5,A
		LCALL	DISLED
		INC		R1
		DEC		R4
		CJNE	R4,#0FFH,DIS1
		POP		ACC
		POP		PSW
		POP		DPH
		POP		DPL
		RET			

DISLED:							;显示字符
		PUSH	DPH
		PUSH	DPL
		PUSH	PSW
		PUSH	ACC
		MOV		A,#80H
		ADD		A,R4			;R4显示位置
		MOV		DPTR,#C8279
		MOVX	@DPTR,A
		MOV		DPTR,#LEDSEG	;查显示常数表
		MOV		A,R5			;R5显示数值
		MOVC	A,@A+DPTR
		MOV		DPTR,#D8279
		MOVX	@DPTR,A
		POP		ACC
		POP		PSW
		POP		DPL
		POP		DPH
		RET	
		
        
;LED显示常数表
LEDSEG: DB      3FH,06H,5BH,4FH,66H,6DH,7DH,07H ;'0,1,2,3,4,5,6,7'
        DB      7FH,6FH,77H,7CH,39H,5EH,79H,71H ;'8,9,A,B,C,D,E,F'
        DB     	00H,40H
;键盘键码表
KEYCODE:DB      30H,31H,32H,33H,34H,35H,36H,37H ;'1,2,Q,W,A,S,+,Z'
        DB      38H,39H,3AH,3BH,3CH,3DH,3EH,3FH ;'3,4,E,R,D,F,X,C'
        END

⌨️ 快捷键说明

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