📄 lesson1.lst
字号:
__text_start:
__start:
13 E5CF LDI R28,0x5F
14 E0D4 LDI R29,4
15 BFCD OUT 0x3D,R28
16 BFDE OUT 0x3E,R29
17 51C0 SUBI R28,0x10
18 40D0 SBCI R29,0
19 EA0A LDI R16,0xAA
1A 8308 STD Y+0,R16
1B 2400 CLR R0
1C E6E0 LDI R30,0x60
1D E0F0 LDI R31,0
1E E010 LDI R17,0
1F 36E0 CPI R30,0x60
20 07F1 CPC R31,R17
21 F011 BEQ 0x0024
22 9201 ST R0,Z+
23 CFFB RJMP 0x001F
24 8300 STD Z+0,R16
25 E2E6 LDI R30,0x26
26 E0F0 LDI R31,0
27 E6A0 LDI R26,0x60
28 E0B0 LDI R27,0
29 E010 LDI R17,0
2A E000 LDI R16,0
2B BF0B OUT 0x3B,R16
2C 32E6 CPI R30,0x26
2D 07F1 CPC R31,R17
2E F021 BEQ 0x0033
2F 95C8 LPM
30 9631 ADIW R30,1
31 920D ST R0,X+
32 CFF9 RJMP 0x002C
33 D072 RCALL _main
_exit:
34 CFFF RJMP _exit
_Delayms:
i --> R20
j --> R22
ms --> R16
35 D0C5 RCALL push_xgsetF000
FILE: C:\iccv7avr\examples.avr\chengxu\lesson1\lesson1.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) #define uchar unsigned char
(0012) #define uint unsigned int
(0013) /*******************************************
(0014) 函数名称: Delayms
(0015) 功 能: 延长点亮或者熄灭LED的时间
(0016) 参 数: ms 延长多少毫秒
(0017) 返回值 : 无
(0018) ********************************************/
(0019) void Delayms(uint ms)
(0020) {
(0021) uint i,j;
(0022) for(i=0;i<ms;i++)
36 2744 CLR R20
37 2755 CLR R21
38 C00B RJMP 0x0044
(0023) {
(0024) for(j=0;j<1141;j++);
39 2766 CLR R22
3A 2777 CLR R23
3B C002 RJMP 0x003E
3C 5F6F SUBI R22,0xFF
3D 4F7F SBCI R23,0xFF
3E 3765 CPI R22,0x75
3F E0E4 LDI R30,4
40 077E CPC R23,R30
41 F3D0 BCS 0x003C
42 5F4F SUBI R20,0xFF
43 4F5F SBCI R21,0xFF
44 1740 CP R20,R16
45 0751 CPC R21,R17
46 F390 BCS 0x0039
47 C0B8 RJMP pop_xgsetF000
_One_led:
i --> Y,+1
light --> R20
number --> R10
48 92AA ST R10,-Y
49 934A ST R20,-Y
4A 2F42 MOV R20,R18
4B 2EA0 MOV R10,R16
(0025) }
(0026) }
(0027)
(0028) /*******************************************
(0029) 函数名称: One_led
(0030) 功 能: 点亮或者熄灭指定的LED
(0031) 参 数: number--指定的LED
(0032) light--为1的时候为点亮LED,为0的时候为熄灭LED
(0033) 返回值 : 无
(0034) /********************************************/
(0035) void One_led(uchar number,uchar light)
(0036) {uchar i;
(0037) if(light==1) //点亮操作
4C 3041 CPI R20,1
4D F451 BNE 0x0058
(0038) {
(0039) PORTA|=BIT(number); //更新数据
4E E001 LDI R16,1
4F 2D1A MOV R17,R10
50 D0C2 RCALL lsl8
51 B22B IN R2,0x1B
52 2A20 OR R2,R16
53 BA2B OUT 0x1B,R2
(0040) Delayms(10); //调整时序
54 E00A LDI R16,0xA
55 E010 LDI R17,0
56 DFDE RCALL _Delayms
(0041) }
57 C00B RJMP 0x0063
(0042) else
(0043) {
(0044) PORTA&=~BIT(number); //更新数据
58 E001 LDI R16,1
59 2D1A MOV R17,R10
5A D0B8 RCALL lsl8
5B 2E20 MOV R2,R16
5C 9420 COM R2
5D B23B IN R3,0x1B
5E 2032 AND R3,R2
5F BA3B OUT 0x1B,R3
(0045) Delayms(10); //调整时序
60 E00A LDI R16,0xA
61 E010 LDI R17,0
62 DFD2 RCALL _Delayms
(0046) }
63 9149 LD R20,Y+
64 90A9 LD R10,Y+
65 9508 RET
_All_led:
light --> R10
66 92AA ST R10,-Y
67 2EA0 MOV R10,R16
(0047) }
(0048) /*******************************************
(0049) 函数名称: All_led
(0050) 功 能: 点亮或者熄灭全部LED
(0051) 参 数: light--为1的时候为点亮全部LED,为0的时候为熄灭全部LED
(0052) 返回值 : 无
(0053) /********************************************/
(0054) void All_led(uchar light)
(0055) {
(0056) if(light)
68 20AA TST R10
69 F031 BEQ 0x0070
(0057) {
(0058) PORTA=0XFF; //输出数据
6A EF8F LDI R24,0xFF
6B BB8B OUT 0x1B,R24
(0059) Delayms(5); //调整时序
6C E005 LDI R16,5
6D E010 LDI R17,0
6E DFC6 RCALL _Delayms
(0060) }
6F C005 RJMP 0x0075
(0061) else
(0062) {
(0063) PORTA=0X00; //输出数据
70 2422 CLR R2
71 BA2B OUT 0x1B,R2
(0064) Delayms(5); //调整时序
72 E005 LDI R16,5
73 E010 LDI R17,0
74 DFC0 RCALL _Delayms
(0065) }
75 90A9 LD R10,Y+
76 9508 RET
_Flow_LED:
i --> R20
MS --> R10
77 92AA ST R10,-Y
78 934A ST R20,-Y
79 2EA0 MOV R10,R16
(0066) }
(0067) /*******************************************
(0068) 函数名称: Flow_led
(0069) 功 能: 流水灯(循环一次)
(0070) 参 数: MS--点亮相邻LED的时间间隔,单位是毫秒
(0071) 返回值 : 无
(0072) /********************************************/
(0073) void Flow_LED(uchar MS)
(0074) {
(0075) uchar i;
(0076) for(i=0;i<8;i++) //循环8次,8个LED依次点亮
7A 2744 CLR R20
7B C00B RJMP 0x0087
(0077) {
(0078) All_led(0); //全部熄灭
7C 2700 CLR R16
7D DFE8 RCALL _All_led
(0079) One_led(i,1); //点亮指定的LED
7E E021 LDI R18,1
7F 2F04 MOV R16,R20
80 DFC7 RCALL _One_led
(0080) Delayms(MS); //延时指定的时间
81 2D0A MOV R16,R10
82 2711 CLR R17
83 DFB1 RCALL _Delayms
(0081) All_led(0); //全部熄灭
84 2700 CLR R16
85 DFE0 RCALL _All_led
86 9543 INC R20
87 3048 CPI R20,0x8
88 F398 BCS 0x007C
89 9149 LD R20,Y+
8A 90A9 LD R10,Y+
8B 9508 RET
_Flash_LED:
time --> R20
MS --> R10
number --> R12
8C D078 RCALL push_xgset303C
8D 2EA2 MOV R10,R18
8E 2EC0 MOV R12,R16
(0082) }
(0083) }
(0084) /*******************************************
(0085) 函数名称: Flash_led
(0086) 功 能: 闪烁指定的LED(第几盏就闪烁几次)
(0087) 参 数: number--指定的LED
(0088) MS--LED闪烁的时间间隔
(0089) 返回值 : 无
(0090) /********************************************/
(0091) void Flash_LED(uchar number,uchar MS)
(0092) {
(0093) uchar time=6;
8F E046 LDI R20,6
(0094) for(;time>0;time--)
90 C011 RJMP 0x00A2
(0095) {
(0096) All_led(0); //熄灭所有的LED
91 2700 CLR R16
92 DFD3 RCALL _All_led
(0097) One_led(number,1); //点亮指定的LED
93 E021 LDI R18,1
94 2D0C MOV R16,R12
95 DFB2 RCALL _One_led
(0098) Delayms(MS); //延时指定的时间
96 2D0A MOV R16,R10
97 2711 CLR R17
98 DF9C RCALL _Delayms
(0099) All_led(0); //熄灭所有的LED
99 2700 CLR R16
9A DFCB RCALL _All_led
(0100) Delayms(MS); //延时指定的时间
9B 2D0A MOV R16,R10
9C 2711 CLR R17
9D DF97 RCALL _Delayms
(0101) One_led(number,0); //熄灭指定的LED
9E 2722 CLR R18
9F 2D0C MOV R16,R12
A0 DFA7 RCALL _One_led
A1 954A DEC R20
A2 E080 LDI R24,0
A3 1784 CP R24,R20
A4 F360 BCS 0x0091
A5 C066 RJMP pop_xgset303C
(0102) }
(0103) }
(0104) /*******************************************
(0105) 函数名称: main
(0106) 功 能: 1. 流水灯 2.闪烁指定的LED
(0107) 参 数: 无
(0108) 返回值 : 无
(0109) /********************************************/
(0110) void main()
(0111) {
(0112) uint b,i;
(0113) b=0;
_main:
i --> R22
b --> R20
A6 2744 CLR R20
A7 2755 CLR R21
(0114) DDRA=0XFF; //b指定闪烁的LED
A8 EF8F LDI R24,0xFF
A9 BB8A OUT 0x1A,R24
AA C032 RJMP 0x00DD
(0115) while(1)
(0116) {
(0117) if(b<3600)b++,b++;
AB 3140 CPI R20,0x10
AC E0EE LDI R30,0xE
AD 075E CPC R21,R30
AE F420 BCC 0x00B3
AF 5F4F SUBI R20,0xFF
B0 4F5F SBCI R21,0xFF
B1 5F4F SUBI R20,0xFF
B2 4F5F SBCI R21,0xFF
(0118) if(b%7==0)b++;
B3 E027 LDI R18,7
B4 E030 LDI R19,0
B5 018A MOVW R16,R20
B6 D028 RCALL mod16u
B7 3000 CPI R16,0
B8 0701 CPC R16,R17
B9 F411 BNE 0x00BC
BA 5F4F SUBI R20,0xFF
BB 4F5F SBCI R21,0xFF
(0119) if(b==3600)b=0;
BC 3140 CPI R20,0x10
BD E0EE LDI R30,0xE
BE 075E CPC R21,R30
BF F411 BNE 0x00C2
C0 2744 CLR R20
C1 2755 CLR R21
(0120) i=(int)(b%8>0);
C2 01CA MOVW R24,R20
C3 7087 ANDI R24,7
C4 7090 ANDI R25,0
C5 3080 CPI R24,0
C6 0789 CPC R24,R25
C7 F019 BEQ 0x00CB
C8 E061 LDI R22,1
C9 E070 LDI R23,0
CA C002 RJMP 0x00CD
CB 2766 CLR R22
CC 2777 CLR R23
(0121) switch(i)
CD 3060 CPI R22,0
CE 0767 CPC R22,R23
CF F029 BEQ 0x00D5
D0 3061 CPI R22,1
D1 E0E0 LDI R30,0
D2 077E CPC R23,R30
D3 F021 BEQ 0x00D8
D4 C008 RJMP 0x00DD
(0122) {
(0123) case 0:
(0124) Flow_LED(200); //i=0,以流水灯的方式显示
D5 EC08 LDI R16,0xC8
D6 DFA0 RCALL _Flow_LED
(0125) break;
D7 C005 RJMP 0x00DD
(0126) case 1:
(0127) Flash_LED(b%8,100); //i=1,以闪烁灯的方式显示
FILE: <library>
D8 E624 LDI R18,0x64
D9 2F04 MOV R16,R20
DA 7007 ANDI R16,7
DB 7010 ANDI R17,0
DC DFAF RCALL _Flash_LED
DD CFCD RJMP 0x00AB
DE 9508 RET
mod16u:
DF 9468 BSET 6
E0 C001 RJMP xdiv16u
div16u:
E1 94E8 BCLR 6
xdiv16u:
E2 92EA ST R14,-Y
E3 92FA ST R15,-Y
E4 938A ST R24,-Y
E5 24EE CLR R14
E6 24FF CLR R15
E7 E180 LDI R24,0x10
E8 0F00 LSL R16
E9 1F11 ROL R17
EA 1CEE ROL R14
EB 1CFF ROL R15
EC 16E2 CP R14,R18
ED 06F3 CPC R15,R19
EE F018 BCS 0x00F2
EF 1AE2 SUB R14,R18
F0 0AF3 SBC R15,R19
F1 9503 INC R16
F2 958A DEC R24
F3 F7A1 BNE 0x00E8
F4 F416 BRTC 0x00F7
F5 2D0E MOV R16,R14
F6 2D1F MOV R17,R15
F7 9189 LD R24,Y+
F8 90F9 LD R15,Y+
F9 90E9 LD R14,Y+
FA 9508 RET
push_xgsetF000:
FB 937A ST R23,-Y
FC 936A ST R22,-Y
FD 935A ST R21,-Y
FE 934A ST R20,-Y
FF 9508 RET
pop_xgsetF000:
100 9149 LD R20,Y+
101 9159 LD R21,Y+
102 9169 LD R22,Y+
103 9179 LD R23,Y+
104 9508 RET
push_xgset303C:
105 935A ST R21,-Y
106 934A ST R20,-Y
107 92DA ST R13,-Y
108 92CA ST R12,-Y
109 92BA ST R11,-Y
10A 92AA ST R10,-Y
10B 9508 RET
pop_xgset303C:
10C 90A9 LD R10,Y+
10D 90B9 LD R11,Y+
10E 90C9 LD R12,Y+
10F 90D9 LD R13,Y+
110 9149 LD R20,Y+
111 9159 LD R21,Y+
112 9508 RET
lsl8:
113 2311 TST R17
114 F019 BEQ 0x0118
115 0F00 LSL R16
116 951A DEC R17
117 CFFB RJMP lsl8
118 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -