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

📄 ir.asm

📁 spce061单片机的一些程序!C语言和汇编语言都有
💻 ASM
字号:
//======================================================
// Note: Assembly only
// Date: 2002/6/1
// Input: Index of IR Code
// Output: IR wave from IOB8.低位在前,高位在后
//======================================================
.INCLUDE 	hardware.inc

.PUBLIC    	IR_Send

.RAM 
.VAR 		Send_Code;      
.PUBLIC  	IR_Send_Time_Flag     
.VAR 		IR_Send_Time_Flag

.VAR 		code_shift         //移位单元
.VAR 		send_counter       //移位计数器
.VAR 		func_code          //功能码
.EXTERNAL  	R_InterruptStatus

.TEXT
//==========================================================
IR_Send_Table:
   .DW 0           
   //先发低位,再发高位,低位为资料码,高位为资料反码
   .DW 0xEB14;    				//S1  MUTE       
   .DW 0xF00F;    				//S2  AV
   .DW 0xEA15;    				//S3  SLEEP
   .DW 0xF40B;    				//S4  POWER      
   .DW 0xFF00;    				//S5  1
   .DW 0xFE01;    				//S6  2
   .DW 0xFD02;    				//S7  3
   .DW 0xE11E;    				//S8  SCAN     
   .DW 0xFC03;    				//S9  4
   .DW 0xFB04;    				//S10 5
   .DW 0xFA05;    				//S11 6
   .DW 0xD52A;    				//S12  VOL M    
   .DW 0xF906;    				//S13  7
   .DW 0xF807;    				//S14  8
   .DW 0xF708;    				//S15  9
   .DW 0xF30C;    				//S16  SYSTEM
   .DW 0xF50A;    				//S17  -/--/---
   .DW 0xF609;    				//S18  0
   .DW 0xE817;    				//S19  S.MPX
   .DW 0xE916;    				//S20  DISPLAY
   .DW 0xEE11;    				//S21  CH+
   .DW 0xE31C;    				//S22  MENU
   .DW 0xEF10;    				//S23  CH-
   .DW 0xED12;    				//S24  VOL-
   .DW 0xEC13;    				//S25  VOL+
                				//S26   
 
.CODE       
IR_Send:   		
   		bp=r2+IR_Send_Table     		//查表,取按键对应的红外码   
   		r3=[bp]
   		[func_code]=r3
        
 	    call  F_IR_System_Initial   	//发送初始化
   	    call  F_Send_leading_pulse   	//发送头脉冲
	 	r1=0x0808                    	//系统码
		[code_shift]=r1 
        call  F_Send_code      			//发送系统码
                
        r1=[func_code]         			//资料码及资料反码
		[code_shift]=r1 
        call  F_Send_code      			//发送资料码及资料反码
      
        call  F_IR_Send_End    			//发送结束位

    	r1=0x0036						//关闭 TimerA 定时器 
    	[P_TimerA_Ctrl]=r1
    	r1=0x0006						//关闭 TimerB 定时器 
    	[P_TimerB_Ctrl]=r1
        
        r1=0xf7ff              			//关FIQ_TMB中断
	    r1&=[R_InterruptStatus]
	    [R_InterruptStatus]=r1
	    [P_INT_Ctrl] = r1
 
        retf
         


//================================================================//

F_IR_System_Initial:    		
		r1=0xFFFF   		   			//IOB8输出
  		[P_IOB_Dir]=r1 
  		r1=0xFFFF            
  		[P_IOB_Attrib]=r1 
  		r1=0x0003          
  		[P_IOB_Data]=r1 
		  
	    r1=0x0000             			//fosc=24.576M(fault),CPUclk=fosc
  		[P_SystemClock]=r1
    
        r1=0x0000              			//Set TXPinEN=0 
        [P_UART_Command2]=r1;
 	    
	    //r1 = 0x0001;		   			//Set b0:IRTXEN=1
	    //[P_FeedBack] = r1;
	    r1=0x0036						//Turn off TimerA 
  		[P_TimerA_Ctrl]=r1
		r1=0xffec						//38.3kHz 0xffec
  		[P_TimerA_Data]=r1 
		  	
	    r1=0x0000			     		// Clock source =fos/2 =12.288M
  		[P_TimerB_Ctrl]=r1				//change it ,width change
		r1=58606  //62085  				//TimerB=0.56ms,即0.56ms产生中断
  		[P_TimerB_Data]=r1
	  
      	r1=0  
		[IR_Send_Time_Flag]=r1
		
		r1=0x0800            			//允许 TimerB FIQ 中断
	    r1|=[R_InterruptStatus]
	    [R_InterruptStatus]=r1
	    [P_INT_Ctrl] = r1  
	     FIQ on  
	retf

//=====================================
F_Send_leading_pulse:		
        r1=0x01b0               		//开APWMO 占空比=6/16
  		[P_TimerA_Ctrl]=r1				//开 TimerA 定时器(不中断),Clock source =fosc/2=12.288M   

		r1=0                    		//清计时器
		[IR_Send_Time_Flag]=r1
			
		r1=8;                   		//0.56*8=4.4ms        
leading_high_4d4:         
		cmp r1,[IR_Send_Time_Flag]  
  		ja leading_high_4d4 
  		
		r1=0x0036				 		//关闭 APWMO  
  		[P_TimerA_Ctrl]=r1
		 r1=16;      			 		//0.56*8=4.4ms      
leading_low_4d4:  
  		cmp r1,[IR_Send_Time_Flag]
  		ja leading_low_4d4

      retf


//========================================

F_Send_code: 
        r1=16
        [send_counter]=r1          		//移位16次
        
send_one_bit:             	
 		r1=0  
		[IR_Send_Time_Flag]=r1    
		
  	    r1=0x1b0		            	//时钟源A选择FOSC/2,时钟源B选择1,APWMO选择6/16.			 
  		[P_TimerA_Ctrl]=r1		   
IR_Code_High:         
  		r1=[IR_Send_Time_Flag]
  		jz IR_Code_High
		
		r1=0x0036			       		//关闭 APWMO 
  		[P_TimerA_Ctrl]=r1 
		r1=[code_shift]           	
  		test r1,0x0001            		//判断发送的第一位数据是0还是1;
  		jz Send_Num_0_Low
				
Send_Num_1_Low:
      r1=4;
      jmp IR_Code_Low
Send_Num_0_Low:		
	  r1=2;
IR_Code_Low:
      cmp r1,[IR_Send_Time_Flag]
      ja  IR_Code_Low                  	
      
send_next_bit:
	    r1=[code_shift]
	    r1=r1 lsr 1            			//下一位
	    [code_shift]=r1
	    r1=[send_counter]      			//移位次数-1
	    r1-=1
        [send_counter]=r1
        cmp r1,0              			//移位完成?
        jnz send_one_bit
 
       retf
     
         
F_IR_Send_End:                 			//发送结束位       
  		r1=0  
		[IR_Send_Time_Flag]=r1    
  	    r1=0x1b0						//时钟源A选择FOSC/2,时钟源B选择1,APWMO选择6/16.
  		[P_TimerA_Ctrl]=r1		   
End_High:         
  		r1=[IR_Send_Time_Flag]
  		jz End_High                
    	r1 = 0x0036;					// 关闭TimerA定时器
        [P_TimerA_Ctrl] = r1;
	retf
 
  

   

⌨️ 快捷键说明

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