📄 infrared_test.lis
字号:
.module infrared_test.c
.area vector(rom, abs)
.org 4
0004 38C0 rjmp _int1_isr
.org 18
0012 B7C0 rjmp _t0_isr
.area text(rom, con, rel)
0000 .dbfile D:\开发板\source\infrared\infrared_test\infrared_test.c
0000 .dbfunc e init_infr _init_infr fV
0000 ; i -> R16
.even
0000 _init_infr::
0000 .dbline -1
0000 .dbline 30
0000 ; /******************************************/
0000 ; /* 北京MCU学习之家 */
0000 ; /* 红外输入演示程序 */
0000 ; /* 作者:白如冰 */
0000 ; /* 2005年10月1日 */
0000 ; /* 目标MCU:MEGA8 晶振:外部(EXT) 8MHZ */
0000 ; /******************************************/
0000 ; //红外接收头的引脚定义
0000 ; // 1----->data-----> (PD3(int1))
0000 ; // 2----->gnd
0000 ; // 3----->vss
0000 ; /******************************************/
0000 ;
0000 ; #include <iom8v.h>
0000 ; #include <macros.h>
0000 ; #pragma interrupt_handler int1_isr:iv_INT1
0000 ; #pragma interrupt_handler t0_isr:iv_TIMER0_OVF
0000 ;
0000 ; #define INFR_DIR DDRD
0000 ; #define INFR_PORT PORTD
0000 ; #define INFR_DATA 3
0000 ; #define buffer_max 75
0000 ; unsigned char infra_data[4],rece_flag;
0000 ; unsigned int counter_buffer[buffer_max];
0000 ; unsigned char flag_start,rece_data_count,t0_counter,flag_t0;
0000 ;
0000 ;
0000 ; /* 初始化外部中断1 */
0000 ; void init_infr(void)
0000 ; {
0000 .dbline 32
0000 ; unsigned char i;
0000 ; INFR_DIR&=~(1<<INFR_DATA); //PD3为输入方向
0000 8B98 cbi 0x11,3
0002 .dbline 33
0002 ; INFR_PORT|=1<<INFR_DATA; //PD3初始为高电平
0002 939A sbi 0x12,3
0004 .dbline 34
0004 ; MCUCR = 0x04; //int1 电平变化产生中断
0004 84E0 ldi R24,4
0006 85BF out 0x35,R24
0008 .dbline 35
0008 ; GICR = 0x80; //int1 外部中断使能
0008 80E8 ldi R24,128
000A 8BBF out 0x3b,R24
000C .dbline 36
000C ; TCCR0=0; //T0 1024分频
000C 2224 clr R2
000E 23BE out 0x33,R2
0010 .dbline 37
0010 ; TCNT0=0; //初始值为0 32ms中断一次,200ms许7次
0010 22BE out 0x32,R2
0012 .dbline 38
0012 ; TIMSK=1;//允许T0溢出中断
0012 81E0 ldi R24,1
0014 89BF out 0x39,R24
0016 .dbline 39
0016 ; TCCR1B=0;//关闭定时器T1
0016 2EBC out 0x2e,R2
0018 .dbline 40
0018 ; TCNT1=0; //初始值为0
0018 3324 clr R3
001A 3DBC out 0x2d,R3
001C 2CBC out 0x2c,R2
001E .dbline 41
001E ; flag_start=0;
001E 20920300 sts _flag_start,R2
0022 .dbline 42
0022 ; rece_data_count=0;
0022 20920200 sts _rece_data_count,R2
0026 .dbline 43
0026 ; t0_counter=0;
0026 20920100 sts _t0_counter,R2
002A .dbline 44
002A ; for(i=0;i<buffer_max;i++)
002A 0027 clr R16
002C 0CC0 rjmp L5
002E L2:
002E .dbline 45
002E 82E0 ldi R24,2
0030 809F mul R24,R16
0032 F001 movw R30,R0
0034 80E0 ldi R24,<_counter_buffer
0036 90E0 ldi R25,>_counter_buffer
0038 E80F add R30,R24
003A F91F adc R31,R25
003C 2224 clr R2
003E 3324 clr R3
0040 3182 std z+1,R3
0042 2082 std z+0,R2
0044 L3:
0044 .dbline 44
0044 0395 inc R16
0046 L5:
0046 .dbline 44
0046 0B34 cpi R16,75
0048 90F3 brlo L2
004A .dbline 46
004A ; counter_buffer[i]=0;
004A ; infra_data[0]=0x31;
004A 81E3 ldi R24,49
004C 80939B00 sts _infra_data,R24
0050 .dbline 47
0050 ; infra_data[1]=0x32;
0050 82E3 ldi R24,50
0052 80939C00 sts _infra_data+1,R24
0056 .dbline 48
0056 ; infra_data[2]=0x33;
0056 83E3 ldi R24,51
0058 80939D00 sts _infra_data+2,R24
005C .dbline 49
005C ; infra_data[3]=0x34;
005C 84E3 ldi R24,52
005E 80939E00 sts _infra_data+3,R24
0062 .dbline 50
0062 ; rece_flag=0;
0062 2224 clr R2
0064 20929A00 sts _rece_flag,R2
0068 .dbline 51
0068 ; flag_t0=0;
0068 20920000 sts _flag_t0,R2
006C .dbline 52
006C ; SEI(); //全局中断使能
006C 7894 sei
006E .dbline -2
006E L1:
006E .dbline 0 ; func end
006E 0895 ret
0070 .dbsym r i 16 c
0070 .dbend
0070 .dbfunc e int1_isr _int1_isr fV
0070 ; i -> R20
.even
0070 _int1_isr::
0070 0A92 st -y,R0
0072 1A92 st -y,R1
0074 2A92 st -y,R2
0076 3A92 st -y,R3
0078 0A93 st -y,R16
007A 1A93 st -y,R17
007C 2A93 st -y,R18
007E 3A93 st -y,R19
0080 8A93 st -y,R24
0082 9A93 st -y,R25
0084 EA93 st -y,R30
0086 FA93 st -y,R31
0088 0FB6 in R0,0x3f
008A 0A92 st -y,R0
008C 00D0 rcall push_gset1
008E .dbline -1
008E .dbline 59
008E ;
008E ; }
008E ;
008E ; /*外部中断1 中断函数 */
008E ;
008E ; void int1_isr(void)
008E ; {
008E .dbline 62
008E ; unsigned char i;
008E ;
008E ; if(flag_start==0) //开始计时T1
008E 20900300 lds R2,_flag_start
0092 2220 tst R2
0094 31F4 brne L10
0096 .dbline 63
0096 ; {
0096 .dbline 64
0096 ; TCCR1B=2;//开始计时 8分频
0096 82E0 ldi R24,2
0098 8EBD out 0x2e,R24
009A .dbline 65
009A ; flag_start=1;
009A 81E0 ldi R24,1
009C 80930300 sts _flag_start,R24
00A0 .dbline 66
00A0 ; }
00A0 56C0 rjmp L11
00A2 L10:
00A2 .dbline 69
00A2 ;
00A2 ; else
00A2 ; {
00A2 .dbline 71
00A2 ;
00A2 ; TCCR1B=0;
00A2 2224 clr R2
00A4 2EBC out 0x2e,R2
00A6 .dbline 72
00A6 ; counter_buffer[rece_data_count++]=TCNT1;
00A6 20900200 lds R2,_rece_data_count
00AA 3324 clr R3
00AC 822D mov R24,R2
00AE 8F5F subi R24,255 ; addi 1
00B0 80930200 sts _rece_data_count,R24
00B4 02E0 ldi R16,2
00B6 10E0 ldi R17,0
00B8 9101 movw R18,R2
00BA 00D0 rcall empy16s
00BC F801 movw R30,R16
00BE 80E0 ldi R24,<_counter_buffer
00C0 90E0 ldi R25,>_counter_buffer
00C2 E80F add R30,R24
00C4 F91F adc R31,R25
00C6 2CB4 in R2,0x2c
00C8 3DB4 in R3,0x2d
00CA 3182 std z+1,R3
00CC 2082 std z+0,R2
00CE .dbline 73
00CE ; TCNT1=0;
00CE 2224 clr R2
00D0 3324 clr R3
00D2 3DBC out 0x2d,R3
00D4 2CBC out 0x2c,R2
00D6 .dbline 74
00D6 ; TCCR1B=2; //T0 8分频 开始计时
00D6 82E0 ldi R24,2
00D8 8EBD out 0x2e,R24
00DA .dbline 75
00DA ; if((counter_buffer[0]<4000)&&(counter_buffer[1]>5000)) //如果第一个数据不是有效数据退出
00DA 80910400 lds R24,_counter_buffer
00DE 90910500 lds R25,_counter_buffer+1
00E2 803A cpi R24,160
00E4 EFE0 ldi R30,15
00E6 9E07 cpc R25,R30
00E8 38F5 brsh L12
00EA 88E8 ldi R24,5000
00EC 93E1 ldi R25,19
00EE 20900600 lds R2,_counter_buffer+2
00F2 30900700 lds R3,_counter_buffer+2+1
00F6 8215 cp R24,R2
00F8 9305 cpc R25,R3
00FA F0F4 brsh L12
00FC .dbline 76
00FC ; {
00FC .dbline 77
00FC ; for(i=0;i<buffer_max;i++)
00FC 4427 clr R20
00FE 0CC0 rjmp L18
0100 L15:
0100 .dbline 78
0100 82E0 ldi R24,2
0102 849F mul R24,R20
0104 F001 movw R30,R0
0106 80E0 ldi R24,<_counter_buffer
0108 90E0 ldi R25,>_counter_buffer
010A E80F add R30,R24
010C F91F adc R31,R25
010E 2224 clr R2
0110 3324 clr R3
0112 3182 std z+1,R3
0114 2082 std z+0,R2
0116 L16:
0116 .dbline 77
0116 4395 inc R20
0118 L18:
0118 .dbline 77
0118 4B34 cpi R20,75
011A 90F3 brlo L15
011C .dbline 79
011C ; counter_buffer[i]=0; //清空缓冲区
011C ; rece_data_count=0; //接收数据计时清 0
011C 2224 clr R2
011E 20920200 sts _rece_data_count,R2
0122 .dbline 80
0122 ; flag_start=0; //开始标志置0
0122 20920300 sts _flag_start,R2
0126 .dbline 81
0126 ; TCCR1B=0; //关闭定时器 T1
0126 2EBC out 0x2e,R2
0128 .dbline 82
0128 ; TCNT1=0; //定时器T1 清0
0128 3324 clr R3
012A 3DBC out 0x2d,R3
012C 2CBC out 0x2c,R2
012E .dbline 83
012E ; TCCR0=0; //关闭定时器 T0
012E 23BE out 0x33,R2
0130 .dbline 84
0130 ; TCNT0=0; //定时器T0 清0
0130 22BE out 0x32,R2
0132 .dbline 85
0132 ; flag_t0=0;
0132 20920000 sts _flag_t0,R2
0136 .dbline 87
0136 ;
0136 ; return;
0136 0BC0 rjmp L9
0138 L12:
0138 .dbline 91
0138 ; }
0138 ; else
0138 ; //如果是有效数据
0138 ; {
0138 .dbline 94
0138 ;
0138 ;
0138 ; if(flag_t0==0)
0138 20900000 lds R2,_flag_t0
013C 2220 tst R2
013E 39F4 brne L19
0140 .dbline 95
0140 ; {
0140 .dbline 96
0140 ; TCNT0=0; //定时器T0 清0
0140 2224 clr R2
0142 22BE out 0x32,R2
0144 .dbline 97
0144 ; TCCR0=5; //T0 1024分频 开始计时100MS
0144 85E0 ldi R24,5
0146 83BF out 0x33,R24
0148 .dbline 98
0148 ; flag_t0=1;
0148 81E0 ldi R24,1
014A 80930000 sts _flag_t0,R24
014E .dbline 99
014E ; }
014E L19:
014E .dbline 100
014E .dbline 103
014E L11:
014E .dbline -2
014E L9:
014E 00D0 rcall pop_gset1
0150 0990 ld R0,y+
0152 0FBE out 0x3f,R0
0154 F991 ld R31,y+
0156 E991 ld R30,y+
0158 9991 ld R25,y+
015A 8991 ld R24,y+
015C 3991 ld R19,y+
015E 2991 ld R18,y+
0160 1991 ld R17,y+
0162 0991 ld R16,y+
0164 3990 ld R3,y+
0166 2990 ld R2,y+
0168 1990 ld R1,y+
016A 0990 ld R0,y+
016C .dbline 0 ; func end
016C 1895 reti
016E .dbsym r i 20 c
016E .dbend
016E .dbfunc e t0_isr _t0_isr fV
016E ; i -> R16
.even
016E _t0_isr::
016E 0A92 st -y,R0
0170 1A92 st -y,R1
0172 2A92 st -y,R2
0174 3A92 st -y,R3
0176 0A93 st -y,R16
0178 1A93 st -y,R17
017A 8A93 st -y,R24
017C 9A93 st -y,R25
017E EA93 st -y,R30
0180 FA93 st -y,R31
0182 0FB6 in R0,0x3f
0184 0A92 st -y,R0
0186 .dbline -1
0186 .dbline 111
0186 ; }
0186 ;
0186 ;
0186 ; }
0186 ;
0186 ;
0186 ; }
0186 ;
0186 ; /*定时器T0 中断函数 */
0186 ;
0186 ; void t0_isr(void)
0186 ; {
0186 .dbline 114
0186 ; unsigned char i;
0186 ;
0186 ; TCNT0=0;
0186 2224 clr R2
0188 22BE out 0x32,R2
018A .dbline 115
018A ; t0_counter++;
018A 80910100 lds R24,_t0_counter
018E 8F5F subi R24,255 ; addi 1
0190 80930100 sts _t0_counter,R24
0194 .dbline 116
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -