?? ir.lis
字號:
.module ir.c
.area vector(rom, abs)
.org 4
0004 ADC0 rjmp _int1_serving
.area data(ram, con, rel)
0000 _Table::
0000 .blkb 2
.area idata
0000 C0F9 .byte 192,249
.area data(ram, con, rel)
0002 .blkb 2
.area idata
0002 A4B0 .byte 164,176
.area data(ram, con, rel)
0004 .blkb 2
.area idata
0004 9992 .byte 153,146
.area data(ram, con, rel)
0006 .blkb 2
.area idata
0006 82F8 .byte 130,248
.area data(ram, con, rel)
0008 .blkb 2
.area idata
0008 8090 .byte 128,144
.area data(ram, con, rel)
000A .blkb 2
.area idata
000A 8FB9 .byte 143,185
.area data(ram, con, rel)
000C .blkb 2
.area idata
000C 8688 .byte 134,136
.area data(ram, con, rel)
000E .blkb 1
.area idata
000E C6 .byte 198
.area data(ram, con, rel)
000F .dbfile E:\iccavr代碼\實驗9_紅外遙控接收的應用\ir.c
000F .dbsym e Table _Table A[15:15]c
.area text(rom, con, rel)
0000 .dbfile E:\iccavr代碼\實驗9_紅外遙控接收的應用\ir.c
0000 .dbfunc e DelaymS _DelaymS fV
0000 ; j -> R20,R21
0000 ; i -> R16,R17
.even
0000 _DelaymS::
0000 00D0 rcall push_gset1
0002 .dbline -1
0002 .dbline 42
0002 ; //******************************************************************************
0002 ; // *
0002 ; // FileName : 實驗板ir.c ICCAVR V6.31A編譯 *
0002 ; // Function : 紅外接收 C與匯編混合編程實例 *
0002 ; // Date : 2007-01-04 *
0002 ; // Version : 1.0 *
0002 ; // *
0002 ; // Author : 開關電源 hongtusy@163.com *
0002 ; // Company : 電子信息技術咨詢網 http://www.itsn.cn *
0002 ; // *
0002 ; //***************************描述與記事*****************************************
0002 ; //實驗板的AVR程序,接收紅外線遙控器的按鍵信號,并將譯碼后的數字送數碼管顯示。
0002 ; //本試驗需要配合配套的紅外遙控器(使用6121芯片),使用ATmega8535,使用片內1M晶振。
0002 ; //接線定義:PA2=SW5-7接蜂鳴器,PD3/INT1=SW5-6紅外信號接收端
0002 ; // 數碼管顯示部分,SW1-1~8,SW2-1~3,SW2-6,SW3-8為系統復位端。
0002 ; //功能:剛上電,蜂鳴器會響一聲,然后收到一個紅外信號就響一聲,并將鍵值顯示在數碼管上。
0002 ; //記事:本程序旨在對紅外接收的理解與演示,忽略了系統碼,程序適合初學者使用。
0002 ; /*解碼的關鍵是如何識別"0"和"1",從位的定義我們可以發現"0"和"1"均以0.565mS的低電平開始,
0002 ; 不同的是高電平的寬度不同,"0"為0.56mS,"1"為1.68mS,所以必須根據高電平的寬度區別"0"和
0002 ; "1",如果從0.565mS低電平過后,開始延時,0.56mS以后,若讀到的電平為低,說明該位為"0",
0002 ; 反之則為"1",為了可靠起見,延時必須比0.56mS長些,但又不能超過1.12mS,否則如果該位為"0",
0002 ; 讀到的已是下一位的高電平,因此取(1.12mS+0.56mS)/2=0.84mS最為可靠,一般取0.84mS即可。
0002 ; //******************************************************************************/
0002 ; #include <iom8535v.h> //頭文件,ATmega8535單片機的寄存器定義
0002 ; #include "macros.h" //可以使用NOP()以及SEI()等指令.
0002 ;
0002 ; typedef unsigned char uchar; //宏
0002 ; typedef unsigned int uint;
0002 ;
0002 ; #pragma interrupt_handler int1_serving:3 //外部中斷1/紅外信號中斷入口向量。
0002 ;
0002 ; uchar Table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x8F,0xB9,0x86,0x88,0xC6};
0002 ;
0002 ; /************************************************
0002 ; 函 數 名: DelaymS()
0002 ; 功 能: 毫秒級延時函數
0002 ; 輸入參數: 延遲時間/系統晶體
0002 ; 輸出參數: 做相應的延遲處理
0002 ; 描 述: /
0002 ; ***********************************************/
0002 ; void DelaymS (uint i)
0002 ; {
0002 .dbline 44
0002 ; uint j;
0002 ; for(;i!=0;i--)
0002 0AC0 rjmp L5
0004 L2:
0004 .dbline 45
0004 ; {
0004 .dbline 46
0004 42E3 ldi R20,50
0006 50E0 ldi R21,0
0008 02C0 rjmp L9
000A L6:
000A .dbline 46
000A L7:
000A .dbline 46
000A 4150 subi R20,1
000C 5040 sbci R21,0
000E L9:
000E .dbline 46
000E 4030 cpi R20,0
0010 4507 cpc R20,R21
0012 D9F7 brne L6
0014 X0:
0014 .dbline 47
0014 L3:
0014 .dbline 44
0014 0150 subi R16,1
0016 1040 sbci R17,0
0018 L5:
0018 .dbline 44
0018 0030 cpi R16,0
001A 0107 cpc R16,R17
001C 99F7 brne L2
001E X1:
001E .dbline -2
001E L1:
001E 00D0 rcall pop_gset1
0020 .dbline 0 ; func end
0020 0895 ret
0022 .dbsym r j 20 i
0022 .dbsym r i 16 i
0022 .dbend
0022 .dbfunc e Delay882uS _Delay882uS fV
.even
0022 _Delay882uS::
0022 .dbline -1
0022 .dbline 57
0022 ; for (j=50;j!=0;j--);
0022 ; }
0022 ; }
0022 ; /************************************************
0022 ; 函 數 名: Delay882uS()
0022 ; 功 能: 882微秒延時函數
0022 ; 輸入參數: 晶振1M,機器周期為1uS。
0022 ; 輸出參數: 延遲時間T=a(4b+3)+c
0022 ; 描 述: 在C中調匯編函數,使用r24,r25不必作特殊的保護工作。
0022 ; ***********************************************/
0022 ; void Delay882uS (void)
0022 ; {
0022 .dbline 58
0022 ; asm(" ldi r24,10 ") //t=1 參數:a
0022 8AE0 ldi r24,10
0024 95E1 loop3: ldi r25,21
0026 9A95 loop4: dec r25
0028 0000 nop
002A E9F7 brne loop4
002C 8A95 dec r24
002E D1F7 brne loop3
0030 0000 nop
0032 0000 nop
0034 0000 nop
0036 0000 nop
0038 0000 nop
003A 0000 nop
003C 0000 nop
003E 0000 nop
0040 0000 nop
0042 0000 nop
0044 0000 nop
0046 0000 nop
0048 .dbline -2
0048 L10:
0048 .dbline 0 ; func end
0048 0895 ret
004A .dbend
004A .dbfunc e Delay1000uS _Delay1000uS fV
.even
004A _Delay1000uS::
004A .dbline -1
004A .dbline 75
004A ; asm("loop3: ldi r25,21 ") //t=1 參數:b
004A ; asm("loop4: dec r25 ") //t=1
004A ; asm(" nop ") //t=1,校準用,需改動公式。
004A ; asm(" brne loop4 ") //t=2/1
004A ; asm(" dec r24 ") //t=1
004A ; asm(" brne loop3 ") //t=2/1
004A ; asm("nop\n nop\n nop\n nop\n nop\n nop\n nop\n nop\n nop\n nop\n nop\n nop"); //t=1,校準用,參數:c
004A ; }
004A ; /************************************************
004A ; 函 數 名: Delay1000uS()
004A ; 功 能: 1000微秒延時函數
004A ; 輸入參數: 晶振1M,機器周期為1uS。
004A ; 輸出參數: 延遲時間T=a(4b+3)+c
004A ; 描 述: 在C中調匯編函數,使用r24,r25不必作特殊的保護工作。
004A ; ***********************************************/
004A ; void Delay1000uS (void)
004A ; {
004A .dbline 76
004A ; asm(" ldi r24,4 ") //t=1 參數:a
004A 84E0 ldi r24,4
004C 9DE3 loop5: ldi r25,61
004E 9A95 loop6: dec r25
0050 0000 nop
0052 E9F7 brne loop6
0054 8A95 dec r24
0056 D1F7 brne loop5
0058 0000 nop
005A 0000 nop
005C 0000 nop
005E 0000 nop
0060 0000 nop
0062 0000 nop
0064 0000 nop
0066 0000 nop
0068 0000 nop
006A 0000 nop
006C 0000 nop
006E .dbline -2
006E L11:
006E .dbline 0 ; func end
006E 0895 ret
0070 .dbend
0070 .dbfunc e key_decode _key_decode fV
.area func_lit(rom, con, rel)
0000 L45:
0000 5300 .word `L16
0002 5700 .word `L18
0004 5B00 .word `L20
0006 8E00 .word `L14
0008 5F00 .word `L22
000A 6300 .word `L24
000C 6700 .word `L26
000E 8E00 .word `L14
0010 6B00 .word `L28
0012 6F00 .word `L30
0014 7300 .word `L32
0016 8E00 .word `L14
0018 7700 .word `L34
001A 7B00 .word `L36
001C 7F00 .word `L37
001E 8E00 .word `L14
0020 8300 .word `L39
0022 8700 .word `L41
0024 8B00 .word `L43
.area text(rom, con, rel)
0070 .dbfile E:\iccavr代碼\實驗9_紅外遙控接收的應用\ir.c
0070 ; data -> R20
.even
0070 _key_decode::
0070 00D0 rcall push_gset1
0072 402F mov R20,R16
0074 .dbline -1
0074 .dbline 93
0074 ; asm("loop5: ldi r25,61 ") //t=1 參數:b
0074 ; asm("loop6: dec r25 ") //t=1
0074 ; asm(" nop ") //t=1,校準用,需改動公式。
0074 ; asm(" brne loop6 ") //t=2/1
0074 ; asm(" dec r24 ") //t=1
0074 ; asm(" brne loop5 ") //t=2/1
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -