infrared_measure.lis
来自「AVR 红外接收源代码,对学习红外的人很有帮助」· LIS 代码 · 共 222 行
LIS
222 行
.module infrared_measure.c
.area text(rom, con, rel)
0000 .dbfile E:\avr\开发板\source\INFRARED\infrared_measure\infrared_measure.c
0000 .dbfunc e init_infr _init_infr fV
0000 ; i -> R16
.even
0000 _init_infr::
0000 .dbline -1
0000 .dbline 25
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 ;
0000 ; #define INFR_DIR DDRD
0000 ; #define INFR_PORT PORTD
0000 ; #define INFR_DATA 3
0000 ; unsigned int counter_buffer[100];
0000 ; unsigned char flag_start,n;
0000 ;
0000 ; /* 初始化外部中断1 */
0000 ; void init_infr(void)
0000 ; {
0000 .dbline 27
0000 ; unsigned char i;
0000 ; INFR_DIR&=~(1<<INFR_DATA); //PD3为输入方向
0000 8B98 cbi 0x11,3
0002 .dbline 28
0002 ; INFR_PORT|=1<<INFR_DATA; //PD3初始为高电平
0002 939A sbi 0x12,3
0004 .dbline 29
0004 ; MCUCR = 0x04; //int1 电平变化产生中断
0004 84E0 ldi R24,4
0006 85BF out 0x35,R24
0008 .dbline 30
0008 ; GICR = 0x80; //int1 外部中断使能
0008 80E8 ldi R24,128
000A 8BBF out 0x3b,R24
000C .dbline 31
000C ; TCCR1B=0;//关闭定时器T1
000C 2224 clr R2
000E 2EBC out 0x2e,R2
0010 .dbline 32
0010 ; TCNT1=0; //初始值为0
0010 3324 clr R3
0012 3DBC out 0x2d,R3
0014 2CBC out 0x2c,R2
0016 .dbline 33
0016 ; flag_start=0;
0016 20920100 sts _flag_start,R2
001A .dbline 34
001A ; n=0;
001A 20920000 sts _n,R2
001E .dbline 35
001E ; for(i=0;i<100;i++)
001E 0027 clr R16
0020 0CC0 rjmp L5
0022 L2:
0022 .dbline 36
0022 82E0 ldi R24,2
0024 809F mul R24,R16
0026 F001 movw R30,R0
0028 80E0 ldi R24,<_counter_buffer
002A 90E0 ldi R25,>_counter_buffer
002C E80F add R30,R24
002E F91F adc R31,R25
0030 2224 clr R2
0032 3324 clr R3
0034 3182 std z+1,R3
0036 2082 std z+0,R2
0038 L3:
0038 .dbline 35
0038 0395 inc R16
003A L5:
003A .dbline 35
003A 0436 cpi R16,100
003C 90F3 brlo L2
003E .dbline 37
003E ; counter_buffer[i]=0;
003E ; SEI(); //全局中断使能
003E 7894 sei
0040 .dbline -2
0040 .dbline 39
0040 ;
0040 ; }
0040 L1:
0040 .dbline 0 ; func end
0040 0895 ret
0042 .dbsym r i 16 c
0042 .dbend
.area vector(rom, abs)
.org 4
0004 21C0 rjmp _int1_isr
.area text(rom, con, rel)
0042 .dbfile E:\avr\开发板\source\INFRARED\infrared_measure\infrared_measure.c
0042 .dbfunc e int1_isr _int1_isr fV
.even
0042 _int1_isr::
0042 2A92 st -y,R2
0044 3A92 st -y,R3
0046 0A93 st -y,R16
0048 1A93 st -y,R17
004A 2A93 st -y,R18
004C 3A93 st -y,R19
004E 8A93 st -y,R24
0050 9A93 st -y,R25
0052 EA93 st -y,R30
0054 FA93 st -y,R31
0056 2FB6 in R2,0x3f
0058 2A92 st -y,R2
005A .dbline -1
005A .dbline 44
005A ;
005A ; /*外部中断1 中断函数 */
005A ; #pragma interrupt_handler int1_isr:iv_INT1
005A ; void int1_isr(void)
005A ; {
005A .dbline 46
005A ;
005A ; if(flag_start==0)
005A 20900100 lds R2,_flag_start
005E 2220 tst R2
0060 31F4 brne L7
0062 .dbline 47
0062 ; {
0062 .dbline 48
0062 ; TCCR1B=2;//开始计时 8分频
0062 82E0 ldi R24,2
0064 8EBD out 0x2e,R24
0066 .dbline 49
0066 ; flag_start=1;
0066 81E0 ldi R24,1
0068 80930100 sts _flag_start,R24
006C .dbline 50
006C ; }
006C 1CC0 rjmp L8
006E L7:
006E .dbline 53
006E .dbline 54
006E 2224 clr R2
0070 2EBC out 0x2e,R2
0072 .dbline 55
0072 20900000 lds R2,_n
0076 3324 clr R3
0078 822D mov R24,R2
007A 8F5F subi R24,255 ; addi 1
007C 80930000 sts _n,R24
0080 02E0 ldi R16,2
0082 10E0 ldi R17,0
0084 9101 movw R18,R2
0086 00D0 rcall empy16s
0088 F801 movw R30,R16
008A 80E0 ldi R24,<_counter_buffer
008C 90E0 ldi R25,>_counter_buffer
008E E80F add R30,R24
0090 F91F adc R31,R25
0092 2CB4 in R2,0x2c
0094 3DB4 in R3,0x2d
0096 3182 std z+1,R3
0098 2082 std z+0,R2
009A .dbline 56
009A 2224 clr R2
009C 3324 clr R3
009E 3DBC out 0x2d,R3
00A0 2CBC out 0x2c,R2
00A2 .dbline 57
00A2 82E0 ldi R24,2
00A4 8EBD out 0x2e,R24
00A6 .dbline 58
00A6 L8:
00A6 .dbline -2
00A6 .dbline 61
00A6 ;
00A6 ; else
00A6 ; {
00A6 ; TCCR1B=0;
00A6 ; counter_buffer[n++]=TCNT1;
00A6 ; TCNT1=0;
00A6 ; TCCR1B=2;
00A6 ; }
00A6 ;
00A6 ;
00A6 ; }
00A6 L6:
00A6 2990 ld R2,y+
00A8 2FBE out 0x3f,R2
00AA F991 ld R31,y+
00AC E991 ld R30,y+
00AE 9991 ld R25,y+
00B0 8991 ld R24,y+
00B2 3991 ld R19,y+
00B4 2991 ld R18,y+
00B6 1991 ld R17,y+
00B8 0991 ld R16,y+
00BA 3990 ld R3,y+
00BC 2990 ld R2,y+
00BE .dbline 0 ; func end
00BE 1895 reti
00C0 .dbend
.area bss(ram, con, rel)
0000 .dbfile E:\avr\开发板\source\INFRARED\infrared_measure\infrared_measure.c
0000 _n::
0000 .blkb 1
0001 .dbsym e n _n c
0001 _flag_start::
0001 .blkb 1
0002 .dbsym e flag_start _flag_start c
0002 _counter_buffer::
0002 .blkb 200
00CA .dbsym e counter_buffer _counter_buffer A[200:100]i
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?