📄 ire.lst
字号:
__text_start:
__start:
2A E5CF LDI R28,0x5F
2B E0D4 LDI R29,4
2C BFCD OUT 0x3D,R28
2D BFDE OUT 0x3E,R29
2E 51CE SUBI R28,0x1E
2F 40D0 SBCI R29,0
30 EA0A LDI R16,0xAA
31 8308 STD Y+0,R16
32 2400 CLR R0
33 E6E0 LDI R30,0x60
34 E0F0 LDI R31,0
35 E010 LDI R17,0
36 36E0 CPI R30,0x60
37 07F1 CPC R31,R17
38 F011 BEQ 0x003B
39 9201 ST R0,Z+
3A CFFB RJMP 0x0036
3B 8300 STD Z+0,R16
3C E5E4 LDI R30,0x54
3D E0F0 LDI R31,0
3E E6A0 LDI R26,0x60
3F E0B0 LDI R27,0
40 E010 LDI R17,0
41 E000 LDI R16,0
42 BF0B OUT 0x3B,R16
43 35E4 CPI R30,0x54
44 07F1 CPC R31,R17
45 F021 BEQ 0x004A
46 95C8 LPM
47 9631 ADIW R30,1
48 920D ST R0,X+
49 CFF9 RJMP 0x0043
4A 940E 00EB CALL _main
_exit:
4C CFFF RJMP _exit
FILE: C:\DOCUME~1\wdd\MYDOCU~1\16实验程序\红外发射\ire.c
(0001) #include <iom16v.h>
(0002) #include <macros.h>
(0003) #define uchar unsigned char
(0004) #define uint unsigned int
(0005)
(0006) //端口初始化
(0007) void port_init(void)
(0008) {
(0009) PORTA = 0xff;
_port_init:
4D EF8F LDI R24,0xFF
4E BB8B OUT 0x1B,R24
(0010) DDRA = 0xff;
4F BB8A OUT 0x1A,R24
(0011) PORTB = 0xff;
50 BB88 OUT 0x18,R24
(0012) DDRB = 0xff;
51 BB87 OUT 0x17,R24
(0013) PORTC = 0xff;
52 BB85 OUT 0x15,R24
(0014) DDRC = 0xff;
53 BB84 OUT 0x14,R24
(0015) PORTD = 0xff;
54 BB82 OUT 0x12,R24
(0016) DDRD = 0xff;
55 BB81 OUT 0x11,R24
56 9508 RET
(0017) }
(0018)
(0019) //T0初始化,产生38k的载波
(0020) // actual value: 38.462KHz (1.2%)
(0021) void timer0_init(void)
(0022) {
(0023) TCCR0 = 0x00; //stop
_timer0_init:
57 2422 CLR R2
58 BE23 OUT 0x33,R2
(0024) ASSR = 0x00; //set async mode
59 BC22 OUT 0x22,R2
(0025) TCNT0 = 0xe8; //set count
5A EE88 LDI R24,0xE8
5B BF82 OUT 0x32,R24
(0026) OCR0 = 0x34;
5C E384 LDI R24,0x34
5D BF8C OUT 0x3C,R24
(0027) TCCR0 = 0x02; //start timer
5E E082 LDI R24,2
5F BF83 OUT 0x33,R24
60 9508 RET
_timer0_ovf_isr:
61 922A ST R2,-Y
62 938A ST R24,-Y
63 B62F IN R2,0x3F
64 922A ST R2,-Y
(0028) }
(0029)
(0030) //T0中断
(0031) #pragma interrupt_handler timer0_ovf_isr:iv_TIM0_OVF
(0032) void timer0_ovf_isr(void)
(0033) {
(0034) TCNT0 = 0xe8; //reload counter value
65 EE88 LDI R24,0xE8
66 BF82 OUT 0x32,R24
(0035) PORTD^=(1<<1); //引脚输出38K信号
67 E082 LDI R24,2
68 B222 IN R2,0x12
69 2628 EOR R2,R24
6A BA22 OUT 0x12,R2
6B 9029 LD R2,Y+
6C BE2F OUT 0x3F,R2
6D 9189 LD R24,Y+
6E 9029 LD R2,Y+
6F 9518 RETI
(0036) }
(0037)
(0038) //TIMER1 initialize - prescale:8
(0039) // WGM: 0) Normal, TOP=0xFFFF
(0040) // desired value: 588Hz
(0041) // actual value: 588.062Hz (0.0%)
(0042) timer1_init(uchar th,uchar tl)
(0043) {
(0044) TIFR|=0X04; //复位溢出标志
_timer1_init:
tl --> R18
th --> R16
70 B788 IN R24,0x38
71 6084 ORI R24,4
72 BF88 OUT 0x38,R24
(0045) TCCR1B = 0x00; //stop
73 2422 CLR R2
74 BC2E OUT 0x2E,R2
(0046) TCNT1H = th; //setup
75 BD0D OUT 0x2D,R16
(0047) TCNT1L = tl;
76 BD2C OUT 0x2C,R18
(0048) TCCR1A = 0x00;
77 BC2F OUT 0x2F,R2
(0049) TCCR1B = 0x02; //start Timer
78 E082 LDI R24,2
79 BD8E OUT 0x2E,R24
(0050) while(!(TIFR&0X04)); //溢出后离开
7A B628 IN R2,0x38
7B FE22 SBRS R2,2
7C CFFD RJMP 0x007A
7D 9508 RET
(0051) }
(0052)
(0053) //call this routine to initialize all peripherals
(0054) void init_devices(void)
(0055) {
(0056) //stop errant interrupts until set up
(0057) CLI(); //disable all interrupts
_init_devices:
7E 94F8 BCLR 7
(0058) port_init();
7F DFCD RCALL _port_init
(0059) timer0_init();
80 DFD6 RCALL _timer0_init
(0060)
(0061) MCUCR = 0x00;
81 2422 CLR R2
82 BE25 OUT 0x35,R2
(0062) GICR = 0x00;
83 BE2B OUT 0x3B,R2
(0063) TIMSK = 0x01; //timer interrupt sources
84 E081 LDI R24,1
85 BF89 OUT 0x39,R24
(0064) SEI(); //re-enable interrupts
86 9478 BSET 7
87 9508 RET
(0065) //all peripherals are now initialized
(0066) }
(0067)
(0068) out_1() //输出1
(0069) {
(0070) TIMSK=0x01; //发送
_out_1:
88 E081 LDI R24,1
89 BF89 OUT 0x39,R24
(0071) timer1_init(0xfb,0xa0); //560us
8A EA20 LDI R18,0xA0
8B EF0B LDI R16,0xFB
8C DFE3 RCALL _timer1_init
(0072) TIMSK=0x00; //停止发送
8D 2422 CLR R2
8E BE29 OUT 0x39,R2
(0073) timer1_init(0xf2,0xb7); //1650us
8F EB27 LDI R18,0xB7
90 EF02 LDI R16,0xF2
91 CFDE RJMP _timer1_init
(0074) }
(0075)
(0076) out_0() //输出0
(0077) {
(0078) TIMSK=0x01; //发送
_out_0:
92 E081 LDI R24,1
93 BF89 OUT 0x39,R24
(0079) timer1_init(0xfb,0xa0); //560us
94 EA20 LDI R18,0xA0
95 EF0B LDI R16,0xFB
96 DFD9 RCALL _timer1_init
(0080) TIMSK=0x00; //停止发送
97 2422 CLR R2
98 BE29 OUT 0x39,R2
(0081) timer1_init(0xfb,0xa0); //560us
99 EA20 LDI R18,0xA0
9A EF0B LDI R16,0xFB
9B CFD4 RJMP _timer1_init
(0082) }
(0083)
(0084) out_f() //输出结束
(0085) {
(0086) TIMSK=0x01; //发送
_out_f:
9C E081 LDI R24,1
9D BF89 OUT 0x39,R24
(0087) timer1_init(0xfb,0xa0); //560us
9E EA20 LDI R18,0xA0
9F EF0B LDI R16,0xFB
A0 DFCF RCALL _timer1_init
(0088) TIMSK=0x00; //停止发送
A1 2422 CLR R2
A2 BE29 OUT 0x39,R2
A3 9508 RET
_send_n:
i --> R22
cc --> R20
bb --> R10
aa --> R12
A4 940E 00F3 CALL push_xgsetF03C
A6 2EA2 MOV R10,R18
A7 2EC0 MOV R12,R16
(0089) }
(0090)
(0091) //发送函数
(0092) void send_n(uchar aa,uchar bb) //aa系统码,bb键码
(0093) {
(0094) uchar cc,i;
(0095) TIMSK=0x01;
A8 E081 LDI R24,1
A9 BF89 OUT 0x39,R24
(0096) timer1_init(0xb9,0x9e); //引导码9ms低
AA E92E LDI R18,0x9E
AB EB09 LDI R16,0xB9
AC DFC3 RCALL _timer1_init
(0097) TIMSK=0x00;
AD 2422 CLR R2
AE BE29 OUT 0x39,R2
(0098) timer1_init(0xdc,0xcf); //引导码4.5ms高
AF EC2F LDI R18,0xCF
B0 ED0C LDI R16,0xDC
B1 DFBE RCALL _timer1_init
(0099) //发送系统码
(0100) cc=0x80;
B2 E840 LDI R20,0x80
(0101) for(i=0;i<8;i++)
B3 2766 CLR R22
B4 C008 RJMP 0x00BD
(0102) {
(0103) if(aa&cc)
B5 2C2C MOV R2,R12
B6 2224 AND R2,R20
B7 F011 BEQ 0x00BA
(0104) {
(0105) out_1();
B8 DFCF RCALL _out_1
(0106) }
B9 C001 RJMP 0x00BB
(0107) else
(0108) {
(0109) out_0();
BA DFD7 RCALL _out_0
(0110) }
(0111) cc=cc>>1;
BB 9546 LSR R20
BC 9563 INC R22
BD 3068 CPI R22,0x8
BE F3B0 BCS 0x00B5
(0112) }
(0113) //发送系统反码
(0114) aa=~aa;
BF 94C0 COM R12
(0115) cc=0x80;
C0 E840 LDI R20,0x80
(0116) for(i=0;i<8;i++)
C1 2766 CLR R22
C2 C008 RJMP 0x00CB
(0117) {
(0118) if(aa&cc)
C3 2C2C MOV R2,R12
C4 2224 AND R2,R20
C5 F011 BEQ 0x00C8
(0119) {
(0120) out_1();
C6 DFC1 RCALL _out_1
(0121) }
C7 C001 RJMP 0x00C9
(0122) else
(0123) {
(0124) out_0();
C8 DFC9 RCALL _out_0
(0125) }
(0126) cc=cc>>1;
C9 9546 LSR R20
CA 9563 INC R22
CB 3068 CPI R22,0x8
CC F3B0 BCS 0x00C3
(0127) }
(0128) //发送键码
(0129) cc=0x80;
CD E840 LDI R20,0x80
(0130) for(i=0;i<8;i++)
CE 2766 CLR R22
CF C008 RJMP 0x00D8
(0131) {
(0132) if(bb&cc)
D0 2C2A MOV R2,R10
D1 2224 AND R2,R20
D2 F011 BEQ 0x00D5
(0133) {
(0134) out_1();
D3 DFB4 RCALL _out_1
(0135) }
D4 C001 RJMP 0x00D6
(0136) else
(0137) {
(0138) out_0();
D5 DFBC RCALL _out_0
(0139) }
(0140) cc=cc>>1;
D6 9546 LSR R20
D7 9563 INC R22
D8 3068 CPI R22,0x8
D9 F3B0 BCS 0x00D0
(0141) }
(0142) //发送键码反码
(0143) bb=~bb;
DA 94A0 COM R10
(0144) cc=0x80;
DB E840 LDI R20,0x80
(0145) for(i=0;i<8;i++)
DC 2766 CLR R22
DD C008 RJMP 0x00E6
(0146) {
(0147) if(bb&cc)
DE 2C2A MOV R2,R10
DF 2224 AND R2,R20
E0 F011 BEQ 0x00E3
(0148) {
(0149) out_1();
E1 DFA6 RCALL _out_1
(0150) }
E2 C001 RJMP 0x00E4
(0151) else
(0152) {
(0153) out_0();
E3 DFAE RCALL _out_0
(0154) }
(0155) cc=cc>>1;
E4 9546 LSR R20
E5 9563 INC R22
E6 3068 CPI R22,0x8
E7 F3B0 BCS 0x00DE
(0156) }
(0157) //结束
(0158) out_f();
E8 DFB3 RCALL _out_f
E9 940C 00FC JMP pop_xgsetF03C
(0159) }
(0160)
(0161) main()
(0162) {
(0163) init_devices();
_main:
EB DF92 RCALL _init_devices
EC C004 RJMP 0x00F1
(0164) while(1)
(0165) {
(0166) send_n(0x00,0x58); //发送遥控码
ED E528 LDI R18,0x58
EE 2700 CLR R16
EF DFB4 RCALL _send_n
(0167) while(1);
FILE: <library>
F0 CFFF RJMP 0x00F0
F1 CFFB RJMP 0x00ED
F2 9508 RET
push_xgsetF03C:
F3 937A ST R23,-Y
F4 936A ST R22,-Y
F5 935A ST R21,-Y
F6 934A ST R20,-Y
F7 92DA ST R13,-Y
F8 92CA ST R12,-Y
F9 92BA ST R11,-Y
FA 92AA ST R10,-Y
FB 9508 RET
pop_xgsetF03C:
FC 90A9 LD R10,Y+
FD 90B9 LD R11,Y+
FE 90C9 LD R12,Y+
FF 90D9 LD R13,Y+
100 9149 LD R20,Y+
101 9159 LD R21,Y+
102 9169 LD R22,Y+
103 9179 LD R23,Y+
104 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -