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

📄 ir.s

📁 单片机红外通讯控制 C语言编写 源程序。
💻 S
📖 第 1 页 / 共 2 页
字号:
	lds R2,_Table+12
	out 0x15,R2
	.dbline 108
	rjmp L14
L41:
	.dbline 109
; 	case 17: PORTC=Table[13];break;       //A	
	lds R2,_Table+13
	out 0x15,R2
	.dbline 109
	rjmp L14
L43:
	.dbline 110
	lds R2,_Table+14
	out 0x15,R2
	.dbline 110
	.dbline 111
L14:
	.dbline -2
L12:
	rcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r data 20 c
	.dbend
	.dbfunc e spk _spk fV
;              i -> R20
	.even
_spk::
	rcall push_gset1
	mov R20,R16
	.dbline -1
	.dbline 122
; 	case 18: PORTC=Table[14];break;       //C	
; 	default: break;
;    }
; }
; /************************************************
; 函 数 名:    spk()
; 功    能:    蜂鸣器鸣叫一声函数
; 输入参数:     
; 输出参数:    
; 描    述:    /
; ***********************************************/
; void spk (uchar i) 
; {
	.dbline 123
;  	 PORTA &= ~(1<<PA2);     //蜂鸣器响
	cbi 0x1b,2
	.dbline 124
; 	 DelaymS (i);         //延迟
	mov R16,R20
	clr R17
	rcall _DelaymS
	.dbline 125
; 	 PORTA |= (1<<PA2);      //蜂鸣器关闭
	sbi 0x1b,2
	.dbline -2
L46:
	rcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r i 20 c
	.dbend
	.dbfunc e Init_mcu _Init_mcu fV
	.even
_Init_mcu::
	.dbline -1
	.dbline 135
; }
; /************************************************
; 函 数 名:    Init_mcu()
; 功    能:    单片机初始化函数
; 输入参数:     /
; 输出参数:    /
; 描    述:    相关口方向的设置等
; ***********************************************/
; void Init_mcu(void)
; {
	.dbline 136
; 	DDRC = 0xff;         //PC口为推挽1输出
	ldi R24,255
	out 0x14,R24
	.dbline 137
; 	DDRD = 0b11110111;   //PD3(INT1)接蜂鸣器为输入,其余为输出。
	ldi R24,247
	out 0x11,R24
	.dbline 138
; 	PORTD = 0b10001111;  //红外输入端需要使用内部上拉电阻,只使用第一位数码管。
	ldi R24,143
	out 0x12,R24
	.dbline 139
; 	DDRA = 0xff;         //PA口为输出,PA4接蜂鸣器
	ldi R24,255
	out 0x1a,R24
	.dbline 140
; 	PORTA = 0xff;        //默认蜂鸣器不响
	out 0x1b,R24
	.dbline -2
L47:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e init_int1 _init_int1 fV
	.even
_init_int1::
	.dbline -1
	.dbline 150
; }
; /************************************************
; 函 数 名:    Init_int1()
; 功    能:    外部中断1初始化函数
; 输入参数:     /
; 输出参数:    /
; 描    述:    设置外部中断1为下降沿触发
; ***********************************************/
; void init_int1 (void)          //外部中断1初始化
; {
	.dbline 151
;       MCUCR |= (1<<ISC11);     //设置为下降沿中断触发 
	in R24,0x35
	ori R24,8
	out 0x35,R24
	.dbline 152
; 	  MCUCR &= ~(1<<ISC10);    //设置为下降沿中断触发 
	in R24,0x35
	andi R24,251
	out 0x35,R24
	.dbline 153
; 	  GICR |= (1<<INT1);       //通用中断控制寄存器,中断使能
	in R24,0x3b
	ori R24,128
	out 0x3b,R24
	.dbline -2
L48:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e int1_serving _int1_serving fV
;            buf -> y+0
;              j -> R22
;              k -> R10
;            mid -> R12
;              i -> R20
	.even
_int1_serving::
	rcall push_lset
	rcall push_gset4
	sbiw R28,4
	.dbline -1
	.dbline 163
; }
; /************************************************
; 函 数 名:    Init_serving()
; 功    能:    红外IR接收中断服务程序
; 输入参数:     /
; 输出参数:    /
; 描    述:    整个红外译码部分的处理
; ***********************************************/
; void int1_serving (void)   //外部中断1,红外IR接收中断服务程序
; {
	.dbline 166
;    uchar i,j,k,mid ;
;    uchar buf[4];
;    CLI();              //暂时屏蔽外部中断
	cli
	.dbline 168
;    
;    for (i=0;i<9;i++)
	clr R20
	rjmp L53
L50:
	.dbline 169
;    {
	.dbline 170
; 	   Delay882uS();      //调用882uS延迟程序。
	rcall _Delay882uS
	.dbline 171
; 	   if((PIND&0x08)!=0) //判断INT1端口的状态。操作的是PD3,PD3为高吗?
	sbis 0x10,3
	rjmp L54
	.dbline 172
; 	   {
	.dbline 173
; 	   	SEI();           //开中断
	sei
	.dbline 174
; 	   	return;          //如果为高,说明是干扰或出错,跳出这个循环。
	rjmp L49
L54:
	.dbline 176
L51:
	.dbline 168
	inc R20
L53:
	.dbline 168
	cpi R20,9
	brlo L50
L56:
	.dbline 177
L57:
	.dbline 177
; 	   }
;    }
;    while ((PIND & 0x08) == 0); //等待9ms的低电平结束,
	sbis 0x10,3
	rjmp L56
L59:
	.dbline 179
L60:
	.dbline 179
;    
;    while ((PIND & 0x08) != 0); //等待4.5ms的高电平结束,
	sbic 0x10,3
	rjmp L59
	.dbline 181
; 
;    for (j=0;j<4;j++)
	clr R22
	rjmp L65
L62:
	.dbline 182
;    {
	.dbline 183
;        k=0;
	clr R10
	.dbline 184
; 	   for (i=0;i<8;i++)
	clr R20
	rjmp L69
X5:
	.dbline 185
;        {
L70:
	.dbline 186
L71:
	.dbline 186
;           while((PIND&0x08)==0); //等待每一个数据位的0.565ms低电平后的高电平
	sbis 0x10,3
	rjmp L70
	.dbline 188
; 	   
; 	      Delay882uS();          //高电平开始后用882微秒的时间尺去判断信号此时的高低电平状态
	rcall _Delay882uS
	.dbline 190
; 	   
; 	      mid = PIND & 0x08;    //读取端口的值。
	in R24,0x10
	andi R24,8
	mov R12,R24
	.dbline 191
; 	      if (mid != 0)
	tst R24
	breq L73
	.dbline 192
; 	      {
	.dbline 193
; 	          Delay1000uS();     //为高电平,再延迟1ms,
	rcall _Delay1000uS
	.dbline 194
; 			  k |= 1<<i;       //读取1
	ldi R16,1
	mov R17,R20
	rcall lsl8
	or R10,R16
	.dbline 195
; 	      }
	rjmp L74
L73:
	.dbline 197
; 	      else
; 	      {
	.dbline 198
; 			  k &= ~(1<<i);       //读取0
	ldi R16,1
	mov R17,R20
	rcall lsl8
	mov R2,R16
	com R2
	and R10,R2
	.dbline 199
; 	      }
L74:
	.dbline 200
L67:
	.dbline 184
	inc R20
L69:
	.dbline 184
	cpi R20,8
	brlo L71
	.dbline 201
	movw R24,R28
	mov R30,R22
	clr R31
	add R30,R24
	adc R31,R25
	std z+0,R10
	.dbline 202
L63:
	.dbline 181
	inc R22
L65:
	.dbline 181
	cpi R22,4
	brlo L62
	.dbline 204
;         }
; 		buf[j] = k ;          //保存读到的数据
;    }
;    
;    if ((buf[2]|buf[3]) != 0xff)  //判断数据的第三字节和第四字节的取反后相等吗?
	ldd R2,y+3
	ldd R24,y+2
	or R24,R2
	cpi R24,255
	breq L75
	.dbline 205
;    {
	.dbline 206
; 	   	SEI(); //开中断
	sei
	.dbline 207
; 	   	return;     //如果不相等说明是干扰或出错,跳出整个循环。
	rjmp L49
L75:
	.dbline 209
;    }  
;    key_decode (buf[2]);   //判断键值并显示,系统码即buf[1]和buf[2]忽略。
	ldd R16,y+2
	rcall _key_decode
	.dbline 211
;    //PORTC = buf[2];    //直接显示键值
;    spk(1000); //蜂鸣器响一声。
	ldi R16,232
	rcall _spk
	.dbline 212
;    SEI(); //开中断
	sei
	.dbline -2
L49:
	adiw R28,4
	rcall pop_gset4
	rcall pop_lset
	.dbline 0 ; func end
	reti
	.dbsym l buf 0 A[4:4]c
	.dbsym r j 22 c
	.dbsym r k 10 c
	.dbsym r mid 12 c
	.dbsym r i 20 c
	.dbend
	.dbfunc e main _main fV
	.even
_main::
	.dbline -1
	.dbline 216
; }
; //------------------------main----------------------------
; void main (void)    
; {
	.dbline 217
;     Init_mcu();       //单片机端口初始化,口方向设置与外部中断的使用无关,不影响。
	rcall _Init_mcu
	.dbline 218
; 	spk(1000);             //蜂鸣器响一声。
	ldi R16,232
	rcall _spk
	.dbline 219
; 	init_int1();       //外部中断1初始化
	rcall _init_int1
	.dbline 220
; 	SEI();             //开中断
	sei
	.dbline 221
; 	PORTC=0b10111111;  ///上电后初始显示"-"
	ldi R24,191
	out 0x15,R24
L81:
	.dbline 223
L82:
	.dbline 222
	rjmp L81
X6:
	.dbline -2
L80:
	.dbline 0 ; func end
	ret
	.dbend

⌨️ 快捷键说明

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