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

📄 红处线摇空.asm

📁 由AT89S52单片机编写的红处线摇控并送液晶显示。
💻 ASM
字号:
;*************************************
;*                                   *
;*      主程序和中断程序入口         *
;*                                   *
;*************************************
KEYB    EQU     20H.0	;按键标致(为1时有键按下)   	
		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 KEYB			;清按键标致位 
        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      	;调用初始化子程序
;
BEGIN:  ACALL KEY		 ;调用键盘扫描
        JB KEYB,BEGIN_	 ;判断是否有键按下   
		JMP BEGIN
BEGIN_: CLR KEYB
KEY0:	CJNE R4,#00H,KEY1
        ACALL  KEYFUN00
KEY1:   CJNE R4,#01H,KEY2
		ACALL  KEYFUN01
KEY2:	CJNE R4,#02H,KEY3
        ACALL  KEYFUN02
KEY3:   CJNE R4,#03H,KEY4
		ACALL  KEYFUN03
KEY4:   CJNE R4,#04H,KEY5
		ACALL  KEYFUN04
KEY5:	CJNE R4,#05H,KEY6
        ACALL  KEYFUN05
KEY6:   CJNE R4,#06H,KEY7
		ACALL  KEYFUN06
KEY7:   CJNE R4,#07H,KEY8
		ACALL  KEYFUN07
KEY8:	CJNE R4,#08H,KEY9
        ACALL  KEYFUN08
KEY9:   CJNE R4,#09H,KEY10
		ACALL  KEYFUN09
KEY10:  CJNE R4,#0AH,KEY11
		ACALL  KEYFUN10
KEY11:	CJNE R4,#0BH,KEY12
        ACALL  KEYFUN11
KEY12:  CJNE R4,#0CH,KEY13
		ACALL  KEYFUN12
KEY13:  CJNE R4,#0DH,KEY14
		ACALL  KEYFUN13
KEY14:	CJNE R4,#0EH,KEY15
        ACALL  KEYFUN14
KEY15:  CJNE R4,#0FH,KEYN 
		ACALL  KEYFUN15
KEYN:	AJMP  BEGIN

		NOP							;PC值出错处理
		NOP
		NOP
		LJMP	START				;重新初始化
;********键盘扫描********调用键盘扫描以后会返回一个键值存于R4中,和一个标致位KEYB    
KEY:    MOV A,#0FH		 ;查询是否有键按下   
        MOV P1,A
		MOV A,P1
		CJNE A,#0FH,KEYY
		CLR KEYB
		AJMP NEXT
KEYY:   ACALL DEL		    ;去抖动    
        MOV A,P1
		CJNE A,#0FH,GO
		MOV R4,#10H		    ;若有抖动,则返回无效键值    
		CLR KEYB
		AJMP NEXT
GO:     SETB KEYB			;置按键标致位    
        MOV R2,A			;R2中存放着行信息	      
    X1: CJNE R2,#0EH,X2		;若为第一行   
        MOV A,#0F0H
		MOV P1,A
		MOV A,P1
		MOV R3,A			;R3中存放着列信息	    
Y0:		CJNE R3,#0E0H,Y1	;若为第一列			    
		MOV R4,#00H			;R4中存放要返回的键值
		AJMP NEXT
Y1:     CJNE R3,#0D0H,Y2	;若为第二列,Yn表示16个键对应的操作   
		MOV R4,#01H
		AJMP NEXT
Y2:     CJNE R3,#0B0H,Y3    ;若为第三列
		MOV R4,#02H
		AJMP NEXT
Y3:     CJNE R3,#70H,X2	    ;若为第四列
		MOV R4,#03H
		AJMP NEXT
    X2: CJNE R2,#0DH,X3		;若为第二行
        MOV A,#0F0H
		MOV P1,A
		MOV A,P1
		MOV R3,A
Y4:		CJNE R3,#0E0H,Y5	;若为第一列
		MOV R4,#04H
		AJMP NEXT
Y5:     CJNE R3,#0D0H,Y6	;若为第二列
		MOV R4,#05H
		AJMP NEXT
Y6:     CJNE R3,#0B0H,Y7
		MOV R4,#06H
		AJMP NEXT
Y7:     CJNE R3,#70H,X3
		MOV R4,#07H
		AJMP NEXT
   X3:  CJNE R2,#0BH,X4		 ;若为第三行	   
        MOV A,#0F0H
		MOV P1,A
		MOV A,P1
		MOV R3,A
Y8:		CJNE R3,#0E0H,Y9
		MOV R4,#08H
		AJMP NEXT
Y9:     CJNE R3,#0D0H,Y10
		MOV R4,#09H
		AJMP NEXT
Y10:    CJNE R3,#0B0H,Y11
		MOV R4,#0AH
		AJMP NEXT
Y11:    CJNE R3,#70H,X4
		MOV R4,#0BH
		AJMP NEXT
   X4:  CJNE R2,#07H,NEXT	  ;若为第四行
        MOV A,#0F0H
		MOV P1,A
		MOV A,P1
		MOV R3,A
Y12:	CJNE R3,#0E0H,Y13
		MOV R4,#0CH
		AJMP NEXT
Y13:    CJNE R3,#0D0H,Y14
		MOV R4,#0DH
		AJMP NEXT
Y14:    CJNE R3,#0B0H,Y15
		MOV R4,#0EH
		AJMP NEXT
Y15:    CJNE R3,#70H,NEXT
		MOV R4,#0FH
NEXT:   RET
;
;*************************************
;*                                   *
;*        T1中断服务程序             *
;*                                   *
;*************************************
INTT1:          CPL     P3.5       			;40kHZ红外线遥控信号产生
		RETI        				;中断返回


;列号对应数据表
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
;*         编 码 发 射 程 序         *
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微秒延时程序
DELAY:          MOV     R2,#0FFH
DELAY1:         DJNZ    R2,DELAY1
				RET
;10毫秒延时程序
DL10MS:         MOV     R3,#14H
DL10MS1:        LCALL   DELAY
                DJNZ    R3,DL10MS1
		        RET
DEL: 	MOV R7,#07H
DEL1_:  MOV R6,#0FFH
        DJNZ R6,$
     	DJNZ R7,DEL1_
     	RET

;500毫秒延时程序
DL500MS:        MOV     R7,#32H
DL500MS1:       LCALL   DL10MS
                DJNZ    R7,DL500MS1
                RET
;
		        END	   				;程序结束

⌨️ 快捷键说明

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