📄 infrared_measure.s
字号:
.module infrared_measure.c
.area text(rom, con, rel)
.dbfile E:\avr\开发板\source\INFRARED\infrared_measure\infrared_measure.c
.dbfunc e init_infr _init_infr fV
; i -> R16
.even
_init_infr::
.dbline -1
.dbline 25
; /******************************************/
; /* 北京MCU学习之家 */
; /* 采集红外输入数据的高低电平保持时间程序 */
; /* 作者:白如冰 */
; /* 2005年10月1日 */
; /* 目标MCU:MEGA8 晶振:外部(EXT) 8MHZ */
; /******************************************/
; //红外接收头的引脚定义
; // 1----->data-----> (PD3(int1))
; // 2----->gnd
; // 3----->vss
; /******************************************/
;
; #include <iom8v.h>
; #include <macros.h>
;
; #define INFR_DIR DDRD
; #define INFR_PORT PORTD
; #define INFR_DATA 3
; unsigned int counter_buffer[100];
; unsigned char flag_start,n;
;
; /* 初始化外部中断1 */
; void init_infr(void)
; {
.dbline 27
; unsigned char i;
; INFR_DIR&=~(1<<INFR_DATA); //PD3为输入方向
cbi 0x11,3
.dbline 28
; INFR_PORT|=1<<INFR_DATA; //PD3初始为高电平
sbi 0x12,3
.dbline 29
; MCUCR = 0x04; //int1 电平变化产生中断
ldi R24,4
out 0x35,R24
.dbline 30
; GICR = 0x80; //int1 外部中断使能
ldi R24,128
out 0x3b,R24
.dbline 31
; TCCR1B=0;//关闭定时器T1
clr R2
out 0x2e,R2
.dbline 32
; TCNT1=0; //初始值为0
clr R3
out 0x2d,R3
out 0x2c,R2
.dbline 33
; flag_start=0;
sts _flag_start,R2
.dbline 34
; n=0;
sts _n,R2
.dbline 35
; for(i=0;i<100;i++)
clr R16
rjmp L5
L2:
.dbline 36
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 35
inc R16
L5:
.dbline 35
cpi R16,100
brlo L2
.dbline 37
; counter_buffer[i]=0;
; SEI(); //全局中断使能
sei
.dbline -2
.dbline 39
;
; }
L1:
.dbline 0 ; func end
ret
.dbsym r i 16 c
.dbend
.area vector(rom, abs)
.org 4
rjmp _int1_isr
.area text(rom, con, rel)
.dbfile E:\avr\开发板\source\INFRARED\infrared_measure\infrared_measure.c
.dbfunc e int1_isr _int1_isr fV
.even
_int1_isr::
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 R2,0x3f
st -y,R2
.dbline -1
.dbline 44
;
; /*外部中断1 中断函数 */
; #pragma interrupt_handler int1_isr:iv_INT1
; void int1_isr(void)
; {
.dbline 46
;
; if(flag_start==0)
lds R2,_flag_start
tst R2
brne L7
.dbline 47
; {
.dbline 48
; TCCR1B=2;//开始计时 8分频
ldi R24,2
out 0x2e,R24
.dbline 49
; flag_start=1;
ldi R24,1
sts _flag_start,R24
.dbline 50
; }
rjmp L8
L7:
.dbline 53
.dbline 54
clr R2
out 0x2e,R2
.dbline 55
lds R2,_n
clr R3
mov R24,R2
subi R24,255 ; addi 1
sts _n,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 56
clr R2
clr R3
out 0x2d,R3
out 0x2c,R2
.dbline 57
ldi R24,2
out 0x2e,R24
.dbline 58
L8:
.dbline -2
.dbline 61
;
; else
; {
; TCCR1B=0;
; counter_buffer[n++]=TCNT1;
; TCNT1=0;
; TCCR1B=2;
; }
;
;
; }
L6:
ld R2,y+
out 0x3f,R2
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+
.dbline 0 ; func end
reti
.dbend
.area bss(ram, con, rel)
.dbfile E:\avr\开发板\source\INFRARED\infrared_measure\infrared_measure.c
_n::
.blkb 1
.dbsym e n _n c
_flag_start::
.blkb 1
.dbsym e flag_start _flag_start c
_counter_buffer::
.blkb 200
.dbsym e counter_buffer _counter_buffer A[200:100]i
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -