📄 usbd12.lst
字号:
__text_start:
__start:
006F E5CF LDI R28,0x5F
0070 E0D4 LDI R29,4
0071 BFCD OUT P3D,R28
0072 BFDE OUT P3E,R29
0073 51C0 SUBI R28,0x10
0074 40D0 SBCI R29,0
0075 EA0A LDI R16,0xAA
0076 8308 STD R16,0+Y
0077 2400 CLR R0
0078 ECEA LDI R30,0xCA
0079 E0F0 LDI R31,0
007A E011 LDI R17,1
007B 33E0 CPI R30,0x30
007C 07F1 CPC R31,R17
007D F011 BEQ 0x0080
007E 9201 ST R0,Z+
007F CFFB RJMP 0x007B
0080 8300 STD R16,0+Z
0081 E7E4 LDI R30,0x74
0082 E0F0 LDI R31,0
0083 E6A0 LDI R26,0x60
0084 E0B0 LDI R27,0
0085 E010 LDI R17,0
0086 3DEE CPI R30,0xDE
0087 07F1 CPC R31,R17
0088 F021 BEQ 0x008D
0089 95C8 LPM
008A 9631 ADIW R30,1
008B 920D ST R0,X+
008C CFF9 RJMP 0x0086
008D 940E06E3 CALL _main
_exit:
008F CFFF RJMP _exit
_Delayus:
i --> R20
US --> R22
0090 940E0758 CALL push_gset2
0092 01B8 MOVW R22,R16
FILE: C:\icc\include\AVR_PQ1A.h
(0001) /*******************************************
(0002) 文件:AVR_PQ1A.H
(0003) 功能:定义一些AVR_PQ1A开发板上应用程序用到的常量
(0004) /******************************************/
(0005)
(0006) #include <iom16v.h> //包含型号头文件
(0007) #include <macros.h> //包含"位"操作头文件
(0008)
(0009) /******************数据类型宏定义******************/
(0010) #define uchar unsigned char
(0011) #define uint unsigned int
(0012)
(0013) /******************数码管和LED常量******************/
(0014) #define LEDLK PA2 //LED锁存器控制端
(0015) #define SEGLK PA3 //数码管段选锁存器控制端
(0016) #define BITLK PA4 //数码管位选锁存器控制端
(0017)
(0018) #define TRUE 1
(0019) #define FALSE 0
(0020) #define ALLLED 0XFF
(0021) /*******************************************
(0022) 函数名称: Delayus
(0023) 功 能: 延时指定微秒(8M晶振)
(0024) 参 数: US--延时的微秒数(大约,不是很精确,MS越大越准确)
(0025) 返回值 : 无
(0026) /********************************************/
(0027) void Delayus(uint US)
(0028) {
(0029) uint i;
(0030) US=US*5/4; //5/4是在8MHz晶振下,通过软件仿真反复实验得到的数值
0093 E005 LDI R16,5
0094 E010 LDI R17,0
0095 019B MOVW R18,R22
0096 940E0703 CALL empy16s
0098 01B8 MOVW R22,R16
0099 9576 LSR R23
009A 9567 ROR R22
009B 9576 LSR R23
009C 9567 ROR R22
(0031) for( i=0;i<US;i++);
009D 2744 CLR R20
009E 2755 CLR R21
009F C002 RJMP 0x00A2
00A0 5F4F SUBI R20,0xFF
00A1 4F5F SBCI R21,0xFF
00A2 1746 CP R20,R22
00A3 0757 CPC R21,R23
00A4 F3D8 BCS 0x00A0
(0032) }
00A5 940E0760 CALL pop_gset2
00A7 9508 RET
_Delayms:
i --> R20
j --> R22
MS --> R16
00A8 940E0758 CALL push_gset2
(0033) /*******************************************
(0034) 函数名称: Delayms
(0035) 功 能: 延时指定毫秒(8M晶振)
(0036) 参 数: MS--延时的毫秒数
(0037) 返回值 : 无
(0038) /********************************************/
(0039) void Delayms(uint MS)
(0040) {
(0041) uint i,j;
(0042) for( i=0;i<MS;i++)
00AA 2744 CLR R20
00AB 2755 CLR R21
00AC C00B RJMP 0x00B8
(0043) for(j=0;j<1141;j++); //1141是在8MHz晶振下,通过软件仿真反复实验得到的数值
00AD 2766 CLR R22
00AE 2777 CLR R23
00AF C002 RJMP 0x00B2
00B0 5F6F SUBI R22,0xFF
00B1 4F7F SBCI R23,0xFF
00B2 3765 CPI R22,0x75
00B3 E0E4 LDI R30,4
00B4 077E CPC R23,R30
00B5 F3D0 BCS 0x00B0
00B6 5F4F SUBI R20,0xFF
00B7 4F5F SBCI R21,0xFF
00B8 1740 CP R20,R16
00B9 0751 CPC R21,R17
00BA F390 BCS 0x00AD
(0044) }
00BB 940E0760 CALL pop_gset2
00BD 9508 RET
(0045) /*******************************************
(0046) 函数名称: Board_init
(0047) 功 能: 初始化实验板,关闭全部功能
(0048) 参 数: 无
(0049) 返回值 : 无
(0050) /********************************************/
(0051) void Board_init(void)
(0052) {
(0053) DDRA=0xFF; //将四个IO口全部配置为输出
_Board_init:
00BE EF8F LDI R24,0xFF
00BF BB8A OUT P1A,R24
(0054) DDRB=0xFF;
00C0 BB87 OUT P17,R24
(0055) DDRC=0xFF;
00C1 BB84 OUT P14,R24
(0056) DDRD=0xFF;
00C2 BB81 OUT P11,R24
(0057)
(0058) SPCR=0x00; //还原SPI口,使其为正常端口
00C3 2422 CLR R2
00C4 B82D OUT P0D,R2
(0059)
(0060) PORTA|=BIT(PA6);//(BEEP)关闭蜂鸣器
00C5 9ADE SBI P1B,6
(0061) PORTC&=~BIT(PC6); //(RELAY)初始化继电器为常闭连接状态
00C6 98AE CBI P15,6
(0062) PORTA&=~BIT(PA1); //关闭SPI总线DA
00C7 98D9 CBI P1B,1
(0063) PORTB=0xFF; //关闭LED
00C8 BB88 OUT P18,R24
(0064) PORTA|=BIT(LEDLK); //锁存数据,使LED熄灭
00C9 9ADA SBI P1B,2
(0065) Delayus(5);
00CA E005 LDI R16,5
00CB E010 LDI R17,0
00CC DFC3 RCALL _Delayus
(0066) PORTA&=~BIT(LEDLK);
00CD 98DA CBI P1B,2
(0067)
(0068) PORTB=0x00; //输出段选
00CE 2422 CLR R2
00CF BA28 OUT P18,R2
(0069) PORTA|=BIT(SEGLK);
00D0 9ADB SBI P1B,3
(0070) Delayus(50);
00D1 E302 LDI R16,0x32
00D2 E010 LDI R17,0
00D3 DFBC RCALL _Delayus
(0071) PORTA&=~BIT(SEGLK);
00D4 98DB CBI P1B,3
(0072)
(0073) PORTB=0xFF; //输出位选
00D5 EF8F LDI R24,0xFF
00D6 BB88 OUT P18,R24
(0074) PORTA|=BIT(BITLK);
00D7 9ADC SBI P1B,4
(0075) Delayus(50);
00D8 E302 LDI R16,0x32
00D9 E010 LDI R17,0
00DA DFB5 RCALL _Delayus
(0076) PORTA&=~BIT(BITLK);
00DB 98DC CBI P1B,4
(0077)
(0078) PORTD=0xFF;
00DC EF8F LDI R24,0xFF
00DD BB82 OUT P12,R24
(0079) PORTA|=BIT(PA7);
00DE 9ADF SBI P1B,7
(0080) Delayus(50);
00DF E302 LDI R16,0x32
00E0 E010 LDI R17,0
00E1 DFAE RCALL _Delayus
(0081) PORTA&=~BIT(PA7);
00E2 98DF CBI P1B,7
(0082)
(0083)
(0084) }
00E3 9508 RET
_One_led:
i --> Y+1
light --> R22
number --> R20
00E4 940E0758 CALL push_gset2
00E6 2F62 MOV R22,R18
00E7 2F40 MOV R20,R16
FILE: C:\icc\examples.avr\AVR_PQ1A_DEMO\20_USB\LED.C
(0001) /*******************************************
(0002) 文件:LED.C
(0003) 环境:编译为ICC AVR6.25A,仿真为AVR Studio4.10
(0004) 硬件:ATMEGA16芯片
(0005) 日期:2006年12月10日
(0006) 功能:驱动开发板上的LED。1. 流水灯 2.闪烁指定的LED
(0007) 备注:参考《AVR系列单片机C语言编程与应用实例》(清华大学出版社)
(0008) /******************************************/
(0009) #include <iom16v.h> //包含型号头文件
(0010) #include <macros.h> //包含"位"操作头文件
(0011) #include <stdio.h> //标准输入输出头文件
(0012)
(0013) /*******************************************
(0014) 函数名称: One_led
(0015) 功 能: 点亮或者熄灭指定的LED
(0016) 参 数: number--指定的LED
(0017) light--为TRUE的时候为点亮LED,为FALSE的时候为熄灭LED
(0018) 返回值 : 无
(0019) /********************************************/
(0020) void One_led(uchar number,uchar light)
(0021) {uchar i;
(0022) if(light==TRUE) //点亮操作
00E8 3061 CPI R22,1
00E9 F479 BNE 0x00F9
(0023) {
(0024) PORTB&=~BIT(number); //输出数据
00EA E001 LDI R16,1
00EB 2F14 MOV R17,R20
00EC 940E076F CALL lsl8
00EE 2E20 MOV R2,R16
00EF 9420 COM R2
00F0 B238 IN R3,P18
00F1 2032 AND R3,R2
00F2 BA38 OUT P18,R3
(0025) PORTA|=BIT(LEDLK); //更新数据
00F3 9ADA SBI P1B,2
(0026) Delayms(5); //调整时序
00F4 E005 LDI R16,5
00F5 E010 LDI R17,0
00F6 DFB1 RCALL _Delayms
(0027) PORTA&=~BIT(LEDLK); //锁存数据
00F7 98DA CBI P1B,2
(0028) }
00F8 C00C RJMP 0x0105
(0029) else
(0030) {
(0031) PORTB|=BIT(number); //输出数据
00F9 E001 LDI R16,1
00FA 2F14 MOV R17,R20
00FB 940E076F CALL lsl8
00FD B228 IN R2,P18
00FE 2A20 OR R2,R16
00FF BA28 OUT P18,R2
(0032) PORTA|=BIT(LEDLK); //更新数据
0100 9ADA SBI P1B,2
(0033) Delayms(5); //调整时序
0101 E005 LDI R16,5
0102 E010 LDI R17,0
0103 DFA4 RCALL _Delayms
(0034) PORTA&=~BIT(LEDLK); //锁存数据
0104 98DA CBI P1B,2
(0035) }
(0036) }
0105 940E0760 CALL pop_gset2
0107 9508 RET
_All_led:
light --> R20
0108 940E0741 CALL push_gset1
010A 2F40 MOV R20,R16
(0037) /*******************************************
(0038) 函数名称: All_led
(0039) 功 能: 点亮或者熄灭全部LED
(0040) 参 数: light--为TRUE的时候为点亮全部LED,为FALSE的时候为熄灭全部LED
(0041) 返回值 : 无
(0042) /********************************************/
(0043) void All_led(uchar light)
(0044) {
(0045) if(light)
010B 2344 TST R20
010C F049 BEQ 0x0116
(0046) {
(0047) PORTB&=~ALLLED;
010D B388 IN R24,P18
010E 7080 ANDI R24,0
010F BB88 OUT P18,R24
(0048) PORTA|=BIT(LEDLK);
0110 9ADA SBI P1B,2
(0049) Delayms(5);
0111 E005 LDI R16,5
0112 E010 LDI R17,0
0113 DF94 RCALL _Delayms
(0050) PORTA&=~BIT(LEDLK);
0114 98DA CBI P1B,2
(0051) }
0115 C008 RJMP 0x011E
(0052) else
(0053) {
(0054) PORTB|=ALLLED;
0116 B388 IN R24,P18
0117 6F8F ORI R24,0xFF
0118 BB88 OUT P18,R24
(0055) PORTA|=BIT(LEDLK);
0119 9ADA SBI P1B,2
(0056) Delayms(5);
011A E005 LDI R16,5
011B E010 LDI R17,0
011C DF8B RCALL _Delayms
(0057) PORTA&=~BIT(LEDLK);
011D 98DA CBI P1B,2
(0058) }
(0059) }
011E 940E0744 CALL pop_gset1
0120 9508 RET
_Flow_LED:
i --> R20
MS --> R22
0121 940E0758 CALL push_gset2
0123 2F60 MOV R22,R16
(0060) /*******************************************
(0061) 函数名称: Flow_led
(0062) 功 能: 流水灯(循环一次)
(0063) 参 数: MS--点亮相邻LED的时间间隔
(0064) 返回值 : 无
(0065) /********************************************/
(0066) void Flow_LED(uchar MS)
(0067) {
(0068) uchar i;
(0069) for(i=0;i<8;i++)
0124 2744 CLR R20
0125 C009 RJMP 0x012F
(0070) {
(0071) All_led(FALSE); //全部熄灭
0126 2700 CLR R16
0127 DFE0 RCALL _All_led
(0072) One_led(i,TRUE); //点亮指定的LED
0128 E021 LDI R18,1
0129 2F04 MOV R16,R20
012A DFB9 RCALL _One_led
(0073) Delayms(MS); //延时指定的时间
012B 2F06 MOV R16,R22
012C 2711 CLR R17
012D DF7A RCALL _Delayms
012E 9543 INC R20
012F 3048 CPI R20,0x8
0130 F3A8 BCS 0x0126
(0074) }
(0075) }
0131 940E0760 CALL pop_gset2
0133 9508 RET
_Flash_LED:
MS --> R22
number --> R20
0134 940E0758 CALL push_gset2
0136 2F62 MOV R22,R18
0137 2F40 MOV R20,R16
(0076) /*******************************************
(0077) 函数名称: Flash_led
(0078) 功 能: 闪烁指定的LED(循环一次)
(0079) 参 数: number--指定的LED
(0080) MS--LED闪烁的时间间隔
(0081) 返回值 : 无
(0082) /********************************************/
(0083) void Flash_LED(uchar number,uchar MS)
(0084) {
(0085) One_led(number,TRUE); //点亮指定的LED
0138 E021 LDI R18,1
0139 2F04 MOV R16,R20
013A DFA9 RCALL _One_led
(0086) Delayms(MS); //延时指定的时间
013B 2F06 MOV R16,R22
013C 2711 CLR R17
013D DF6A RCALL _Delayms
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -