📄 irremote.lis
字号:
0104 0895 ret
0106 .dbend
0106 .dbfunc e main _main fV
.even
0106 _main::
0106 .dbline -1
0106 .dbline 83
0106 ; //使能接收,使能发送
0106 ; }
0106 ;
0106 ; void main(void)
0106 ; {
0106 .dbline 84
0106 ; PORTA=0XFF;
0106 8FEF ldi R24,255
0108 8BBB out 0x1b,R24
010A .dbline 85
010A ; DDRA=0XFF; //OUT
010A 8ABB out 0x1a,R24
010C .dbline 86
010C ; PORTB=0XFF;
010C 88BB out 0x18,R24
010E .dbline 87
010E ; DDRB=0X03; //PB0,PB1 OUT
010E 83E0 ldi R24,3
0110 87BB out 0x17,R24
0112 .dbline 88
0112 ; PORTC=0XFF;
0112 8FEF ldi R24,255
0114 85BB out 0x15,R24
0116 .dbline 89
0116 ; DDRD =(1<<PIN_TXD); //TXD为输出
0116 82E0 ldi R24,2
0118 81BB out 0x11,R24
011A .dbline 90
011A ; init_USART();
011A EBDF xcall _init_USART
011C .dbline 91
011C ; MCUCSR &=~(1<<ISC2); //falling edge interrupt
011C 84B7 in R24,0x34
011E 8F7B andi R24,191
0120 84BF out 0x34,R24
0122 .dbline 92
0122 ; GIFR=(1<<INTF2); //写1清除标志位,在使能中断前最好先把对应的标志位清除,以免误触发
0122 80E2 ldi R24,32
0124 8ABF out 0x3a,R24
0126 .dbline 93
0126 ; GICR=(1<<INT2); //使能INT2外部中断
0126 8BBF out 0x3b,R24
0128 .dbline 94
0128 ; SEI(); //使能全局中断
0128 7894 sei
012A .dbline 95
012A ; flag=0;
012A 2224 clr R2
012C 20920100 sts _flag,R2
0130 09C0 xjmp L30
0132 L29:
0132 .dbline 97
0132 ; while(1)
0132 ; {
0132 .dbline 98
0132 ; if(flag==1)
0132 80910100 lds R24,_flag
0136 8130 cpi R24,1
0138 21F4 brne L32
013A .dbline 99
013A ; {
013A .dbline 100
013A ; display(code);
013A 00910000 lds R16,_code
013E 8ADF xcall _display
0140 .dbline 101
0140 ; }
0140 01C0 xjmp L33
0142 L32:
0142 .dbline 103
0142 ; else
0142 ; {
0142 .dbline 104
0142 ; displayerror();
0142 B5DF xcall _displayerror
0144 .dbline 105
0144 ; }
0144 L33:
0144 .dbline 107
0144 L30:
0144 .dbline 96
0144 F6CF xjmp L29
0146 X0:
0146 .dbline -2
0146 L28:
0146 .dbline 0 ; func end
0146 0895 ret
0148 .dbend
.area vector(rom, abs)
.org 72
0048 0C94A400 jmp _int2pro
.area text(rom, con, rel)
0148 .dbfile D:\M16开发板实验教程\icc-avr\irremote\irremote.c
0148 .dbfunc e int2pro _int2pro fV
0148 ; k -> R20
0148 ; aa -> y+0
0148 ; i -> R10
0148 ; dm -> R22
0148 ; j -> R12
.even
0148 _int2pro::
0148 0E940000 xcall push_lset
014C 0E940000 xcall push_gset4
0150 2297 sbiw R28,2
0152 .dbline -1
0152 .dbline 115
0152 ;
0152 ; }
0152 ; }
0152 ;
0152 ; /**********************************************************************
0152 ; function: ext2 interrupt service function
0152 ; **********************************************************************/
0152 ; #pragma interrupt_handler int2pro: iv_INT2
0152 ; void int2pro(void) //INT2中断服务程序
0152 ; {
0152 .dbline 116
0152 ; unsigned char i,j,k,dm=0,aa[2];
0152 6627 clr R22
0154 .dbline 117
0154 ; for(k=0;k<10;k++) //重复10次,目的是检测在9毫秒内如果出现高电平就退出解码程序
0154 4427 clr R20
0156 54C0 xjmp L38
0158 L35:
0158 .dbline 118
0158 ; { //aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
0158 .dbline 120
0158 ;
0158 ; delay0_9ms(); //延时0.9毫秒
0158 BDDF xcall _delay0_9ms
015A .dbline 121
015A ; if ((PINB&(1<<IR))==(1<<IR))
015A 86B3 in R24,0x16
015C 8470 andi R24,4
015E 8430 cpi R24,4
0160 11F4 brne L39
0162 .dbline 122
0162 ; {k=10;break;} //延时0.9毫秒后判断PB2脚是否出现高电平如果有就退出解码程序
0162 .dbline 122
0162 4AE0 ldi R20,10
0164 .dbline 122
0164 50C0 xjmp L37
0166 L39:
0166 .dbline 123
0166 ; else if(k==9) //重复10次?
0166 4930 cpi R20,9
0168 09F0 breq X3
016A 49C0 xjmp L41
016C X3:
016C .dbline 124
016C ; { //bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
016C L43:
016C .dbline 125
016C L44:
016C .dbline 125
016C ; while((PINB&(1<<IR))==0); //等待高电平避开9毫秒低电平引导脉冲
016C B29B sbis 0x16,2
016E FECF rjmp L43
0170 .dbline 126
0170 ; delay4_5ms(); //延时4.5毫秒避开4.5毫秒的结果码
0170 B5DF xcall _delay4_5ms
0172 .dbline 132
0172 ;
0172 ;
0172 ; /********************************************
0172 ; //26位的用户码,前13位数据码,后13位数据反码
0172 ; *********************************************/
0172 ; for(j=1;j<=26;j++)//每组数据为26位
0172 CC24 clr R12
0174 C394 inc R12
0176 0BC0 xjmp L49
0178 X1:
0178 .dbline 133
0178 ; {
0178 L50:
0178 .dbline 134
0178 L51:
0178 .dbline 134
0178 ; while((PINB&(1<<IR))==0); //
0178 B29B sbis 0x16,2
017A FECF rjmp L50
017C .dbline 135
017C ; delay0_9ms();
017C ABDF xcall _delay0_9ms
017E .dbline 136
017E ; if((PINB&(1<<IR))==(1<<IR))
017E 86B3 in R24,0x16
0180 8470 andi R24,4
0182 8430 cpi R24,4
0184 19F4 brne L53
0186 .dbline 137
0186 ; {
0186 .dbline 138
0186 ; delay_nms(1);
0186 01E0 ldi R16,1
0188 10E0 ldi R17,0
018A 55DF xcall _delay_nms
018C .dbline 139
018C ; }
018C L53:
018C .dbline 140
018C L47:
018C .dbline 132
018C C394 inc R12
018E L49:
018E .dbline 132
018E 8AE1 ldi R24,26
0190 8C15 cp R24,R12
0192 90F7 brsh L51
0194 .dbline 147
0194 ; }
0194 ;
0194 ;
0194 ; /***************************************************
0194 ; //16位的用户码,前8位数据码,后8位数据反码
0194 ; ****************************************************/
0194 ;
0194 ; for(i=0;i<2;i++)
0194 AA24 clr R10
0196 23C0 xjmp L58
0198 L55:
0198 .dbline 148
0198 ; {
0198 .dbline 149
0198 ; for(j=1;j<=8;j++)//每组数据为8位
0198 CC24 clr R12
019A C394 inc R12
019C 15C0 xjmp L62
019E X2:
019E .dbline 150
019E ; {
019E L63:
019E .dbline 151
019E L64:
019E .dbline 151
019E ; while((PINB&(1<<IR))==0); //
019E B29B sbis 0x16,2
01A0 FECF rjmp L63
01A2 .dbline 152
01A2 ; delay0_9ms();
01A2 98DF xcall _delay0_9ms
01A4 .dbline 153
01A4 ; if((PINB&(1<<IR))==(1<<IR))
01A4 86B3 in R24,0x16
01A6 8470 andi R24,4
01A8 8430 cpi R24,4
01AA 49F4 brne L66
01AC .dbline 154
01AC ; {
01AC .dbline 155
01AC ; delay_nms(1);
01AC 01E0 ldi R16,1
01AE 10E0 ldi R17,0
01B0 42DF xcall _delay_nms
01B2 .dbline 156
01B2 ; dm=dm|0x80;
01B2 6068 ori R22,128
01B4 .dbline 157
01B4 ; if(j<8) dm=dm>>1; //数据"1",右移一个"1",一共7次
01B4 8C2D mov R24,R12
01B6 8830 cpi R24,8
01B8 30F4 brsh L67
01BA .dbline 157
01BA 6695 lsr R22
01BC .dbline 158
01BC ; }
01BC 04C0 xjmp L67
01BE L66:
01BE .dbline 159
01BE ; else if(j<8) dm=dm>>1; //数据"0",一共7次
01BE 8C2D mov R24,R12
01C0 8830 cpi R24,8
01C2 08F4 brsh L70
01C4 .dbline 159
01C4 6695 lsr R22
01C6 L70:
01C6 L67:
01C6 .dbline 160
01C6 L60:
01C6 .dbline 149
01C6 C394 inc R12
01C8 L62:
01C8 .dbline 149
01C8 88E0 ldi R24,8
01CA 8C15 cp R24,R12
01CC 40F7 brsh L64
01CE .dbline 161
01CE CE01 movw R24,R28
01D0 EA2D mov R30,R10
01D2 FF27 clr R31
01D4 E80F add R30,R24
01D6 F91F adc R31,R25
01D8 6083 std z+0,R22
01DA .dbline 162
01DA 6627 clr R22
01DC .dbline 163
01DC L56:
01DC .dbline 147
01DC A394 inc R10
01DE L58:
01DE .dbline 147
01DE 8A2D mov R24,R10
01E0 8230 cpi R24,2
01E2 D0F2 brlo L55
01E4 .dbline 164
01E4 ; }
01E4 ; aa[i]=dm;
01E4 ; dm=0;
01E4 ; }
01E4 ; if(aa[0]=~aa[1])
01E4 2980 ldd R2,y+1
01E6 2094 com R2
01E8 2882 std y+0,R2
01EA 2220 tst R2
01EC 41F0 breq L72
01EE .dbline 165
01EE ; {
01EE .dbline 166
01EE ; code=aa[0];
01EE 20920000 sts _code,R2
01F2 .dbline 167
01F2 ; flag=1;
01F2 81E0 ldi R24,1
01F4 80930100 sts _flag,R24
01F8 .dbline 168
01F8 ; put_c(code);
01F8 00910000 lds R16,_code
01FC 76DF xcall _put_c
01FE .dbline 169
01FE ; }
01FE L72:
01FE .dbline 171
01FE ;
01FE ; }
01FE L41:
01FE .dbline 172
01FE L36:
01FE .dbline 117
01FE 4395 inc R20
0200 L38:
0200 .dbline 117
0200 4A30 cpi R20,10
0202 08F4 brsh X4
0204 A9CF xjmp L35
0206 X4:
0206 L37:
0206 .dbline -2
0206 L34:
0206 2296 adiw R28,2
0208 0E940000 xcall pop_gset4
020C 0E940000 xcall pop_lset
0210 .dbline 0 ; func end
0210 1895 reti
0212 .dbsym r k 20 c
0212 .dbsym l aa 0 A[2:2]c
0212 .dbsym r i 10 c
0212 .dbsym r dm 22 c
0212 .dbsym r j 12 c
0212 .dbend
.area bss(ram, con, rel)
0000 .dbfile D:\M16开发板实验教程\icc-avr\irremote\irremote.c
0000 _code::
0000 .blkb 1
0001 .dbsym e code _code c
0001 _flag::
0001 .blkb 1
0002 .dbsym e flag _flag c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -