📄 infrared_test.s
字号:
.module infrared_test.c
.area vector(rom, abs)
.org 4
rjmp _int1_isr
.org 18
rjmp _t0_isr
.area text(rom, con, rel)
.dbfile D:\开发板\source\infrared\infrared_test\infrared_test.c
.dbfunc e init_infr _init_infr fV
; i -> R16
.even
_init_infr::
.dbline -1
.dbline 30
; /******************************************/
; /* 北京MCU学习之家 */
; /* 红外输入演示程序 */
; /* 作者:白如冰 */
; /* 2005年10月1日 */
; /* 目标MCU:MEGA8 晶振:外部(EXT) 8MHZ */
; /******************************************/
; //红外接收头的引脚定义
; // 1----->data-----> (PD3(int1))
; // 2----->gnd
; // 3----->vss
; /******************************************/
;
; #include <iom8v.h>
; #include <macros.h>
; #pragma interrupt_handler int1_isr:iv_INT1
; #pragma interrupt_handler t0_isr:iv_TIMER0_OVF
;
; #define INFR_DIR DDRD
; #define INFR_PORT PORTD
; #define INFR_DATA 3
; #define buffer_max 75
; unsigned char infra_data[4],rece_flag;
; unsigned int counter_buffer[buffer_max];
; unsigned char flag_start,rece_data_count,t0_counter,flag_t0;
;
;
; /* 初始化外部中断1 */
; void init_infr(void)
; {
.dbline 32
; unsigned char i;
; INFR_DIR&=~(1<<INFR_DATA); //PD3为输入方向
cbi 0x11,3
.dbline 33
; INFR_PORT|=1<<INFR_DATA; //PD3初始为高电平
sbi 0x12,3
.dbline 34
; MCUCR = 0x04; //int1 电平变化产生中断
ldi R24,4
out 0x35,R24
.dbline 35
; GICR = 0x80; //int1 外部中断使能
ldi R24,128
out 0x3b,R24
.dbline 36
; TCCR0=0; //T0 1024分频
clr R2
out 0x33,R2
.dbline 37
; TCNT0=0; //初始值为0 32ms中断一次,200ms许7次
out 0x32,R2
.dbline 38
; TIMSK=1;//允许T0溢出中断
ldi R24,1
out 0x39,R24
.dbline 39
; TCCR1B=0;//关闭定时器T1
out 0x2e,R2
.dbline 40
; TCNT1=0; //初始值为0
clr R3
out 0x2d,R3
out 0x2c,R2
.dbline 41
; flag_start=0;
sts _flag_start,R2
.dbline 42
; rece_data_count=0;
sts _rece_data_count,R2
.dbline 43
; t0_counter=0;
sts _t0_counter,R2
.dbline 44
; for(i=0;i<buffer_max;i++)
clr R16
rjmp L5
L2:
.dbline 45
ldi R24,2
mul R24,R16
movw R30,R0
ldi R24,<_counter_buffer
ldi R25,>_counter_buffer
add R30,R24
adc R31,R25
clr R2
clr R3
std z+1,R3
std z+0,R2
L3:
.dbline 44
inc R16
L5:
.dbline 44
cpi R16,75
brlo L2
.dbline 46
; counter_buffer[i]=0;
; infra_data[0]=0x31;
ldi R24,49
sts _infra_data,R24
.dbline 47
; infra_data[1]=0x32;
ldi R24,50
sts _infra_data+1,R24
.dbline 48
; infra_data[2]=0x33;
ldi R24,51
sts _infra_data+2,R24
.dbline 49
; infra_data[3]=0x34;
ldi R24,52
sts _infra_data+3,R24
.dbline 50
; rece_flag=0;
clr R2
sts _rece_flag,R2
.dbline 51
; flag_t0=0;
sts _flag_t0,R2
.dbline 52
; SEI(); //全局中断使能
sei
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbsym r i 16 c
.dbend
.dbfunc e int1_isr _int1_isr fV
; i -> R20
.even
_int1_isr::
st -y,R0
st -y,R1
st -y,R2
st -y,R3
st -y,R16
st -y,R17
st -y,R18
st -y,R19
st -y,R24
st -y,R25
st -y,R30
st -y,R31
in R0,0x3f
st -y,R0
rcall push_gset1
.dbline -1
.dbline 59
;
; }
;
; /*外部中断1 中断函数 */
;
; void int1_isr(void)
; {
.dbline 62
; unsigned char i;
;
; if(flag_start==0) //开始计时T1
lds R2,_flag_start
tst R2
brne L10
.dbline 63
; {
.dbline 64
; TCCR1B=2;//开始计时 8分频
ldi R24,2
out 0x2e,R24
.dbline 65
; flag_start=1;
ldi R24,1
sts _flag_start,R24
.dbline 66
; }
rjmp L11
L10:
.dbline 69
;
; else
; {
.dbline 71
;
; TCCR1B=0;
clr R2
out 0x2e,R2
.dbline 72
; counter_buffer[rece_data_count++]=TCNT1;
lds R2,_rece_data_count
clr R3
mov R24,R2
subi R24,255 ; addi 1
sts _rece_data_count,R24
ldi R16,2
ldi R17,0
movw R18,R2
rcall empy16s
movw R30,R16
ldi R24,<_counter_buffer
ldi R25,>_counter_buffer
add R30,R24
adc R31,R25
in R2,0x2c
in R3,0x2d
std z+1,R3
std z+0,R2
.dbline 73
; TCNT1=0;
clr R2
clr R3
out 0x2d,R3
out 0x2c,R2
.dbline 74
; TCCR1B=2; //T0 8分频 开始计时
ldi R24,2
out 0x2e,R24
.dbline 75
; if((counter_buffer[0]<4000)&&(counter_buffer[1]>5000)) //如果第一个数据不是有效数据退出
lds R24,_counter_buffer
lds R25,_counter_buffer+1
cpi R24,160
ldi R30,15
cpc R25,R30
brsh L12
ldi R24,5000
ldi R25,19
lds R2,_counter_buffer+2
lds R3,_counter_buffer+2+1
cp R24,R2
cpc R25,R3
brsh L12
.dbline 76
; {
.dbline 77
; for(i=0;i<buffer_max;i++)
clr R20
rjmp L18
L15:
.dbline 78
ldi R24,2
mul R24,R20
movw R30,R0
ldi R24,<_counter_buffer
ldi R25,>_counter_buffer
add R30,R24
adc R31,R25
clr R2
clr R3
std z+1,R3
std z+0,R2
L16:
.dbline 77
inc R20
L18:
.dbline 77
cpi R20,75
brlo L15
.dbline 79
; counter_buffer[i]=0; //清空缓冲区
; rece_data_count=0; //接收数据计时清 0
clr R2
sts _rece_data_count,R2
.dbline 80
; flag_start=0; //开始标志置0
sts _flag_start,R2
.dbline 81
; TCCR1B=0; //关闭定时器 T1
out 0x2e,R2
.dbline 82
; TCNT1=0; //定时器T1 清0
clr R3
out 0x2d,R3
out 0x2c,R2
.dbline 83
; TCCR0=0; //关闭定时器 T0
out 0x33,R2
.dbline 84
; TCNT0=0; //定时器T0 清0
out 0x32,R2
.dbline 85
; flag_t0=0;
sts _flag_t0,R2
.dbline 87
;
; return;
rjmp L9
L12:
.dbline 91
; }
; else
; //如果是有效数据
; {
.dbline 94
;
;
; if(flag_t0==0)
lds R2,_flag_t0
tst R2
brne L19
.dbline 95
; {
.dbline 96
; TCNT0=0; //定时器T0 清0
clr R2
out 0x32,R2
.dbline 97
; TCCR0=5; //T0 1024分频 开始计时100MS
ldi R24,5
out 0x33,R24
.dbline 98
; flag_t0=1;
ldi R24,1
sts _flag_t0,R24
.dbline 99
; }
L19:
.dbline 100
.dbline 103
L11:
.dbline -2
L9:
rcall pop_gset1
ld R0,y+
out 0x3f,R0
ld R31,y+
ld R30,y+
ld R25,y+
ld R24,y+
ld R19,y+
ld R18,y+
ld R17,y+
ld R16,y+
ld R3,y+
ld R2,y+
ld R1,y+
ld R0,y+
.dbline 0 ; func end
reti
.dbsym r i 20 c
.dbend
.dbfunc e t0_isr _t0_isr fV
; i -> R16
.even
_t0_isr::
st -y,R0
st -y,R1
st -y,R2
st -y,R3
st -y,R16
st -y,R17
st -y,R24
st -y,R25
st -y,R30
st -y,R31
in R0,0x3f
st -y,R0
.dbline -1
.dbline 111
; }
;
;
; }
;
;
; }
;
; /*定时器T0 中断函数 */
;
; void t0_isr(void)
; {
.dbline 114
; unsigned char i;
;
; TCNT0=0;
clr R2
out 0x32,R2
.dbline 115
; t0_counter++;
lds R24,_t0_counter
subi R24,255 ; addi 1
sts _t0_counter,R24
.dbline 116
; if(t0_counter>3)
ldi R24,3
lds R2,_t0_counter
cp R24,R2
brlo X0
rjmp L22
X0:
.dbline 117
; {
.dbline 119
;
; GICR = 0x00; //关掉外部中断1
clr R2
out 0x3b,R2
.dbline 120
; TCCR0=0; //关掉T0
out 0x33,R2
.dbline 121
; TCNT0=0;
out 0x32,R2
.dbline 122
; TCCR1B=0; //关闭定时器 T1
out 0x2e,R2
.dbline 123
; TCNT1=0; //定时器T1 清0
clr R3
out 0x2d,R3
out 0x2c,R2
.dbline 125
;
; t0_counter=0;
sts _t0_counter,R2
.dbline 127
;
; if((counter_buffer[1]>4000)&&(counter_buffer[1]<5000)&&
ldi R24,4000
ldi R25,15
lds R2,_counter_buffer+2
lds R3,_counter_buffer+2+1
cp R24,R2
cpc R25,R3
brlo X1
rjmp L24
X1:
movw R24,R2
cpi R24,136
ldi R30,19
cpc R25,R30
brlo X2
rjmp L24
X2:
ldi R24,400
ldi R25,1
lds R2,_counter_buffer+132
lds R3,_counter_buffer+132+1
cp R24,R2
cpc R25,R3
brlo X3
rjmp L24
X3:
movw R24,R2
cpi R24,188
ldi R30,2
cpc R25,R30
brlo X4
rjmp L24
X4:
.dbline 129
; (counter_buffer[66]>400)&&(counter_buffer[66]<700))
; {
.dbline 131
; //如果是有效数据
; rece_flag=1;
ldi R24,1
sts _rece_flag,R24
.dbline 132
; for(i=3;i<66;i+=2)
ldi R16,3
rjmp L33
L30:
.dbline 133
; {
.dbline 134
; if(counter_buffer[i]>800)
ldi R24,2
mul R24,R16
movw R30,R0
ldi R24,<_counter_buffer
ldi R25,>_counter_buffer
add R30,R24
adc R31,R25
ldd R2,z+0
ldd R3,z+1
ldi R24,800
ldi R25,3
cp R24,R2
cpc R25,R3
brsh L34
.dbline 135
; {
.dbline 136
; if(i<18)
cpi R16,18
brsh L36
.dbline 137
; {
.dbline 138
; infra_data[0]>>=1;
lds R2,_infra_data
lsr R2
sts _infra_data,R2
.dbline 139
; infra_data[0]|=0x80;
mov R24,R2
ori R24,128
sts _infra_data,R24
.dbline 140
; }
rjmp L35
L36:
.dbline 141
; else if(i<34)
cpi R16,34
brsh L38
.dbline 142
; {
.dbline 143
; infra_data[1]>>=1;
lds R2,_infra_data+1
lsr R2
sts _infra_data+1,R2
.dbline 144
; infra_data[1]|=0x80;
mov R24,R2
ori R24,128
sts _infra_data+1,R24
.dbline 145
; }
rjmp L35
L38:
.dbline 146
; else if(i<50)
cpi R16,50
brsh L42
.dbline 147
; {
.dbline 148
; infra_data[2]>>=1;
lds R2,_infra_data+2
lsr R2
sts _infra_data+2,R2
.dbline 149
; infra_data[2]|=0x80;
mov R24,R2
ori R24,128
sts _infra_data+2,R24
.dbline 150
; }
rjmp L35
L42:
.dbline 151
; else if(i<66)
cpi R16,66
brsh L35
.dbline 152
; {
.dbline 153
; infra_data[3]>>=1;
lds R2,_infra_data+3
lsr R2
sts _infra_data+3,R2
.dbline 154
; infra_data[3]|=0x80;
mov R24,R2
ori R24,128
sts _infra_data+3,R24
.dbline 155
; }
.dbline 156
; }
rjmp L35
L34:
.dbline 158
; else
; {
.dbline 159
; if(i<18)
cpi R16,18
brsh L50
.dbline 160
; {
.dbline 161
; infra_data[0]>>=1;
lds R2,_infra_data
lsr R2
sts _infra_data,R2
.dbline 162
; }
rjmp L51
L50:
.dbline 163
; else if(i<34)
cpi R16,34
brsh L52
.dbline 164
; {
.dbline 165
; infra_data[1]>>=1;
lds R2,_infra_data+1
lsr R2
sts _infra_data+1,R2
.dbline 166
; }
rjmp L53
L52:
.dbline 167
; else if(i<50)
cpi R16,50
brsh L55
.dbline 168
; {
.dbline 169
; infra_data[2]>>=1;
lds R2,_infra_data+2
lsr R2
sts _infra_data+2,R2
.dbline 170
; }
rjmp L56
L55:
.dbline 171
; else if(i<66)
cpi R16,66
brsh L58
.dbline 172
; {
.dbline 173
; infra_data[3]>>=1;
lds R2,_infra_data+3
lsr R2
sts _infra_data+3,R2
.dbline 174
; }
L58:
L56:
L53:
L51:
.dbline 175
; }
L35:
.dbline 176
L31:
.dbline 132
subi R16,254 ; addi 2
L33:
.dbline 132
cpi R16,66
brsh X5
rjmp L30
X5:
.dbline 177
; }
; for(i=0;i<buffer_max;i++)
clr R16
rjmp L64
L61:
.dbline 178
ldi R24,2
mul R24,R16
movw R30,R0
ldi R24,<_counter_buffer
ldi R25,>_counter_buffer
add R30,R24
adc R31,R25
clr R2
clr R3
std z+1,R3
std z+0,R2
L62:
.dbline 177
inc R16
L64:
.dbline 177
cpi R16,75
brlo L61
.dbline 179
; counter_buffer[i]=0;
; rece_data_count=0;
clr R2
sts _rece_data_count,R2
.dbline 180
; flag_start=0;
sts _flag_start,R2
.dbline 181
; TCCR1B=0;
out 0x2e,R2
.dbline 182
; TCNT1=0;
clr R3
out 0x2d,R3
out 0x2c,R2
.dbline 183
; flag_t0=0;
sts _flag_t0,R2
.dbline 184
; return;
rjmp L21
L24:
.dbline 190
;
; }
;
; //如果不是有效数据
;
; for(i=0;i<buffer_max;i++)
clr R16
rjmp L68
L65:
.dbline 191
ldi R24,2
mul R24,R16
movw R30,R0
ldi R24,<_counter_buffer
ldi R25,>_counter_buffer
add R30,R24
adc R31,R25
clr R2
clr R3
std z+1,R3
std z+0,R2
L66:
.dbline 190
inc R16
L68:
.dbline 190
cpi R16,75
brlo L65
.dbline 192
clr R2
sts _rece_data_count,R2
.dbline 193
sts _flag_start,R2
.dbline 194
out 0x2e,R2
.dbline 195
clr R3
out 0x2d,R3
out 0x2c,R2
.dbline 196
sts _flag_t0,R2
.dbline 197
ldi R24,128
out 0x3b,R24
.dbline 199
L22:
.dbline -2
L21:
ld R0,y+
out 0x3f,R0
ld R31,y+
ld R30,y+
ld R25,y+
ld R24,y+
ld R17,y+
ld R16,y+
ld R3,y+
ld R2,y+
ld R1,y+
ld R0,y+
.dbline 0 ; func end
reti
.dbsym r i 16 c
.dbend
.area bss(ram, con, rel)
.dbfile D:\开发板\source\infrared\infrared_test\infrared_test.c
_flag_t0::
.blkb 1
.dbsym e flag_t0 _flag_t0 c
_t0_counter::
.blkb 1
.dbsym e t0_counter _t0_counter c
_rece_data_count::
.blkb 1
.dbsym e rece_data_count _rece_data_count c
_flag_start::
.blkb 1
.dbsym e flag_start _flag_start c
_counter_buffer::
.blkb 150
.dbsym e counter_buffer _counter_buffer A[150:75]i
_rece_flag::
.blkb 1
.dbsym e rece_flag _rece_flag c
_infra_data::
.blkb 4
.dbsym e infra_data _infra_data A[4:4]c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -