⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 irr.lis

📁 16个单片机c语言实验程序
💻 LIS
📖 第 1 页 / 共 4 页
字号:
                        .module irr.c
                        .area text(rom, con, rel)
 0000                   .dbfile ..\..\..\..\..\DOCUME~1\wdd\MYDOCU~1\16实验程序\红外接收\irr.c
 0000                   .dbfile C:\DOCUME~1\wdd\MYDOCU~1\16实验程序\红外接收\1602.h
 0000                   .dbfunc e s_ms _s_ms fV
 0000           ;             ms -> R16,R17
                        .even
 0000           _s_ms::
 0000                   .dbline -1
 0000                   .dbline 9
 0000           ; //Atmega16的红外遥控器接收试验
 0000           ; //使用1602液晶进行显示,
 0000           ; #include<iom16v.h>
 0000           ; #include"1602.h"
 0000           ; #pragma interrupt_handler ext_int0_isr:2  //指定外部中断函数
 0000           ; #define uchar unsigned char 
 0000           ; #define uint unsigned int 
 0000           ; 
 0000           ; uchar irr_b=0,s_s=0;
 0000                   .dbline 10
 0000           ; uchar wb=0,a=0,ds=0;
 0000 02C0              xjmp L5
 0002           L2:
 0002                   .dbline 10
 0002           L3:
 0002                   .dbline 10
 0002 0150              subi R16,1
 0004 1040              sbci R17,0
 0006           L5:
 0006                   .dbline 10
 0006 81E0              ldi R24,1
 0008 90E0              ldi R25,0
 000A 8017              cp R24,R16
 000C 9107              cpc R25,R17
 000E C8F3              brlo L2
 0010           X0:
 0010                   .dbline -2
 0010           L1:
 0010                   .dbline 0 ; func end
 0010 0895              ret
 0012                   .dbsym r ms 16 i
 0012                   .dbend
 0012                   .dbfunc e busy _busy fV
 0012           ;           temp -> R20
                        .even
 0012           _busy::
 0012 4A93              st -y,R20
 0014                   .dbline -1
 0014                   .dbline 15
 0014           ; long da=0;
 0014           ; uchar d1,d2,d3,d4;
 0014           ; uchar ten_1,ten_2,ten_3,ten_4,i;
 0014           ; 
 0014           ; //中断接收
 0014                   .dbline 17
 0014           ; void ext_int0_isr(void)
 0014           ; {
 0014 04EF              ldi R16,500
 0016 11E0              ldi R17,1
 0018 F3DF              xcall _s_ms
 001A                   .dbline 18
 001A           ; if(irr_b==0)        //第一个中断
 001A DD98              cbi 0x1b,5
 001C                   .dbline 19
 001C           ;   {
 001C 04EF              ldi R16,500
 001E 11E0              ldi R17,1
 0020 EFDF              xcall _s_ms
 0022                   .dbline 20
 0022           ;   irr_b=1;          //状态为:开始接收
 0022 DE9A              sbi 0x1b,6
 0024                   .dbline 21
 0024           ;   TCNT1L=0x00;      //定时器清零
 0024 04EF              ldi R16,500
 0026 11E0              ldi R17,1
 0028 EBDF              xcall _s_ms
 002A 1AC0              xjmp L8
 002C           L7:
 002C                   .dbline 23
 002C           ;   }
 002C           ; else if(irr_b==1)   //第二个以后的中断
 002C                   .dbline 24
 002C           ;   {
 002C DF9A              sbi 0x1b,7
 002E                   .dbline 25
 002E           ;    a=TCNT1L;        //读取定时器的值
 002E 04EF              ldi R16,500
 0030 11E0              ldi R17,1
 0032 E6DF              xcall _s_ms
 0034                   .dbline 26
 0034           ;    //判断是引导,还是数据
 0034 2224              clr R2
 0036 21BA              out 0x11,R2
 0038                   .dbline 27
 0038           ;    if((170<a)&&(a<235))       //引导
 0038 8FEF              ldi R24,255
 003A 82BB              out 0x12,R24
 003C                   .dbline 28
 003C           ;      {
 003C 04EF              ldi R16,500
 003E 11E0              ldi R17,1
 0040 DFDF              xcall _s_ms
 0042                   .dbline 29
 0042           ;       wb=0;                   //数据计数清零     
 0042 40B3              in R20,0x10
 0044 4078              andi R20,128
 0046                   .dbline 30
 0046           ;         da=0;                   //数据清零
 0046 04EF              ldi R16,500
 0048 11E0              ldi R17,1
 004A DADF              xcall _s_ms
 004C                   .dbline 31
 004C           ;         TCNT1L=0x00;            //定时器清零 
 004C 8FEF              ldi R24,255
 004E 81BB              out 0x11,R24
 0050                   .dbline 32
 0050           ;         }
 0050 82BB              out 0x12,R24
 0052                   .dbline 33
 0052           ;    else if((8<a)&&(a<25))     //数据0
 0052 04EF              ldi R16,500
 0054 11E0              ldi R17,1
 0056 D4DF              xcall _s_ms
 0058                   .dbline 34
 0058           ;      { 
 0058 DF98              cbi 0x1b,7
 005A                   .dbline 35
 005A           ;      wb++;
 005A 04EF              ldi R16,500
 005C 11E0              ldi R17,1
 005E D0DF              xcall _s_ms
 0060                   .dbline 36
 0060           ;      da=(da<<1);
 0060           L8:
 0060                   .dbline 22
 0060 4423              tst R20
 0062 21F7              brne L7
 0064           X1:
 0064                   .dbline -2
 0064           L6:
 0064                   .dbline 0 ; func end
 0064 4991              ld R20,y+
 0066 0895              ret
 0068                   .dbsym r temp 20 c
 0068                   .dbend
 0068                   .dbfunc e writecom _writecom fV
 0068           ;            com -> R10
                        .even
 0068           _writecom::
 0068 AA92              st -y,R10
 006A A02E              mov R10,R16
 006C                   .dbline -1
 006C                   .dbline 41
 006C           ;        TCNT1L=0x00;
 006C           ;      }
 006C           ;    else if((25<a)&&(a<45))    //数据1
 006C           ;      {
 006C           ;      wb++;
 006C                   .dbline 42
 006C           ;        da=(da<<1)+1;
 006C D2DF              xcall _busy
 006E                   .dbline 43
 006E           ;        TCNT1L=0x00;
 006E 04EF              ldi R16,500
 0070 11E0              ldi R17,1
 0072 C6DF              xcall _s_ms
 0074                   .dbline 44
 0074           ;      }
 0074 DD98              cbi 0x1b,5
 0076                   .dbline 45
 0076           ; }
 0076 04EF              ldi R16,500
 0078 11E0              ldi R17,1
 007A C2DF              xcall _s_ms
 007C                   .dbline 46
 007C           ; if(wb==32)                    //数据长度够32位
 007C DE98              cbi 0x1b,6
 007E                   .dbline 47
 007E           ;   {
 007E 04EF              ldi R16,500
 0080 11E0              ldi R17,1
 0082 BEDF              xcall _s_ms
 0084                   .dbline 48
 0084           ;   irr_b=0;                    //状态为停止接收
 0084 DF9A              sbi 0x1b,7
 0086                   .dbline 49
 0086           ;   wb=0;                       //数据计数清零
 0086 04EF              ldi R16,500
 0088 11E0              ldi R17,1
 008A BADF              xcall _s_ms
 008C                   .dbline 50
 008C           ;   s_s=1;                      //打开显示许可
 008C A2BA              out 0x12,R10
 008E                   .dbline 51
 008E           ;   }
 008E 04EF              ldi R16,500
 0090 11E0              ldi R17,1
 0092 B6DF              xcall _s_ms
 0094                   .dbline 52
 0094           ; }
 0094 DF98              cbi 0x1b,7
 0096                   .dbline 53
 0096           ; 
 0096 04EF              ldi R16,500
 0098 11E0              ldi R17,1
 009A B2DF              xcall _s_ms
 009C                   .dbline -2
 009C           L10:
 009C                   .dbline 0 ; func end
 009C A990              ld R10,y+
 009E 0895              ret
 00A0                   .dbsym r com 10 c
 00A0                   .dbend
 00A0                   .dbfunc e LcdInit _LcdInit fV
                        .even
 00A0           _LcdInit::
 00A0                   .dbline -1
 00A0                   .dbline 58
 00A0           ; //定时器T1初始化
 00A0           ; void t1_init()
 00A0           ; {
 00A0           ; TCCR1B=0x00;   //关闭定时器
 00A0           ; TCNT1H=0x00;   //定时器初值
 00A0                   .dbline 59
 00A0           ; TCNT1L=0x00;
 00A0 8FEF              ldi R24,255
 00A2 81BB              out 0x11,R24
 00A4                   .dbline 60
 00A4           ; TCCR1A=0x00;   //普通模式
 00A4 2224              clr R2
 00A6 22BA              out 0x12,R2
 00A8                   .dbline 61
 00A8           ; TCCR1B=0x05;   //1024分频
 00A8 08E3              ldi R16,56
 00AA DEDF              xcall _writecom
 00AC                   .dbline 62
 00AC           ; }
 00AC 08EE              ldi R16,1000
 00AE 13E0              ldi R17,3
 00B0 A7DF              xcall _s_ms
 00B2                   .dbline 63
 00B2           ; 
 00B2 01E0              ldi R16,1
 00B4 D9DF              xcall _writecom
 00B6                   .dbline 64
 00B6           ; //主函数
 00B6 08EE              ldi R16,1000
 00B8 13E0              ldi R17,3
 00BA A2DF              xcall _s_ms
 00BC                   .dbline 66
 00BC           ; main()
 00BC           ; {
 00BC 02E0              ldi R16,2
 00BE D4DF              xcall _writecom
 00C0                   .dbline 67
 00C0           ; //初始化端口
 00C0 08EC              ldi R16,200
 00C2 10E0              ldi R17,0
 00C4 9DDF              xcall _s_ms
 00C6                   .dbline 68
 00C6           ; DDRA=0xff;
 00C6 06E0              ldi R16,6
 00C8 CFDF              xcall _writecom
 00CA                   .dbline 69
 00CA           ; PORTA=0x00;
 00CA 08EC              ldi R16,200
 00CC 10E0              ldi R17,0
 00CE 98DF              xcall _s_ms
 00D0                   .dbline 70
 00D0           ; DDRB=0xff;
 00D0 0CE0              ldi R16,12
 00D2 CADF              xcall _writecom
 00D4                   .dbline 71
 00D4           ; DDRD=0x00;         //中断输入
 00D4 08EC              ldi R16,200
 00D6 10E0              ldi R17,0
 00D8 93DF              xcall _s_ms
 00DA                   .dbline 72
 00DA           ; PORTD=0xff;        //内部上拉
 00DA 08E3              ldi R16,56
 00DC C5DF              xcall _writecom
 00DE                   .dbline 73
 00DE           ; 
 00DE 08EC              ldi R16,200
 00E0 10E0              ldi R17,0
 00E2                   .dbline -2
 00E2           L11:
 00E2                   .dbline 0 ; func end
 00E2 8ECF              xjmp _s_ms
 00E4                   .dbend
 00E4                   .dbfunc e writedata _writedata fV
 00E4           ;           data -> R10
                        .even
 00E4           _writedata::
 00E4 AA92              st -y,R10
 00E6 A02E              mov R10,R16
 00E8                   .dbline -1
 00E8                   .dbline 78
 00E8           ; t1_init();         //定时器t1初始化
 00E8           ; 
 00E8           ; MCUCR = 0x02;      //下降沿中断
 00E8           ; GICR  = 0x40;      //开外部中断int_0
 00E8           ; TIMSK = 0x00;      
 00E8                   .dbline 79
 00E8           ; SREG=0x80;         //开全局中断
 00E8 94DF              xcall _busy
 00EA                   .dbline 80
 00EA           ; s_s=1;             //开机进行一次显示
 00EA 08EC              ldi R16,200
 00EC 10E0              ldi R17,0
 00EE 88DF              xcall _s_ms
 00F0                   .dbline 81
 00F0           ; while(1)
 00F0 DD9A              sbi 0x1b,5
 00F2                   .dbline 82
 00F2           ;     {
 00F2 08EC              ldi R16,200
 00F4 10E0              ldi R17,0
 00F6 84DF              xcall _s_ms
 00F8                   .dbline 83
 00F8           ;       ds=TCNT1L;
 00F8 DE98              cbi 0x1b,6
 00FA                   .dbline 84
 00FA           ;       if(ds>250)     //定时器超时,接收复位
 00FA 08EC              ldi R16,200
 00FC 10E0              ldi R17,0
 00FE 80DF              xcall _s_ms
 0100                   .dbline 85
 0100           ;         {
 0100 DF9A              sbi 0x1b,7
 0102                   .dbline 86
 0102           ;         TCNT1L=0;
 0102 08EC              ldi R16,200
 0104 10E0              ldi R17,0
 0106 7CDF              xcall _s_ms
 0108                   .dbline 87
 0108           ;         irr_b=0;
 0108 A2BA              out 0x12,R10
 010A                   .dbline 88
 010A           ;         da=0;
 010A 08EC              ldi R16,200
 010C 10E0              ldi R17,0
 010E 78DF              xcall _s_ms
 0110                   .dbline 89
 0110           ;       wb=0; 
 0110 DF98              cbi 0x1b,7
 0112                   .dbline 90
 0112           ;       s_s=0;
 0112 08EC              ldi R16,200
 0114 10E0              ldi R17,0
 0116 74DF              xcall _s_ms
 0118                   .dbline -2
 0118           L12:
 0118                   .dbline 0 ; func end
 0118 A990              ld R10,y+
 011A 0895              ret
 011C                   .dbsym r data 10 c
 011C                   .dbend
 011C                   .dbfunc e readdata _readdata fc
 011C           ;           temp -> R10
                        .even
 011C           _readdata::
 011C AA92              st -y,R10
 011E                   .dbline -1
 011E                   .dbline 96
 011E           ;         }
 011E           ;       if(s_s==1)     //显示开关打开,开始显示
 011E           ;         {
 011E           ;         SREG=0x00;     //关闭全局中断
 011E           ;       LcdInit();     //1602初始化
 011E           ;         //显示设备码
 011E                   .dbline 98
 011E           ;         d1=da>>24;
 011E           ;         ten_1=d1/100;
 011E 79DF              xcall _busy
 0120                   .dbline 99
 0120           ;         ten_2=(d1-(100*ten_1))/10;
 0120 08EC              ldi R16,200
 0122 10E0              ldi R17,0
 0124 6DDF              xcall _s_ms
 0126                   .dbline 100
 0126           ;         ten_3=d1-(100*ten_1)-ten_2*10;
 0126 DD9A              sbi 0x1b,5
 0128                   .dbline 101
 0128           ;         WriteNum(1,0,ten_1);
 0128 08EC              ldi R16,200
 012A 10E0              ldi R17,0
 012C 69DF              xcall _s_ms
 012E                   .dbline 102
 012E           ;         WriteNum(1,1,ten_2);
 012E DE9A              sbi 0x1b,6
 0130                   .dbline 103
 0130           ;         WriteNum(1,2,ten_3);
 0130 08EC              ldi R16,200
 0132 10E0              ldi R17,0
 0134 65DF              xcall _s_ms
 0136                   .dbline 104
 0136           ;         //显示设备码反码
 0136 DF9A              sbi 0x1b,7
 0138                   .dbline 105
 0138           ;         d1=da>>16;
 0138 08EC              ldi R16,200
 013A 10E0              ldi R17,0
 013C 61DF              xcall _s_ms
 013E                   .dbline 106

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -