📄 infrared_test.lst
字号:
0114 F0F9 BEQ 0x0134
0115 3047 CPI R20,7
0116 E0E0 LDI R30,0
0117 075E CPC R21,R30
0118 F0F1 BEQ 0x0137
0119 3048 CPI R20,0x8
011A E0E0 LDI R30,0
011B 075E CPC R21,R30
011C F0E9 BEQ 0x013A
011D 3049 CPI R20,0x9
011E E0E0 LDI R30,0
011F 075E CPC R21,R30
0120 F0E1 BEQ 0x013D
0121 C01D RJMP 0x013F
(0119) {
(0120) case 0:putchar('1');
0122 E301 LDI R16,0x31
0123 DF85 RCALL _putchar
(0121) break;
0124 C01A RJMP 0x013F
(0122) case 1:putchar('2');
0125 E302 LDI R16,0x32
0126 DF82 RCALL _putchar
(0123) break;
0127 C017 RJMP 0x013F
(0124) case 2:putchar('3');
0128 E303 LDI R16,0x33
0129 DF7F RCALL _putchar
(0125) break;
012A C014 RJMP 0x013F
(0126) case 3:putchar('4');
012B E304 LDI R16,0x34
012C DF7C RCALL _putchar
(0127) break;
012D C011 RJMP 0x013F
(0128) case 4:putchar('5');
012E E305 LDI R16,0x35
012F DF79 RCALL _putchar
(0129) break;
0130 C00E RJMP 0x013F
(0130) case 5:putchar('6');
0131 E306 LDI R16,0x36
0132 DF76 RCALL _putchar
(0131) break;
0133 C00B RJMP 0x013F
(0132) case 6:putchar('7');
0134 E307 LDI R16,0x37
0135 DF73 RCALL _putchar
(0133) break;
0136 C008 RJMP 0x013F
(0134) case 7:putchar('8');
0137 E308 LDI R16,0x38
0138 DF70 RCALL _putchar
(0135) break;
0139 C005 RJMP 0x013F
(0136) case 8:putchar('9');
013A E309 LDI R16,0x39
013B DF6D RCALL _putchar
(0137) break;
013C C002 RJMP 0x013F
(0138) case 9:putchar('0');
013D E300 LDI R16,0x30
013E DF6A RCALL _putchar
(0139) break;
(0140) default:break;
(0141) }
(0142) putchar(0x0a);//换行
013F E00A LDI R16,0xA
0140 DF68 RCALL _putchar
(0143) putchar(0x0d);//回车
0141 E00D LDI R16,0xD
0142 DF66 RCALL _putchar
(0144) infra_data[0]=0;
0143 2422 CLR R2
0144 92200117 STS infra_data,R2
(0145) infra_data[1]=0;
0146 92200118 STS infra_data+1,R2
(0146) infra_data[2]=0;
0148 92200119 STS infra_data+2,R2
(0147) infra_data[3]=0;
014A 9220011A STS infra_data+3,R2
(0148) rece_flag=0;
014C 92200116 STS rece_flag,R2
(0149) GICR = 0x80;//打开外部中断1
014E E880 LDI R24,0x80
014F BF8B OUT 0x3B,R24
(0150) }
0150 C005 RJMP 0x0156
(0151) else
(0152) {
(0153) //如果不是有效数据
(0154) rece_flag=0;
0151 2422 CLR R2
0152 92200116 STS rece_flag,R2
(0155) GICR = 0x80;//打开外部中断1
0154 E880 LDI R24,0x80
0155 BF8B OUT 0x3B,R24
0156 CF84 RJMP 0x00DB
0157 9508 RET
FILE: D:\开发板\source\infrared\infrared_test\infrared_test.c
(0001) /******************************************/
(0002) /* 北京MCU学习之家 */
(0003) /* 红外输入演示程序 */
(0004) /* 作者:白如冰 */
(0005) /* 2005年10月1日 */
(0006) /* 目标MCU:MEGA8 晶振:外部(EXT) 8MHZ */
(0007) /******************************************/
(0008) //红外接收头的引脚定义
(0009) // 1----->data-----> (PD3(int1))
(0010) // 2----->gnd
(0011) // 3----->vss
(0012) /******************************************/
(0013)
(0014) #include <iom8v.h>
(0015) #include <macros.h>
(0016) #pragma interrupt_handler int1_isr:iv_INT1
(0017) #pragma interrupt_handler t0_isr:iv_TIMER0_OVF
(0018)
(0019) #define INFR_DIR DDRD
(0020) #define INFR_PORT PORTD
(0021) #define INFR_DATA 3
(0022) #define buffer_max 75
(0023) unsigned char infra_data[4],rece_flag;
(0024) unsigned int counter_buffer[buffer_max];
(0025) unsigned char flag_start,rece_data_count,t0_counter,flag_t0;
(0026)
(0027)
(0028) /* 初始化外部中断1 */
(0029) void init_infr(void)
(0030) {
(0031) unsigned char i;
(0032) INFR_DIR&=~(1<<INFR_DATA); //PD3为输入方向
_init_infr:
i --> R16
0158 988B CBI 0x11,3
(0033) INFR_PORT|=1<<INFR_DATA; //PD3初始为高电平
0159 9A93 SBI 0x12,3
(0034) MCUCR = 0x04; //int1 电平变化产生中断
015A E084 LDI R24,4
015B BF85 OUT 0x35,R24
(0035) GICR = 0x80; //int1 外部中断使能
015C E880 LDI R24,0x80
015D BF8B OUT 0x3B,R24
(0036) TCCR0=0; //T0 1024分频
015E 2422 CLR R2
015F BE23 OUT 0x33,R2
(0037) TCNT0=0; //初始值为0 32ms中断一次,200ms许7次
0160 BE22 OUT 0x32,R2
(0038) TIMSK=1;//允许T0溢出中断
0161 E081 LDI R24,1
0162 BF89 OUT 0x39,R24
(0039) TCCR1B=0;//关闭定时器T1
0163 BC2E OUT 0x2E,R2
(0040) TCNT1=0; //初始值为0
0164 2433 CLR R3
0165 BC3D OUT 0x2D,R3
0166 BC2C OUT 0x2C,R2
(0041) flag_start=0;
0167 9220007F STS flag_start,R2
(0042) rece_data_count=0;
0169 9220007E STS rece_data_count,R2
(0043) t0_counter=0;
016B 9220007D STS t0_counter,R2
(0044) for(i=0;i<buffer_max;i++)
016D 2700 CLR R16
016E C00C RJMP 0x017B
(0045) counter_buffer[i]=0;
016F E082 LDI R24,2
0170 9F80 MUL R24,R16
0171 01F0 MOVW R30,R0
0172 E880 LDI R24,0x80
0173 E090 LDI R25,0
0174 0FE8 ADD R30,R24
0175 1FF9 ADC R31,R25
0176 2422 CLR R2
0177 2433 CLR R3
0178 8231 STD Z+1,R3
0179 8220 STD Z+0,R2
017A 9503 INC R16
017B 340B CPI R16,0x4B
017C F390 BCS 0x016F
(0046) infra_data[0]=0x31;
017D E381 LDI R24,0x31
017E 93800117 STS infra_data,R24
(0047) infra_data[1]=0x32;
0180 E382 LDI R24,0x32
0181 93800118 STS infra_data+1,R24
(0048) infra_data[2]=0x33;
0183 E383 LDI R24,0x33
0184 93800119 STS infra_data+2,R24
(0049) infra_data[3]=0x34;
0186 E384 LDI R24,0x34
0187 9380011A STS infra_data+3,R24
(0050) rece_flag=0;
0189 2422 CLR R2
018A 92200116 STS rece_flag,R2
(0051) flag_t0=0;
018C 9220007C STS flag_t0,R2
(0052) SEI(); //全局中断使能
018E 9478 BSET 7
018F 9508 RET
_int1_isr:
i --> R20
0190 920A ST R0,-Y
0191 921A ST R1,-Y
0192 922A ST R2,-Y
0193 923A ST R3,-Y
0194 930A ST R16,-Y
0195 931A ST R17,-Y
0196 932A ST R18,-Y
0197 933A ST R19,-Y
0198 938A ST R24,-Y
0199 939A ST R25,-Y
019A 93EA ST R30,-Y
019B 93FA ST R31,-Y
019C B60F IN R0,0x3F
019D 920A ST R0,-Y
019E D197 RCALL push_gset1
(0053)
(0054) }
(0055)
(0056) /*外部中断1 中断函数 */
(0057)
(0058) void int1_isr(void)
(0059) {
(0060) unsigned char i;
(0061)
(0062) if(flag_start==0) //开始计时T1
019F 9020007F LDS R2,flag_start
01A1 2022 TST R2
01A2 F431 BNE 0x01A9
(0063) {
(0064) TCCR1B=2;//开始计时 8分频
01A3 E082 LDI R24,2
01A4 BD8E OUT 0x2E,R24
(0065) flag_start=1;
01A5 E081 LDI R24,1
01A6 9380007F STS flag_start,R24
(0066) }
01A8 C056 RJMP 0x01FF
(0067)
(0068) else
(0069) {
(0070)
(0071) TCCR1B=0;
01A9 2422 CLR R2
01AA BC2E OUT 0x2E,R2
(0072) counter_buffer[rece_data_count++]=TCNT1;
01AB 9020007E LDS R2,rece_data_count
01AD 2433 CLR R3
01AE 2D82 MOV R24,R2
01AF 5F8F SUBI R24,0xFF
01B0 9380007E STS rece_data_count,R24
01B2 E002 LDI R16,2
01B3 E010 LDI R17,0
01B4 0191 MOVW R18,R2
01B5 D164 RCALL empy16s
01B6 01F8 MOVW R30,R16
01B7 E880 LDI R24,0x80
01B8 E090 LDI R25,0
01B9 0FE8 ADD R30,R24
01BA 1FF9 ADC R31,R25
01BB B42C IN R2,0x2C
01BC B43D IN R3,0x2D
01BD 8231 STD Z+1,R3
01BE 8220 STD Z+0,R2
(0073) TCNT1=0;
01BF 2422 CLR R2
01C0 2433 CLR R3
01C1 BC3D OUT 0x2D,R3
01C2 BC2C OUT 0x2C,R2
(0074) TCCR1B=2; //T0 8分频 开始计时
01C3 E082 LDI R24,2
01C4 BD8E OUT 0x2E,R24
(0075) if((counter_buffer[0]<4000)&&(counter_buffer[1]>5000)) //如果第一个数据不是有效数据退出
01C5 91800080 LDS R24,counter_buffer
01C7 91900081 LDS R25,counter_buffer+1
01C9 3A80 CPI R24,0xA0
01CA E0EF LDI R30,0xF
01CB 079E CPC R25,R30
01CC F538 BCC 0x01F4
01CD E888 LDI R24,0x88
01CE E193 LDI R25,0x13
01CF 90200082 LDS R2,counter_buffer+2
01D1 90300083 LDS R3,counter_buffer+3
01D3 1582 CP R24,R2
01D4 0593 CPC R25,R3
01D5 F4F0 BCC 0x01F4
(0076) {
(0077) for(i=0;i<buffer_max;i++)
01D6 2744 CLR R20
01D7 C00C RJMP 0x01E4
(0078) counter_buffer[i]=0; //清空缓冲区
01D8 E082 LDI R24,2
01D9 9F84 MUL R24,R20
01DA 01F0 MOVW R30,R0
01DB E880 LDI R24,0x80
01DC E090 LDI R25,0
01DD 0FE8 ADD R30,R24
01DE 1FF9 ADC R31,R25
01DF 2422 CLR R2
01E0 2433 CLR R3
01E1 8231 STD Z+1,R3
01E2 8220 STD Z+0,R2
01E3 9543 INC R20
01E4 344B CPI R20,0x4B
01E5 F390 BCS 0x01D8
(0079) rece_data_count=0; //接收数据计时清 0
01E6 2422 CLR R2
01E7 9220007E STS rece_data_count,R2
(0080) flag_start=0; //开始标志置0
01E9 9220007F STS flag_start,R2
(0081) TCCR1B=0; //关闭定时器 T1
01EB BC2E OUT 0x2E,R2
(0082) TCNT1=0; //定时器T1 清0
01EC 2433 CLR R3
01ED BC3D OUT 0x2D,R3
01EE BC2C OUT 0x2C,R2
(0083) TCCR0=0; //关闭定时器 T0
01EF BE23 OUT 0x33,R2
(0084) TCNT0=0; //定时器T0 清0
01F0 BE22 OUT 0x32,R2
(0085) flag_t0=0;
01F1 9220007C STS flag_t0,R2
(0086)
(0087) return;
01F3 C00B RJMP 0x01FF
(0088) }
(0089) else
(0090) //如果是有效数据
(0091) {
(0092)
(0093)
(0094) if(flag_t0==0)
01F4 9020007C LDS R2,flag_t0
01F6 2022 TST R2
01F7 F439 BNE 0x01FF
(0095) {
(0096) TCNT0=0; //定时器T0 清0
01F8 2422 CLR R2
01F9 BE22 OUT 0x32,R2
(0097) TCCR0=5; //T0 1024分频 开始计时100MS
01FA E085 LDI R24,5
01FB BF83 OUT 0x33,R24
(0098) flag_t0=1;
01FC E081 LDI R24,1
01FD 9380007C STS flag_t0,R24
(0099) }
(0100) }
(0101)
(0102)
(0103) }
01FF D139 RCALL pop_gset1
0200 9009 LD R0,Y+
0201 BE0F OUT 0x3F,R0
0202 91F9 LD R31,Y+
0203 91E9 LD R30,Y+
0204 9199 LD R25,Y+
0205 9189 LD R24,Y+
0206 9139 LD R19,Y+
0207 9129 LD R18,Y+
0208 9119 LD R17,Y+
0209 9109 LD R16,Y+
020A 9039 LD R3,Y+
020B 9029 LD R2,Y+
020C 9019 LD R1,Y+
020D 9009 LD R0,Y+
020E 9518 RETI
_t0_isr:
i --> R16
020F 920A ST R0,-Y
0210 921A ST R1,-Y
0211 922A ST R2,-Y
0212 923A ST R3,-Y
0213 930A ST R16,-Y
0214 931A ST R17,-Y
0215 938A ST R24,-Y
0216 939A ST R25,-Y
0217 93EA ST R30,-Y
0218 93FA ST R31,-Y
0219 B60F IN R0,0x3F
021A 920A ST R0,-Y
(0104)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -