📄 iremote_ir.lst
字号:
__start:
__text_start:
A E9CF LDI R28,0x9F
B E0D0 LDI R29,0
C BFCD OUT 0x3D,R28
D BFDE OUT 0x3E,R29
E 51CE SUBI R28,0x1E
F 40D0 SBCI R29,0
10 EA0A LDI R16,0xAA
11 8308 STD Y+0,R16
12 8300 STD Z+0,R16
13 E1E4 LDI R30,0x14
14 E0F0 LDI R31,0
15 E6A0 LDI R26,0x60
16 E0B0 LDI R27,0
17 E010 LDI R17,0
18 E000 LDI R16,0
19 BF0B OUT 0x3B,R16
1A 31E4 CPI R30,0x14
1B 07F1 CPC R31,R17
1C F021 BEQ 0x0021
1D 95C8 LPM
1E 9631 ADIW R30,1
1F 920D ST R0,X+
20 CFF9 RJMP 0x001A
21 D072 RCALL _main
_exit:
22 CFFF RJMP _exit
_timer0_ovf_isr:
23 938A ST R24,-Y
24 939A ST R25,-Y
25 B78F IN R24,0x3F
26 938A ST R24,-Y
FILE: F:\iRemote_IR\iRemote_IR.c
(0001) //ICC-AVR application builder : 2008-10-29 9:40:16
(0002) // Target : T13
(0003) // Crystal: 9.6000Mhz
(0004) #include <iot13v.h>
(0005) #define uchar unsigned char
(0006) #define uint unsigned int
(0007) #define ulong unsigned long
(0008) #define WDR() asm("wdr")
(0009) #define SEI() asm("sei")
(0010) #define CLI() asm("cli")
(0011) #define NOP() asm("nop")
(0012) #define SBIT(val, bitn) (val|=(1<<(bitn)))//置位
(0013) #define CBIT(val, bitn) (val&=~(1<<(bitn)))//清位
(0014) #define FBIT(val, bitn) (val^=(1<<bitn)) //位取反
(0015) #define PW_ON SBIT(PORTB,4)
(0016) #define PW_OFF CBIT(PORTB,4)
(0017) #define IR_ON SBIT(PORTB,0)
(0018) #define IR_OFF CBIT(PORTB,0)
(0019) uchar time_10ms;
(0020) uchar User_ID[7],pw_off_ram;
(0021) //===========================================
(0022) #pragma interrupt_handler timer0_ovf_isr:iv_TIM0_OVF
(0023) void timer0_ovf_isr(void){
(0024) TCNT0 = 0xA3; //reload counter value
27 EA83 LDI R24,0xA3
28 BF82 OUT 0x32,R24
(0025) time_10ms++;
29 9180 0068 LDS R24,time_10ms
2B 5F8F SUBI R24,0xFF
2C 9380 0068 STS time_10ms,R24
2E 9189 LD R24,Y+
2F BF8F OUT 0x3F,R24
30 9199 LD R25,Y+
31 9189 LD R24,Y+
32 9518 RETI
(0026) }
(0027) uchar EEPROM_read(uchar Addr){
(0028) while(EECR & (1<<EEWE));//等待上一次写操作结束
_EEPROM_read:
Addr --> R16
33 99E1 SBIC 0x1C,1
34 CFFE RJMP _EEPROM_read
(0029) EEARL = Addr;//设置地址寄存器
35 BB0E OUT 0x1E,R16
(0030) EECR |= (1<<EERE);//设置EERE 以启动读操作
36 9AE0 SBI 0x1C,0
(0031) return EEDR;//自数据寄存器返回数据
37 B30D IN R16,0x1D
38 9508 RET
(0032) }
(0033) void EEPROM_write(uchar Addr,uchar ucdata){
(0034) while(EECR & (1<<EEWE));//等待上一次写操作结束
_EEPROM_write:
ucdata --> R18
Addr --> R16
39 99E1 SBIC 0x1C,1
3A CFFE RJMP _EEPROM_write
(0035) EEAR = Addr;//设置地址和数据寄存器
3B BB0E OUT 0x1E,R16
(0036) EEDR = ucdata;
3C BB2D OUT 0x1D,R18
(0037) EECR=0b00000100;//置位EEMWE
3D E084 LDI R24,4
3E BB8C OUT 0x1C,R24
(0038) EECR=0b00000110;//置位EEWE 以启动写操作
3F E086 LDI R24,6
40 BB8C OUT 0x1C,R24
41 9508 RET
(0039) }
(0040) void delay_500us(void){
(0041) uchar ii;
(0042) for(ii=0;ii<250;ii++){//500us/0.10417us=4799.88
_delay_500us:
ii --> R16
42 2700 CLR R16
43 C014 RJMP 0x0058
(0043) WDR();NOP();NOP();NOP();NOP();NOP();NOP();
44 95A8 WDR
45 0000 NOP
46 0000 NOP
47 0000 NOP
48 0000 NOP
49 0000 NOP
4A 0000 NOP
(0044) NOP();NOP();NOP();NOP();NOP();NOP();NOP();
4B 0000 NOP
4C 0000 NOP
4D 0000 NOP
4E 0000 NOP
4F 0000 NOP
50 0000 NOP
51 0000 NOP
(0045) NOP();NOP();NOP();NOP();NOP();
52 0000 NOP
53 0000 NOP
54 0000 NOP
55 0000 NOP
56 0000 NOP
57 9503 INC R16
58 3F0A CPI R16,0xFA
59 F350 BCS 0x0044
5A 9508 RET
(0046) }
(0047) }
(0048) void ir_500us(void){
(0049) uchar ii,kk;
(0050) ii=0;
_ir_500us:
ii --> R16
kk --> R18
5B 2700 CLR R16
(0051) do{
(0052) IR_ON; //38Khz=26.3us 占空比=1/3 9.6MHz晶振时=0.10417时钟周期指令
5C 9AC0 SBI 0x18,0
(0053) for(kk=0;kk<20;kk++);
5D 2722 CLR R18
5E C001 RJMP 0x0060
5F 9523 INC R18
60 3124 CPI R18,0x14
61 F3E8 BCS 0x005F
(0054) IR_OFF;
62 98C0 CBI 0x18,0
(0055) for(kk=0;kk<39;kk++);
63 2722 CLR R18
64 C001 RJMP 0x0066
65 9523 INC R18
66 3227 CPI R18,0x27
67 F3E8 BCS 0x0065
(0056) ii++;
68 9503 INC R16
(0057) }while(ii<16);
69 3100 CPI R16,0x10
6A F388 BCS 0x005C
6B 9508 RET
_send_code:
ii --> R20
mm --> R22
nn --> R12
kk --> R10
6C D171 RCALL push_xgsetF03C
(0058) }
(0059) void send_code(void){
(0060) uchar ii,kk,nn,mm;
(0061) for(ii=0;ii<10;ii++){
6D 2744 CLR R20
6E C021 RJMP 0x0090
(0062) ir_500us();//2.00ms+0.50ms开始码
6F DFEB RCALL _ir_500us
(0063) ir_500us();
70 DFEA RCALL _ir_500us
(0064) ir_500us();
71 DFE9 RCALL _ir_500us
(0065) ir_500us();
72 DFE8 RCALL _ir_500us
(0066) delay_500us();
73 DFCE RCALL _delay_500us
(0067) for(mm=0;mm<7;mm++){
74 2766 CLR R22
75 C017 RJMP 0x008D
(0068) kk=User_ID[mm];
76 E681 LDI R24,0x61
77 E090 LDI R25,0
78 2FE6 MOV R30,R22
79 27FF CLR R31
7A 0FE8 ADD R30,R24
7B 1FF9 ADC R31,R25
7C 80A0 LDD R10,Z+0
(0069) for(nn=0;nn<8;nn++){
7D 24CC CLR R12
7E C00A RJMP 0x0089
(0070) if(!(kk&0x80)){
7F FCA7 SBRC R10,7
80 C003 RJMP 0x0084
(0071) ir_500us();//0.50ms+0.50ms逻辑低
81 DFD9 RCALL _ir_500us
(0072) delay_500us();
82 DFBF RCALL _delay_500us
(0073) }
83 C003 RJMP 0x0087
(0074) else{
(0075) ir_500us();//1.00ms+0.50ms逻辑高
84 DFD6 RCALL _ir_500us
(0076) ir_500us();
85 DFD5 RCALL _ir_500us
(0077) delay_500us();
86 DFBB RCALL _delay_500us
(0078) }
(0079) kk<<=1;
87 0CAA LSL R10
88 94C3 INC R12
89 2D8C MOV R24,R12
8A 3088 CPI R24,0x8
8B F398 BCS 0x007F
8C 9563 INC R22
8D 3067 CPI R22,7
8E F338 BCS 0x0076
8F 9543 INC R20
90 304A CPI R20,0xA
91 F2E8 BCS 0x006F
(0080) }
(0081) }
(0082) }
(0083) ir_500us();//0.50ms结束码
92 DFC8 RCALL _ir_500us
93 C153 RJMP pop_xgsetF03C
_main:
temp4 --> R14
temp3 --> R12
temp5 --> R10
ID --> Y,+0
temp2 --> Y,+5
temp1 --> Y,+4
94 9726 SBIW R28,6
(0084) }
(0085) void main(void){
(0086) uchar temp1,temp2,temp5;
(0087) uint temp3,temp4;
(0088) ulong ID;
(0089) EECR=0;
95 2422 CLR R2
96 BA2C OUT 0x1C,R2
97 C004 RJMP 0x009C
(0090) while(pw_off_ram==0xaa){
(0091) DDRB = 0b11010111;
98 ED87 LDI R24,0xD7
99 BB87 OUT 0x17,R24
(0092) PW_OFF;WDR();
9A 98C4 CBI 0x18,4
9B 95A8 WDR
9C 9180 0060 LDS R24,pw_off_ram
9E 3A8A CPI R24,0xAA
9F F3C1 BEQ 0x0098
(0093) }
(0094) MCUSR=0;
A0 2422 CLR R2
A1 BE24 OUT 0x34,R2
(0095) WDTCR=0x1f;
A2 E18F LDI R24,0x1F
A3 BD81 OUT 0x21,R24
(0096) WDTCR=0x0f;//WD=2Second
A4 E08F LDI R24,0xF
A5 BD81 OUT 0x21,R24
(0097) OCR0A = 0x5D;
A6 E58D LDI R24,0x5D
A7 BF86 OUT 0x36,R24
(0098) OCR0B = 0x5D;
A8 BD89 OUT 0x29,R24
(0099) TCNT0 = 0xA3; //set count
A9 EA83 LDI R24,0xA3
AA BF82 OUT 0x32,R24
(0100) TCCR0A = 0x00;
AB BC2F OUT 0x2F,R2
(0101) TCCR0B = 0x05; //start timer
AC E085 LDI R24,5
AD BF83 OUT 0x33,R24
(0102) TIMSK0 = 0x02;
AE E082 LDI R24,2
AF BF89 OUT 0x39,R24
(0103) SEI();
B0 9478 BSET 7
(0104) PORTB = 0b11111000;
B1 EF88 LDI R24,0xF8
B2 BB88 OUT 0x18,R24
(0105) DDRB = 0b11010111;
B3 ED87 LDI R24,0xD7
B4 BB87 OUT 0x17,R24
(0106) time_10ms=0;temp1=0;temp2=0;
B5 9220 0068 STS time_10ms,R2
B7 2400 CLR R0
B8 820C STD Y+4,R0
B9 820D STD Y+5,R0
(0107) do{
(0108) if(temp1!=time_10ms){
BA 9020 0068 LDS R2,time_10ms
BC 800C LDD R0,Y+4
BD 1402 CP R0,R2
BE F031 BEQ 0x00C5
(0109) temp1=time_10ms;
BF 822C STD Y+4,R2
(0110) if((PINB&0x08)==0){
C0 99B3 SBIC 0x16,3
C1 C003 RJMP 0x00C5
(0111) temp2++;
C2 800D LDD R0,Y+5
C3 9403 INC R0
C4 820D STD Y+5,R0
(0112) }
(0113) }
(0114) }while(time_10ms<10);
C5 9180 0068 LDS R24,time_10ms
C7 308A CPI R24,0xA
C8 F388 BCS 0x00BA
(0115) User_ID[0]=EEPROM_read(0x10);
C9 E100 LDI R16,0x10
CA DF68 RCALL _EEPROM_read
CB 9300 0061 STS User_ID,R16
(0116) User_ID[1]=EEPROM_read(0x11);
CD E101 LDI R16,0x11
CE DF64 RCALL _EEPROM_read
CF 9300 0062 STS User_ID+1,R16
(0117) User_ID[2]=EEPROM_read(0x12);
D1 E102 LDI R16,0x12
D2 DF60 RCALL _EEPROM_read
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -