?? irr.lis
字號:
.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 + -