📄 lesson1.s
字号:
.module lesson1.c
.area text(rom, con, rel)
.dbfile C:\iccv7avr\examples.avr\chengxu\lesson1\lesson1.c
.dbfunc e Delayms _Delayms fV
; i -> R20,R21
; j -> R22,R23
; ms -> R16,R17
.even
_Delayms::
rcall push_xgsetF000
.dbline -1
.dbline 20
; /*******************************************
; 文件:LED.C
; 环境:编译为ICC AVR6.25A,仿真为AVR Studio4.10
; 硬件:ATMEGA16芯片
; 日期:2006年12月10日
; 功能:驱动开发板上的LED。1. 流水灯 2.闪烁指定的LED
; 备注:参考《AVR系列单片机C语言编程与应用实例》(清华大学出版社)
; /******************************************/
; #include <iom16v.h> //包含型号头文件
; #include <macros.h> //包含"位"操作头文件
; #define uchar unsigned char
; #define uint unsigned int
; /*******************************************
; 函数名称: Delayms
; 功 能: 延长点亮或者熄灭LED的时间
; 参 数: ms 延长多少毫秒
; 返回值 : 无
; ********************************************/
; void Delayms(uint ms)
; {
.dbline 22
; uint i,j;
; for(i=0;i<ms;i++)
clr R20
clr R21
rjmp L5
L2:
.dbline 23
; {
.dbline 24
; for(j=0;j<1141;j++);
clr R22
clr R23
rjmp L9
L6:
.dbline 24
L7:
.dbline 24
subi R22,255 ; offset = 1
sbci R23,255
L9:
.dbline 24
cpi R22,117
ldi R30,4
cpc R23,R30
brlo L6
X0:
.dbline 25
; }
L3:
.dbline 22
subi R20,255 ; offset = 1
sbci R21,255
L5:
.dbline 22
cp R20,R16
cpc R21,R17
brlo L2
X1:
.dbline -2
L1:
.dbline 0 ; func end
rjmp pop_xgsetF000
.dbsym r i 20 i
.dbsym r j 22 i
.dbsym r ms 16 i
.dbend
.dbfunc e One_led _One_led fV
; i -> <dead>
; light -> R20
; number -> R10
.even
_One_led::
st -y,R10
st -y,R20
mov R20,R18
mov R10,R16
.dbline -1
.dbline 36
; }
;
; /*******************************************
; 函数名称: One_led
; 功 能: 点亮或者熄灭指定的LED
; 参 数: number--指定的LED
; light--为1的时候为点亮LED,为0的时候为熄灭LED
; 返回值 : 无
; /********************************************/
; void One_led(uchar number,uchar light)
; {uchar i;
.dbline 37
; if(light==1) //点亮操作
cpi R20,1
brne L11
X2:
.dbline 38
; {
.dbline 39
; PORTA|=BIT(number); //更新数据
ldi R16,1
mov R17,R10
rcall lsl8
in R2,0x1b
or R2,R16
out 0x1b,R2
.dbline 40
; Delayms(10); //调整时序
ldi R16,10
ldi R17,0
rcall _Delayms
.dbline 41
; }
rjmp L12
L11:
.dbline 43
; else
; {
.dbline 44
; PORTA&=~BIT(number); //更新数据
ldi R16,1
mov R17,R10
rcall lsl8
mov R2,R16
com R2
in R3,0x1b
and R3,R2
out 0x1b,R3
.dbline 45
; Delayms(10); //调整时序
ldi R16,10
ldi R17,0
rcall _Delayms
.dbline 46
; }
L12:
.dbline -2
L10:
.dbline 0 ; func end
ld R20,y+
ld R10,y+
ret
.dbsym l i 1 c
.dbsym r light 20 c
.dbsym r number 10 c
.dbend
.dbfunc e All_led _All_led fV
; light -> R10
.even
_All_led::
st -y,R10
mov R10,R16
.dbline -1
.dbline 55
; }
; /*******************************************
; 函数名称: All_led
; 功 能: 点亮或者熄灭全部LED
; 参 数: light--为1的时候为点亮全部LED,为0的时候为熄灭全部LED
; 返回值 : 无
; /********************************************/
; void All_led(uchar light)
; {
.dbline 56
; if(light)
tst R10
breq L14
X3:
.dbline 57
; {
.dbline 58
; PORTA=0XFF; //输出数据
ldi R24,255
out 0x1b,R24
.dbline 59
; Delayms(5); //调整时序
ldi R16,5
ldi R17,0
rcall _Delayms
.dbline 60
; }
rjmp L15
L14:
.dbline 62
; else
; {
.dbline 63
; PORTA=0X00; //输出数据
clr R2
out 0x1b,R2
.dbline 64
; Delayms(5); //调整时序
ldi R16,5
ldi R17,0
rcall _Delayms
.dbline 65
; }
L15:
.dbline -2
L13:
.dbline 0 ; func end
ld R10,y+
ret
.dbsym r light 10 c
.dbend
.dbfunc e Flow_LED _Flow_LED fV
; i -> R20
; MS -> R10
.even
_Flow_LED::
st -y,R10
st -y,R20
mov R10,R16
.dbline -1
.dbline 74
; }
; /*******************************************
; 函数名称: Flow_led
; 功 能: 流水灯(循环一次)
; 参 数: MS--点亮相邻LED的时间间隔,单位是毫秒
; 返回值 : 无
; /********************************************/
; void Flow_LED(uchar MS)
; {
.dbline 76
; uchar i;
; for(i=0;i<8;i++) //循环8次,8个LED依次点亮
clr R20
rjmp L20
L17:
.dbline 77
; {
.dbline 78
; All_led(0); //全部熄灭
clr R16
rcall _All_led
.dbline 79
; One_led(i,1); //点亮指定的LED
ldi R18,1
mov R16,R20
rcall _One_led
.dbline 80
; Delayms(MS); //延时指定的时间
mov R16,R10
clr R17
rcall _Delayms
.dbline 81
; All_led(0); //全部熄灭
clr R16
rcall _All_led
.dbline 82
; }
L18:
.dbline 76
inc R20
L20:
.dbline 76
cpi R20,8
brlo L17
X4:
.dbline -2
L16:
.dbline 0 ; func end
ld R20,y+
ld R10,y+
ret
.dbsym r i 20 c
.dbsym r MS 10 c
.dbend
.dbfunc e Flash_LED _Flash_LED fV
; time -> R20
; MS -> R10
; number -> R12
.even
_Flash_LED::
rcall push_xgset303C
mov R10,R18
mov R12,R16
.dbline -1
.dbline 92
; }
; /*******************************************
; 函数名称: Flash_led
; 功 能: 闪烁指定的LED(第几盏就闪烁几次)
; 参 数: number--指定的LED
; MS--LED闪烁的时间间隔
; 返回值 : 无
; /********************************************/
; void Flash_LED(uchar number,uchar MS)
; {
.dbline 93
; uchar time=6;
ldi R20,6
.dbline 94
; for(;time>0;time--)
rjmp L25
L22:
.dbline 95
; {
.dbline 96
; All_led(0); //熄灭所有的LED
clr R16
rcall _All_led
.dbline 97
; One_led(number,1); //点亮指定的LED
ldi R18,1
mov R16,R12
rcall _One_led
.dbline 98
; Delayms(MS); //延时指定的时间
mov R16,R10
clr R17
rcall _Delayms
.dbline 99
; All_led(0); //熄灭所有的LED
clr R16
rcall _All_led
.dbline 100
; Delayms(MS); //延时指定的时间
mov R16,R10
clr R17
rcall _Delayms
.dbline 101
; One_led(number,0); //熄灭指定的LED
clr R18
mov R16,R12
rcall _One_led
.dbline 102
; }
L23:
.dbline 94
dec R20
L25:
.dbline 94
ldi R24,0
cp R24,R20
brlo L22
X5:
.dbline -2
L21:
.dbline 0 ; func end
rjmp pop_xgset303C
.dbsym r time 20 c
.dbsym r MS 10 c
.dbsym r number 12 c
.dbend
.dbfunc e main _main fV
; i -> R22,R23
; b -> R20,R21
.even
_main::
.dbline -1
.dbline 111
; }
; /*******************************************
; 函数名称: main
; 功 能: 1. 流水灯 2.闪烁指定的LED
; 参 数: 无
; 返回值 : 无
; /********************************************/
; void main()
; {
.dbline 113
; uint b,i;
; b=0;
clr R20
clr R21
.dbline 114
; DDRA=0XFF; //b指定闪烁的LED
ldi R24,255
out 0x1a,R24
rjmp L28
L27:
.dbline 116
; while(1)
; {
.dbline 117
; if(b<3600)b++,b++;
cpi R20,16
ldi R30,14
cpc R21,R30
brsh L30
X6:
.dbline 117
subi R20,255 ; offset = 1
sbci R21,255
subi R20,255 ; offset = 1
sbci R21,255
L30:
.dbline 118
; if(b%7==0)b++;
ldi R18,7
ldi R19,0
movw R16,R20
rcall mod16u
cpi R16,0
cpc R16,R17
brne L32
X7:
.dbline 118
subi R20,255 ; offset = 1
sbci R21,255
L32:
.dbline 119
; if(b==3600)b=0;
cpi R20,16
ldi R30,14
cpc R21,R30
brne L34
X8:
.dbline 119
clr R20
clr R21
L34:
.dbline 120
; i=(int)(b%8>0);
movw R24,R20
andi R24,7
andi R25,0
cpi R24,0
cpc R24,R25
breq L36
X9:
ldi R22,1
ldi R23,0
rjmp L37
L36:
clr R22
clr R23
L37:
.dbline 121
; switch(i)
cpi R22,0
cpc R22,R23
breq L40
X10:
cpi R22,1
ldi R30,0
cpc R23,R30
breq L41
X11:
rjmp L38
L40:
.dbline 124
; {
; case 0:
; Flow_LED(200); //i=0,以流水灯的方式显示
ldi R16,200
rcall _Flow_LED
.dbline 125
; break;
rjmp L39
L41:
.dbline 127
; case 1:
; Flash_LED(b%8,100); //i=1,以闪烁灯的方式显示
ldi R18,100
mov R16,R20
andi R16,7
andi R17,0
rcall _Flash_LED
.dbline 128
; }
L38:
L39:
.dbline 129
; }
L28:
.dbline 115
rjmp L27
X12:
.dbline -2
L26:
.dbline 0 ; func end
ret
.dbsym r i 22 i
.dbsym r b 20 i
.dbend
; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -