📄 hongwai.lst
字号:
__start:
__text_start:
72 EFCF LDI R28,0xFF
73 E2D1 LDI R29,0x21
74 BFCD OUT 0x3D,R28
75 BFDE OUT 0x3E,R29
76 51CE SUBI R28,0x1E
77 40D0 SBCI R29,0
78 EA0A LDI R16,0xAA
79 8308 STD Y+0,R16
7A 2400 CLR R0
7B E0E0 LDI R30,0
7C E0F2 LDI R31,2
7D E012 LDI R17,2
7E 30E0 CPI R30,0
7F 07F1 CPC R31,R17
80 F011 BEQ 0x0083
81 9201 ST R0,Z+
82 CFFB RJMP 0x007E
83 8300 STD Z+0,R16
84 EEE4 LDI R30,0xE4
85 E0F0 LDI R31,0
86 E0A0 LDI R26,0
87 E0B2 LDI R27,2
88 E010 LDI R17,0
89 E000 LDI R16,0
8A BF0B OUT 0x3B,R16
8B 3EE4 CPI R30,0xE4
8C 07F1 CPC R31,R17
8D F021 BEQ 0x0092
8E 95C8 LPM
8F 9631 ADIW R30,1
90 920D ST R0,X+
91 CFF9 RJMP 0x008B
92 940E 0095 CALL _main
_exit:
94 CFFF RJMP _exit
FILE: hongwai.c
(0001) #include <iom8515v.h>//和单片机类型相对应的头文件,选择Atmega8515做实验;
(0002) #include <macros.h>
(0003) void delay_nus(unsigned int n);//函数声明,本实验中会用到这两个函数
(0004) void delay_nms(unsigned int n);
(0005) void main(void)//主函数
(0006) { //L6
(0007) unsigned int i;
(0008) unsigned char n;
(0009) TCCR0=BIT(CS01);//T/C0时钟8分频
_main:
n --> R22
i --> R20
95 E082 LDI R24,2
96 BF83 OUT 0x33,R24
(0010) TIMSK=BIT(TOIE0);//允许定时器T/C0溢出中断
97 BF89 OUT 0x39,R24
(0011) SEI();//开中断
98 9478 BSET 7
(0012) DDRD|=BIT(1);
99 9A89 SBI 0x11,1
(0013) PORTD|=BIT(1);
9A 9A91 SBI 0x12,1
(0014) DDRD|=BIT(4);//设置PD4,PC0为输出口
9B 9A8C SBI 0x11,4
(0015) DDRC|=BIT(0);
9C 9AA0 SBI 0x14,0
(0016) DDRD&=~BIT(5);//设置PC5为输入口
9D 988D CBI 0x11,5
(0017) DDRB|=BIT(7)|BIT(0);//定义B口的PB0、PB1为输出口
9E B387 IN R24,0x17
9F 6881 ORI R24,0x81
A0 BB87 OUT 0x17,R24
(0018) PORTB&=~BIT(0);//PB1口输出低电平,绿灯亮
A1 98C0 CBI 0x18,0
(0019) PORTB|=BIT(7);
A2 9AC7 SBI 0x18,7
(0020) DDRD|=BIT(1);
A3 9A89 SBI 0x11,1
(0021) PORTD|=BIT(1);//与门一端输出1
A4 9A91 SBI 0x12,1
A5 C02F RJMP 0x00D5
(0022)
(0023) while(1)
(0024) { //L5
(0025) for (n=0;n<10;n++)
A6 2766 CLR R22
A7 C02B RJMP 0x00D3
(0026) { //L4
(0027) delay_nus(60);
A8 E30C LDI R16,0x3C
A9 E010 LDI R17,0
AA D02C RCALL _delay_nus
(0028) if ((PIND&0B00100000)==0) //检测PD5是否为低电平
AB 9985 SBIC 0x10,5
AC C025 RJMP 0x00D2
(0029) { //L3
(0030) i++;
AD 5F4F SUBI R20,0xFF
AE 4F5F SBCI R21,0xFF
(0031) if (i>8)//如果连续检测到有301-399次PD5都为低电平,则报警
AF E088 LDI R24,0x8
B0 E090 LDI R25,0
B1 1784 CP R24,R20
B2 0795 CPC R25,R21
B3 F4D8 BCC 0x00CF
(0032) { //L2
(0033) CLI();
B4 94F8 BCLR 7
(0034) for(i=0;i<10;i++)
B5 2744 CLR R20
B6 2755 CLR R21
B7 C00E RJMP 0x00C6
(0035) { //L1
(0036) PORTB|=BIT(0);//关闭D0灯
B8 9AC0 SBI 0x18,0
(0037) PORTC|=BIT(0);//打开蜂鸣器
B9 9AA8 SBI 0x15,0
(0038) PORTB^=BIT(7);//翻转D7灯,快闪
BA E880 LDI R24,0x80
BB E090 LDI R25,0
BC B228 IN R2,0x18
BD 2433 CLR R3
BE 2628 EOR R2,R24
BF 2639 EOR R3,R25
C0 BA28 OUT 0x18,R2
(0039) delay_nms(30);
C1 E10E LDI R16,0x1E
C2 E010 LDI R17,0
C3 D021 RCALL _delay_nms
C4 5F4F SUBI R20,0xFF
C5 4F5F SBCI R21,0xFF
C6 304A CPI R20,0xA
C7 E0E0 LDI R30,0
C8 075E CPC R21,R30
C9 F370 BCS 0x00B8
(0040) } //L1
(0041) PORTC&=~BIT(0);//关闭蜂鸣器
CA 98A8 CBI 0x15,0
(0042) PORTB|=BIT(7);//关闭红灯
CB 9AC7 SBI 0x18,7
(0043) i=0;
CC 2744 CLR R20
CD 2755 CLR R21
(0044) SEI();
CE 9478 BSET 7
(0045) } //L2 */
(0046) PORTB&=BIT(0);//打开绿灯
CF B388 IN R24,0x18
D0 7081 ANDI R24,1
D1 BB88 OUT 0x18,R24
D2 9563 INC R22
D3 306A CPI R22,0xA
D4 F298 BCS 0x00A8
D5 CFD0 RJMP 0x00A6
D6 9508 RET
_delay_nus:
i --> R20
n --> R16
D7 934A ST R20,-Y
D8 935A ST R21,-Y
(0047) } //L3
(0048) } //L4
(0049) }
(0050) //-------------------码调制----------------------------/
(0051) /*** CLI();//PD0连续2ms都无输出
(0052) PORTD&=~BIT(4);
(0053) delay_nms(2);
(0054) TCNT0=245;
(0055) SEI();//PD0连续600us产生38KHZ信号
(0056) //delay_nus(100);
(0057) } //L5 */
(0058)
(0059) } //L6
(0060)
(0061) //#pragma interrupt_handler LED0:iv_TIMER0_OVF//指定中断服务程序的入口
(0062) /***********void LED0(void)//产生38KHz的方波信号
(0063) {
(0064) PORTD^=BIT(4);//翻转PD0口电平
(0065) TCNT0=245;
(0066) } **/
(0067)
(0068) void delay_nus(unsigned int n)//n微秒延时函数
(0069) {
(0070) unsigned int i;
(0071) for (i=0;i<n;i++)
D9 2744 CLR R20
DA 2755 CLR R21
DB C003 RJMP 0x00DF
(0072) {
(0073) asm("nop");
DC 0000 NOP
DD 5F4F SUBI R20,0xFF
DE 4F5F SBCI R21,0xFF
DF 1740 CP R20,R16
E0 0751 CPC R21,R17
E1 F3D0 BCS 0x00DC
E2 9159 LD R21,Y+
E3 9149 LD R20,Y+
E4 9508 RET
_delay_nms:
i --> R20
n --> R10
E5 940E 00F5 CALL push_xgset300C
E7 0158 MOVW R10,R16
(0074) }
(0075) }
(0076)
(0077) void delay_nms(unsigned int n)//n毫秒延时函数
(0078) {
(0079) unsigned int i;
(0080) for (i=0;i<n;i++) //执行n次1毫秒延时
E8 2744 CLR R20
E9 2755 CLR R21
EA C005 RJMP 0x00F0
(0081) delay_nus(1000);
FILE: <library>
EB EE08 LDI R16,0xE8
EC E013 LDI R17,3
ED DFE9 RCALL _delay_nus
EE 5F4F SUBI R20,0xFF
EF 4F5F SBCI R21,0xFF
F0 154A CP R20,R10
F1 055B CPC R21,R11
F2 F3C0 BCS 0x00EB
F3 940C 00FA JMP pop_xgset300C
push_xgset300C:
F5 935A ST R21,-Y
F6 934A ST R20,-Y
F7 92BA ST R11,-Y
F8 92AA ST R10,-Y
F9 9508 RET
pop_xgset300C:
FA 90A9 LD R10,Y+
FB 90B9 LD R11,Y+
FC 9149 LD R20,Y+
FD 9159 LD R21,Y+
FE 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -