?? hw.lst
字號:
__start:
__text_start:
11 E5CF LDI R28,0x5F
12 E0D2 LDI R29,2
13 BFCD OUT 0x3D,R28
14 BFDE OUT 0x3E,R29
15 51CE SUBI R28,0x1E
16 40D0 SBCI R29,0
17 EA0A LDI R16,0xAA
18 8308 STD Y+0,R16
19 2400 CLR R0
1A E6E0 LDI R30,0x60
1B E0F0 LDI R31,0
1C E010 LDI R17,0
1D 36E5 CPI R30,0x65
1E 07F1 CPC R31,R17
1F F011 BEQ 0x0022
20 9201 ST R0,Z+
21 CFFB RJMP 0x001D
22 8300 STD Z+0,R16
23 E2E2 LDI R30,0x22
24 E0F0 LDI R31,0
25 E6A0 LDI R26,0x60
26 E0B0 LDI R27,0
27 E010 LDI R17,0
28 E000 LDI R16,0
29 BF0B OUT 0x3B,R16
2A 32E2 CPI R30,0x22
2B 07F1 CPC R31,R17
2C F021 BEQ 0x0031
2D 95C8 LPM
2E 9631 ADIW R30,1
2F 920D ST R0,X+
30 CFF9 RJMP 0x002A
31 D0B6 RCALL _main
_exit:
32 CFFF RJMP _exit
_delay_nus:
i --> R20
n --> R16
33 934A ST R20,-Y
34 935A ST R21,-Y
FILE: C:\DOCUME~1\Administrator.27F5F4061F03467\桌面\實驗板紅外avr解碼\hongwai.c
(0001) //ICC-AVR application builder : 2008-8-7 8:30:21
(0002) // Target : M8515
(0003) // Crystal: 4.0000Mhz
(0004) #include <iom8515v.h>//和單片機類型相對應的頭文件,選擇Atmega8515做實驗;
(0005) #include <macros.h>
(0006) #define uchar unsigned char
(0007) #define uint unsigned int
(0008) #define DQ PD2
(0009) #define HW (PIND&(1<<DQ)) //數據的狀態
(0010) unsigned char IRCode[3],IRCON,flag;
(0011) void delay_nus(unsigned int n)//n微秒延時函數
(0012) {
(0013) unsigned int i;
(0014) for (i=0;i<n;i++)
35 2744 CLR R20
36 2755 CLR R21
37 C003 RJMP 0x003B
(0015) {
(0016) asm("nop");
38 0000 NOP
39 5F4F SUBI R20,0xFF
3A 4F5F SBCI R21,0xFF
3B 1740 CP R20,R16
3C 0751 CPC R21,R17
3D F3D0 BCS 0x0038
3E 9159 LD R21,Y+
3F 9149 LD R20,Y+
40 9508 RET
_delay_nms:
i --> R20
n --> R10
41 D0AF RCALL push_xgset300C
42 0158 MOVW R10,R16
(0017) }
(0018) }
(0019) void delay_nms(unsigned int n)//n毫秒延時函數
(0020) {
(0021) unsigned int i;
(0022) for (i=0;i<n;i++) //執行n次1毫秒延時
43 2744 CLR R20
44 2755 CLR R21
45 C005 RJMP 0x004B
(0023) delay_nus(10);
46 E00A LDI R16,0xA
47 E010 LDI R17,0
48 DFEA RCALL _delay_nus
49 5F4F SUBI R20,0xFF
4A 4F5F SBCI R21,0xFF
4B 154A CP R20,R10
4C 055B CPC R21,R11
4D F3C0 BCS 0x0046
4E C0A7 RJMP pop_xgset300C
(0024) }
(0025) /************************* UART 發送數據函數*********************************************************/
(0026) void uart0_init(void)
(0027) {
(0028) UCSRB = 0x00; //disable while setting baud rate
_uart0_init:
4F 2422 CLR R2
50 B82A OUT 0x0A,R2
(0029) UCSRA = 0x00;
51 B82B OUT 0x0B,R2
(0030) UCSRC = BIT(URSEL) | 0x26;
52 EA86 LDI R24,0xA6
53 BD80 OUT 0x20,R24
(0031) UBRRL = 0x33; //set baud rate lo
54 E383 LDI R24,0x33
55 B989 OUT 0x09,R24
(0032) UBRRH = 0x00; //set baud rate hi
56 BC20 OUT 0x20,R2
(0033) UCSRB = 0x18;
57 E188 LDI R24,0x18
58 B98A OUT 0x0A,R24
59 9508 RET
(0034) }
(0035) void sendchar(uchar num)
(0036) {
(0037) UDR=num;
_sendchar:
num --> R16
5A B90C OUT 0x0C,R16
(0038) while(!(UCSRA&(1<<TXC)));
5B 9B5E SBIS 0x0B,6
5C CFFE RJMP 0x005B
(0039) UCSRA |= (1<<TXC);
5D 9A5E SBI 0x0B,6
5E 9508 RET
(0040) }
(0041)
(0042) void panduan(void)
(0043) {
(0044) IRCode[IRCON]<<=1; //每讀一次放入變量中的二進制的一個位,每次左移一位
_panduan:
5F E682 LDI R24,0x62
60 E090 LDI R25,0
61 9020 0061 LDS R2,IRCON
63 2433 CLR R3
64 0E28 ADD R2,R24
65 1E39 ADC R3,R25
66 01F1 MOVW R30,R2
67 8020 LDD R2,Z+0
68 0C22 LSL R2
69 8220 STD Z+0,R2
(0045) if(!HW) delay_nms(42); //延時1107us 44
6A 9982 SBIC 0x10,2
6B C004 RJMP 0x0070
6C E20A LDI R16,0x2A
6D E010 LDI R17,0
6E DFD2 RCALL _delay_nms
6F C00E RJMP 0x007E
(0046) else
(0047) {
(0048) IRCode[IRCON]|=0x01; //左移后最后一位寫入 1
70 E682 LDI R24,0x62
71 E090 LDI R25,0
72 9020 0061 LDS R2,IRCON
74 2433 CLR R3
75 0E28 ADD R2,R24
76 1E39 ADC R3,R25
77 01F1 MOVW R30,R2
78 8180 LDD R24,Z+0
79 6081 ORI R24,1
7A 8380 STD Z+0,R24
(0049) delay_nms(89); //延時2207us 88
7B E509 LDI R16,0x59
7C E010 LDI R17,0
7D DFC3 RCALL _delay_nms
(0050) }
(0051) flag++;
7E 9180 0060 LDS R24,flag
80 5F8F SUBI R24,0xFF
81 9380 0060 STS flag,R24
(0052) if(flag==8)
83 3088 CPI R24,0x8
84 F461 BNE 0x0091
(0053) {
(0054) flag=0; //8為填滿一個數組,計數清零
85 2422 CLR R2
86 9220 0060 STS flag,R2
(0055) IRCON++; //填滿一個字節,指向下一個變量
88 9180 0061 LDS R24,IRCON
8A 5F8F SUBI R24,0xFF
8B 9380 0061 STS IRCON,R24
(0056) if(IRCON==4) IRCON=0;
8D 3084 CPI R24,4
8E F411 BNE 0x0091
8F 9220 0061 STS IRCON,R2
(0057) }
91 9508 RET
_int0_isr:
i --> R20
92 920A ST R0,-Y
93 921A ST R1,-Y
94 922A ST R2,-Y
95 923A ST R3,-Y
96 924A ST R4,-Y
97 925A ST R5,-Y
98 926A ST R6,-Y
99 927A ST R7,-Y
9A 928A ST R8,-Y
9B 929A ST R9,-Y
9C 930A ST R16,-Y
9D 931A ST R17,-Y
9E 932A ST R18,-Y
9F 933A ST R19,-Y
A0 938A ST R24,-Y
A1 939A ST R25,-Y
A2 93AA ST R26,-Y
A3 93BA ST R27,-Y
A4 93EA ST R30,-Y
A5 93FA ST R31,-Y
A6 B60F IN R0,0x3F
A7 920A ST R0,-Y
A8 934A ST R20,-Y
(0058) }
(0059) /*****************************外部中斷服務函數*****************************************/
(0060) #pragma interrupt_handler int0_isr:iv_INT0
(0061) void int0_isr(void)
(0062) {
(0063) uchar i;
(0064) GICR = 0x00; //禁止外部中斷
A9 2422 CLR R2
AA BE2B OUT 0x3B,R2
(0065) delay_nms(616); //延時15400us 616
AB E608 LDI R16,0x68
AC E012 LDI R17,2
AD DF93 RCALL _delay_nms
(0066) for(i=0;i<32;i++)
AE 2744 CLR R20
AF C002 RJMP 0x00B2
(0067) {
(0068) panduan();
B0 DFAE RCALL _panduan
B1 9543 INC R20
B2 3240 CPI R20,0x20
B3 F3E0 BCS 0x00B0
(0069) }
(0070)
(0071) uart0_init();
B4 DF9A RCALL _uart0_init
(0072) for(i=0;i<4;i++)
B5 2744 CLR R20
B6 C00C RJMP 0x00C3
(0073) {
(0074) delay_nms(5000);
B7 E808 LDI R16,0x88
B8 E113 LDI R17,0x13
B9 DF87 RCALL _delay_nms
(0075) // PORTB=IRCode[i];
(0076) sendchar(IRCode[i]);
BA E682 LDI R24,0x62
BB E090 LDI R25,0
BC 2FE4 MOV R30,R20
BD 27FF CLR R31
BE 0FE8 ADD R30,R24
BF 1FF9 ADC R31,R25
C0 8100 LDD R16,Z+0
C1 DF98 RCALL _sendchar
C2 9543 INC R20
C3 3044 CPI R20,4
C4 F390 BCS 0x00B7
(0077) }
(0078) GICR = 0x40;
C5 E480 LDI R24,0x40
C6 BF8B OUT 0x3B,R24
C7 9149 LD R20,Y+
C8 9009 LD R0,Y+
C9 BE0F OUT 0x3F,R0
CA 91F9 LD R31,Y+
CB 91E9 LD R30,Y+
CC 91B9 LD R27,Y+
CD 91A9 LD R26,Y+
CE 9199 LD R25,Y+
CF 9189 LD R24,Y+
D0 9139 LD R19,Y+
D1 9129 LD R18,Y+
D2 9119 LD R17,Y+
D3 9109 LD R16,Y+
D4 9099 LD R9,Y+
D5 9089 LD R8,Y+
D6 9079 LD R7,Y+
D7 9069 LD R6,Y+
D8 9059 LD R5,Y+
D9 9049 LD R4,Y+
DA 9039 LD R3,Y+
DB 9029 LD R2,Y+
DC 9019 LD R1,Y+
DD 9009 LD R0,Y+
DE 9518 RETI
(0079) }
(0080)
(0081) /*****************外部中斷設置***********************************/
(0082) void init_devices_int0(void)
(0083) {
(0084) CLI(); //disable all interrupts
_init_devices_int0:
DF 94F8 BCLR 7
(0085) MCUCR = 0x02; //下降沿觸發方式
E0 E082 LDI R24,2
E1 BF85 OUT 0x35,R24
(0086) EMCUCR = 0x00;
E2 2422 CLR R2
E3 BE26 OUT 0x36,R2
(0087) GICR = 0x40; //外部中斷請求 0 使能
E4 E480 LDI R24,0x40
E5 BF8B OUT 0x3B,R24
(0088) SEI(); //re-enable interrupts
E6 9478 BSET 7
E7 9508 RET
(0089) }
(0090)
(0091) void main(void)//主函數
(0092) {
(0093) DDRB=0XFF;
_main:
E8 EF8F LDI R24,0xFF
E9 BB87 OUT 0x17,R24
(0094) PORTB=0XFF;
EA BB88 OUT 0x18,R24
(0095) DDRD&=~BIT(0);
EB 9888 CBI 0x11,0
(0096) DDRD|=BIT(1);
EC 9A89 SBI 0x11,1
(0097) DDRD&=~BIT(2);//設置PD2為輸入口
ED 988A CBI 0x11,2
(0098) init_devices_int0(); //外部中斷初始化并開外部中斷
EE DFF0 RCALL _init_devices_int0
(0099) while(1);
FILE: <library>
EF CFFF RJMP 0x00EF
F0 9508 RET
push_xgset300C:
F1 935A ST R21,-Y
F2 934A ST R20,-Y
F3 92BA ST R11,-Y
F4 92AA ST R10,-Y
F5 9508 RET
pop_xgset300C:
F6 90A9 LD R10,Y+
F7 90B9 LD R11,Y+
F8 9149 LD R20,Y+
F9 9159 LD R21,Y+
FA 9508 RET
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -