📄 main.lst
字号:
__text_start:
__start:
002A E5CF LDI R28,0x5F
002B E0D4 LDI R29,4
002C BFCD OUT 0x3D,R28
002D BFDE OUT 0x3E,R29
002E 51C0 SUBI R28,0x10
002F 40D0 SBCI R29,0
0030 EA0A LDI R16,0xAA
0031 8308 STD Y+0,R16
0032 2400 CLR R0
0033 E6E0 LDI R30,0x60
0034 E0F0 LDI R31,0
0035 E010 LDI R17,0
0036 36E0 CPI R30,0x60
0037 07F1 CPC R31,R17
0038 F011 BEQ 0x003B
0039 9201 ST R0,Z+
003A CFFB RJMP 0x0036
003B 8300 STD Z+0,R16
003C E5E4 LDI R30,0x54
003D E0F0 LDI R31,0
003E E6A0 LDI R26,0x60
003F E0B0 LDI R27,0
0040 E010 LDI R17,0
0041 35E4 CPI R30,0x54
0042 07F1 CPC R31,R17
0043 F021 BEQ 0x0048
0044 95C8 LPM
0045 9631 ADIW R30,1
0046 920D ST R0,X+
0047 CFF9 RJMP 0x0041
0048 940E008F CALL _main
_exit:
004A CFFF RJMP _exit
FILE: D:\桌面\实验教程\LED应用\led用于程序调试\main.c
(0001) //ICC-AVR application builder : 2007-1-29 10:04:38
(0002) // Target : M16
(0003) // Crystal: 7.3728Mhz
(0004) // 功能:LED指示灯用于程序调试
(0005) // 作者:古欣
(0006) // AVR与虚拟仪器 http://www.avrvi.com
(0007)
(0008) #include <iom16v.h>
(0009) #include <macros.h>
(0010)
(0011) #define led_port PORTA
(0012) //定义输出端口
(0013) #define led_ddr DDRA
(0014) //定义输出控制寄存器
(0015) //可以自行修改,必须保持 led_port和led_ddr一致,PORTA对应DDRA
(0016)
(0017) //使用 |= 置一 , &=~ 清零 , ^= 取反 都是只对选择位进行操作,不会对同一个口的其他位造成影响。
(0018)
(0019) void port_init(void)
(0020) {
(0021) PORTA = 0x00;
_port_init:
004B 2422 CLR R2
004C BA2B OUT 0x1B,R2
(0022) DDRA = 0x00;
004D BA2A OUT 0x1A,R2
(0023) PORTB = 0x00;
004E BA28 OUT 0x18,R2
(0024) DDRB = 0x00;
004F BA27 OUT 0x17,R2
(0025) PORTC = 0x00; //m103 output only
0050 BA25 OUT 0x15,R2
(0026) DDRC = 0x00;
0051 BA24 OUT 0x14,R2
(0027) PORTD = 0x00;
0052 BA22 OUT 0x12,R2
(0028) DDRD = 0x00;
0053 BA21 OUT 0x11,R2
(0029) led_ddr|=0x03; //设置LED的0和1端口为输出,其余不变
0054 B38A IN R24,0x1A
0055 6083 ORI R24,3
0056 BB8A OUT 0x1A,R24
0057 9508 RET
(0030) }
(0031)
(0032) //call this routine to initialize all peripherals
(0033) //此处为ICC系统生成,未做更改
(0034) void init_devices(void)
(0035) {
(0036) //stop errant interrupts until set up
(0037) CLI(); //disable all interrupts
_init_devices:
0058 94F8 BCLR 7
(0038) port_init();
0059 DFF1 RCALL _port_init
(0039)
(0040) MCUCR = 0x00;
005A 2422 CLR R2
005B BE25 OUT 0x35,R2
(0041) GICR = 0x00;
005C BE2B OUT 0x3B,R2
(0042) TIMSK = 0x00; //timer interrupt sources
005D BE29 OUT 0x39,R2
(0043) SEI(); //re-enable interrupts
005E 9478 BSET 7
005F 9508 RET
(0044) //all peripherals are now initialized
(0045) }
(0046)
(0047) void Delay(void) //延时,没有详细计算
(0048) {
(0049) unsigned char i,j;
(0050) for(i=200;i>0;i--)
_Delay:
i --> R16
j --> R18
0060 EC08 LDI R16,0xC8
0061 C007 RJMP 0x0069
(0051) {
(0052) for(j=200;j>0;j--)
0062 EC28 LDI R18,0xC8
0063 C001 RJMP 0x0065
0064 952A DEC R18
0065 2422 CLR R2
0066 1622 CP R2,R18
0067 F3E0 BCS 0x0064
0068 950A DEC R16
0069 2422 CLR R2
006A 1620 CP R2,R16
006B F3B0 BCS 0x0062
006C 9508 RET
_right:
i --> R20
006D 940E00A0 CALL push_gset1
(0053) ;
(0054) }
(0055) }
(0056)
(0057) void right(void) //01两个灯来回闪烁三次,指示工作正常。
(0058) {
(0059) unsigned int i;
(0060) for(i=3;i!=0;i--)
006F E043 LDI R20,3
0070 E050 LDI R21,0
0071 C00A RJMP 0x007C
(0061) {
(0062) led_port |= 0x01; //0位置一
0072 9AD8 SBI 0x1B,0
(0063) led_port &=~ 0x02; //1位清零
0073 98D9 CBI 0x1B,1
(0064) Delay(); //延时
0074 DFEB RCALL _Delay
(0065) led_port ^= 0x03; //0位和1位翻转
0075 E083 LDI R24,3
0076 B22B IN R2,0x1B
0077 2628 EOR R2,R24
0078 BA2B OUT 0x1B,R2
(0066) Delay(); //延时
0079 DFE6 RCALL _Delay
007A 5041 SUBI R20,1
007B 4050 SBCI R21,0
007C 3040 CPI R20,0
007D 0745 CPC R20,R21
007E F799 BNE 0x0072
(0067) }
(0068) led_port |= 0x03; //置一,都灭。
007F B38B IN R24,0x1B
0080 6083 ORI R24,3
0081 BB8B OUT 0x1B,R24
0082 940E00A3 CALL pop_gset1
0084 9508 RET
(0069) }
(0070)
(0071) void report_1(void) //一灭一亮
(0072) {
(0073) led_port |= 0x01; //0位置一
_report_1:
0085 9AD8 SBI 0x1B,0
(0074) led_port &=~ 0x02; //1位清零
0086 98D9 CBI 0x1B,1
0087 9508 RET
(0075) }
(0076)
(0077) void report_2(void) //一亮一灭
(0078) {
(0079) led_port |= 0x02; //0位置一
_report_2:
0088 9AD9 SBI 0x1B,1
(0080) led_port &=~ 0x01; //1位清零
0089 98D8 CBI 0x1B,0
008A 9508 RET
(0081) }
(0082)
(0083) void error(void)
(0084) {
(0085) led_port &=~ 0x03; //同时清零,都亮,表示错误
_error:
008B B38B IN R24,0x1B
008C 7F8C ANDI R24,0xFC
008D BB8B OUT 0x1B,R24
008E 9508 RET
(0086) }
(0087)
(0088) //有时候做比较大的程序,无法确认程序是否正常运行,
(0089) //就需要在程序中添加调试语句,以查看程序运行到什么地方。
(0090) //至于什么情况表示什么含义,看你自己喜欢
(0091) void main(void)
(0092) {
(0093) init_devices();
_main:
008F DFC8 RCALL _init_devices
(0094) right(); //指示进入程序正常工作
0090 DFDC RCALL _right
(0095)
(0096) if(1==1) //只为演示,并无意义。
(0097) {
(0098) report_1(); //调用一灭一亮
0091 DFF3 RCALL _report_1
(0099) }
(0100)
(0101) if(1<0)
0092 C002 RJMP 0x0095
(0102) {
(0103) report_2();
0093 DFF4 RCALL _report_2
(0104) }
0094 C001 RJMP 0x0096
(0105) else
(0106) {
(0107) error(); //错误。
0095 DFF5 RCALL _error
(0108) }
(0109)
(0110) while(1); //程序进入循环,防止跑飞。
FILE: <library>
0096 CFFF RJMP 0x0096
0097 9508 RET
push_gset5:
0098 92FA ST R15,-Y
0099 92EA ST R14,-Y
push_gset4:
009A 92DA ST R13,-Y
009B 92CA ST R12,-Y
push_gset3:
009C 92BA ST R11,-Y
009D 92AA ST R10,-Y
push_gset2:
009E 937A ST R23,-Y
009F 936A ST R22,-Y
push_gset1:
00A0 935A ST R21,-Y
00A1 934A ST R20,-Y
00A2 9508 RET
pop_gset1:
00A3 E0E1 LDI R30,1
pop:
00A4 9149 LD R20,Y+
00A5 9159 LD R21,Y+
00A6 FDE0 SBRC R30,0
00A7 9508 RET
00A8 9169 LD R22,Y+
00A9 9179 LD R23,Y+
00AA FDE1 SBRC R30,1
00AB 9508 RET
00AC 90A9 LD R10,Y+
00AD 90B9 LD R11,Y+
00AE FDE2 SBRC R30,2
00AF 9508 RET
00B0 90C9 LD R12,Y+
00B1 90D9 LD R13,Y+
00B2 FDE3 SBRC R30,3
00B3 9508 RET
00B4 90E9 LD R14,Y+
00B5 90F9 LD R15,Y+
00B6 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -