?? ir.s
字號:
.module ir.c
.area vector(rom, abs)
.org 4
rjmp _int1_serving
.area data(ram, con, rel)
_Table::
.blkb 2
.area idata
.byte 192,249
.area data(ram, con, rel)
.blkb 2
.area idata
.byte 164,176
.area data(ram, con, rel)
.blkb 2
.area idata
.byte 153,146
.area data(ram, con, rel)
.blkb 2
.area idata
.byte 130,248
.area data(ram, con, rel)
.blkb 2
.area idata
.byte 128,144
.area data(ram, con, rel)
.blkb 2
.area idata
.byte 143,185
.area data(ram, con, rel)
.blkb 2
.area idata
.byte 134,136
.area data(ram, con, rel)
.blkb 1
.area idata
.byte 198
.area data(ram, con, rel)
.dbfile E:\iccavr代碼\實(shí)驗(yàn)9_紅外遙控接收的應(yīng)用\ir.c
.dbsym e Table _Table A[15:15]c
.area text(rom, con, rel)
.dbfile E:\iccavr代碼\實(shí)驗(yàn)9_紅外遙控接收的應(yīng)用\ir.c
.dbfunc e DelaymS _DelaymS fV
; j -> R20,R21
; i -> R16,R17
.even
_DelaymS::
rcall push_gset1
.dbline -1
.dbline 42
; //******************************************************************************
; // *
; // FileName : 實(shí)驗(yàn)板ir.c ICCAVR V6.31A編譯 *
; // Function : 紅外接收 C與匯編混合編程實(shí)例 *
; // Date : 2007-01-04 *
; // Version : 1.0 *
; // *
; // Author : 開關(guān)電源 hongtusy@163.com *
; // Company : 電子信息技術(shù)咨詢網(wǎng) http://www.itsn.cn *
; // *
; //***************************描述與記事*****************************************
; //實(shí)驗(yàn)板的AVR程序,接收紅外線遙控器的按鍵信號,并將譯碼后的數(shù)字送數(shù)碼管顯示。
; //本試驗(yàn)需要配合配套的紅外遙控器(使用6121芯片),使用ATmega8535,使用片內(nèi)1M晶振。
; //接線定義:PA2=SW5-7接蜂鳴器,PD3/INT1=SW5-6紅外信號接收端
; // 數(shù)碼管顯示部分,SW1-1~8,SW2-1~3,SW2-6,SW3-8為系統(tǒng)復(fù)位端。
; //功能:剛上電,蜂鳴器會響一聲,然后收到一個(gè)紅外信號就響一聲,并將鍵值顯示在數(shù)碼管上。
; //記事:本程序旨在對紅外接收的理解與演示,忽略了系統(tǒng)碼,程序適合初學(xué)者使用。
; /*解碼的關(guān)鍵是如何識別"0"和"1",從位的定義我們可以發(fā)現(xiàn)"0"和"1"均以0.565mS的低電平開始,
; 不同的是高電平的寬度不同,"0"為0.56mS,"1"為1.68mS,所以必須根據(jù)高電平的寬度區(qū)別"0"和
; "1",如果從0.565mS低電平過后,開始延時(shí),0.56mS以后,若讀到的電平為低,說明該位為"0",
; 反之則為"1",為了可靠起見,延時(shí)必須比0.56mS長些,但又不能超過1.12mS,否則如果該位為"0",
; 讀到的已是下一位的高電平,因此取(1.12mS+0.56mS)/2=0.84mS最為可靠,一般取0.84mS即可。
; //******************************************************************************/
; #include <iom8535v.h> //頭文件,ATmega8535單片機(jī)的寄存器定義
; #include "macros.h" //可以使用NOP()以及SEI()等指令.
;
; typedef unsigned char uchar; //宏
; typedef unsigned int uint;
;
; #pragma interrupt_handler int1_serving:3 //外部中斷1/紅外信號中斷入口向量。
;
; uchar Table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x8F,0xB9,0x86,0x88,0xC6};
;
; /************************************************
; 函 數(shù) 名: DelaymS()
; 功 能: 毫秒級延時(shí)函數(shù)
; 輸入?yún)?shù): 延遲時(shí)間/系統(tǒng)晶體
; 輸出參數(shù): 做相應(yīng)的延遲處理
; 描 述: /
; ***********************************************/
; void DelaymS (uint i)
; {
.dbline 44
; uint j;
; for(;i!=0;i--)
rjmp L5
L2:
.dbline 45
; {
.dbline 46
ldi R20,50
ldi R21,0
rjmp L9
L6:
.dbline 46
L7:
.dbline 46
subi R20,1
sbci R21,0
L9:
.dbline 46
cpi R20,0
cpc R20,R21
brne L6
X0:
.dbline 47
L3:
.dbline 44
subi R16,1
sbci R17,0
L5:
.dbline 44
cpi R16,0
cpc R16,R17
brne L2
X1:
.dbline -2
L1:
rcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r j 20 i
.dbsym r i 16 i
.dbend
.dbfunc e Delay882uS _Delay882uS fV
.even
_Delay882uS::
.dbline -1
.dbline 57
; for (j=50;j!=0;j--);
; }
; }
; /************************************************
; 函 數(shù) 名: Delay882uS()
; 功 能: 882微秒延時(shí)函數(shù)
; 輸入?yún)?shù): 晶振1M,機(jī)器周期為1uS。
; 輸出參數(shù): 延遲時(shí)間T=a(4b+3)+c
; 描 述: 在C中調(diào)匯編函數(shù),使用r24,r25不必作特殊的保護(hù)工作。
; ***********************************************/
; void Delay882uS (void)
; {
.dbline 58
; asm(" ldi r24,10 ") //t=1 參數(shù):a
ldi r24,10
loop3: ldi r25,21
loop4: dec r25
nop
brne loop4
dec r24
brne loop3
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
.dbline -2
L10:
.dbline 0 ; func end
ret
.dbend
.dbfunc e Delay1000uS _Delay1000uS fV
.even
_Delay1000uS::
.dbline -1
.dbline 75
; asm("loop3: ldi r25,21 ") //t=1 參數(shù):b
; asm("loop4: dec r25 ") //t=1
; asm(" nop ") //t=1,校準(zhǔn)用,需改動公式。
; asm(" brne loop4 ") //t=2/1
; asm(" dec r24 ") //t=1
; asm(" brne loop3 ") //t=2/1
; 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,校準(zhǔn)用,參數(shù):c
; }
; /************************************************
; 函 數(shù) 名: Delay1000uS()
; 功 能: 1000微秒延時(shí)函數(shù)
; 輸入?yún)?shù): 晶振1M,機(jī)器周期為1uS。
; 輸出參數(shù): 延遲時(shí)間T=a(4b+3)+c
; 描 述: 在C中調(diào)匯編函數(shù),使用r24,r25不必作特殊的保護(hù)工作。
; ***********************************************/
; void Delay1000uS (void)
; {
.dbline 76
; asm(" ldi r24,4 ") //t=1 參數(shù):a
ldi r24,4
loop5: ldi r25,61
loop6: dec r25
nop
brne loop6
dec r24
brne loop5
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
.dbline -2
L11:
.dbline 0 ; func end
ret
.dbend
.dbfunc e key_decode _key_decode fV
.area func_lit(rom, con, rel)
L45:
.word `L16
.word `L18
.word `L20
.word `L14
.word `L22
.word `L24
.word `L26
.word `L14
.word `L28
.word `L30
.word `L32
.word `L14
.word `L34
.word `L36
.word `L37
.word `L14
.word `L39
.word `L41
.word `L43
.area text(rom, con, rel)
.dbfile E:\iccavr代碼\實(shí)驗(yàn)9_紅外遙控接收的應(yīng)用\ir.c
; data -> R20
.even
_key_decode::
rcall push_gset1
mov R20,R16
.dbline -1
.dbline 93
; asm("loop5: ldi r25,61 ") //t=1 參數(shù):b
; asm("loop6: dec r25 ") //t=1
; asm(" nop ") //t=1,校準(zhǔn)用,需改動公式。
; asm(" brne loop6 ") //t=2/1
; asm(" dec r24 ") //t=1
; asm(" brne loop5 ") //t=2/1
; asm("nop\n nop\n nop\n nop\n nop\n nop\n nop\n nop\n nop\n nop\n nop"); //t=1,校準(zhǔn)用,參數(shù):c
; }
; /************************************************
; 函 數(shù) 名: key_decode (uchar data)
; 功 能: 鍵值掃描碼是無規(guī)律的,我們只能通過switch來獲得鍵值。
; 輸入?yún)?shù): 掃描碼
; 輸出參數(shù): 翻譯后的鍵值,并顯示
; 描 述: 本處也可以通過數(shù)組實(shí)現(xiàn)。
; ***********************************************/
; void key_decode (uchar data) //譯碼鍵值
; {
.dbline 94
; switch (data) //判斷掃描碼data
clr R21
cpi R20,0
ldi R30,0
cpc R21,R30
brge X3
rjmp L14
X3:
ldi R24,18
ldi R25,0
cp R24,R20
cpc R25,R21
brge X4
rjmp L14
X4:
ldi R16,2
ldi R17,0
movw R18,R20
rcall empy16s
movw R30,R16
ldi R24,<L45
ldi R25,>L45
add R30,R24
adc R31,R25
lpm R0,Z+
lpm R1,Z
movw R30,R0
ijmp
X2:
.dbline 95
; {
L16:
.dbline 96
; case 0: PORTC=Table[1];break; //1
lds R2,_Table+1
out 0x15,R2
.dbline 96
rjmp L14
L18:
.dbline 97
; case 1: PORTC=Table[2];break; //2
lds R2,_Table+2
out 0x15,R2
.dbline 97
rjmp L14
L20:
.dbline 98
; case 2: PORTC=Table[3];break; //3
lds R2,_Table+3
out 0x15,R2
.dbline 98
rjmp L14
L22:
.dbline 99
; case 4: PORTC=Table[4];break; //4
lds R2,_Table+4
out 0x15,R2
.dbline 99
rjmp L14
L24:
.dbline 100
; case 5: PORTC=Table[5];break; //5
lds R2,_Table+5
out 0x15,R2
.dbline 100
rjmp L14
L26:
.dbline 101
; case 6: PORTC=Table[6];break; //6
lds R2,_Table+6
out 0x15,R2
.dbline 101
rjmp L14
L28:
.dbline 102
; case 8: PORTC=Table[7];break; //7
lds R2,_Table+7
out 0x15,R2
.dbline 102
rjmp L14
L30:
.dbline 103
; case 9: PORTC=Table[8];break; //8
lds R2,_Table+8
out 0x15,R2
.dbline 103
rjmp L14
L32:
.dbline 104
; case 10: PORTC=Table[9];break; //9
lds R2,_Table+9
out 0x15,R2
.dbline 104
rjmp L14
L34:
.dbline 105
; case 12: PORTC=Table[10];break; //*
lds R2,_Table+10
out 0x15,R2
.dbline 105
rjmp L14
L36:
.dbline 106
; case 13: PORTC=Table[0];break; //0
lds R2,_Table
out 0x15,R2
.dbline 106
rjmp L14
L37:
.dbline 107
; case 14: PORTC=Table[11];break; //#
lds R2,_Table+11
out 0x15,R2
.dbline 107
rjmp L14
L39:
.dbline 108
; case 16: PORTC=Table[12];break; //E
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -