📄 lesson1.s
字号:
.module lesson1.c
.area text(rom, con, rel)
.dbfile C:/icc/include/AVR_PQ1A.h
.dbfunc e Delayus _Delayus fV
; i -> R20,R21
; US -> R22,R23
.even
_Delayus::
rcall push_gset2
mov R22,R16
mov R23,R17
.dbline -1
.dbline 28
; /*******************************************
; 文件:LED.C
; 环境:编译为ICC AVR6.25A,仿真为AVR Studio4.10
; 硬件:ATMEGA16芯片
; 日期:2006年12月10日
; 功能:驱动开发板上的LED。1. 流水灯 2.闪烁指定的LED
; 备注:参考《AVR系列单片机C语言编程与应用实例》(清华大学出版社)
; /******************************************/
; #include <iom16v.h> //包含型号头文件
; #include <macros.h> //包含"位"操作头文件
; #include <stdio.h> //标准输入输出头文件
; #include <AVR_PQ1A.h> //包含自定义常量头文件
;
; /*******************************************
; 函数名称: One_led
; 功 能: 点亮或者熄灭指定的LED
; 参 数: number--指定的LED
; light--为TRUE的时候为点亮LED,为FALSE的时候为熄灭LED
; 返回值 : 无
; /********************************************/
; void One_led(uchar number,uchar light)
; {uchar i;
; if(light==TRUE) //点亮操作
; {
; PORTB&=~BIT(number); //输出数据
; PORTA|=BIT(LEDLK); //更新数据
; Delayms(5); //调整时序
; PORTA&=~BIT(LEDLK); //锁存数据
.dbline 30
; }
; else
ldi R16,5
ldi R17,0
mov R18,R22
mov R19,R23
rcall mpy16s
mov R22,R16
mov R23,R17
lsr R23
ror R22
lsr R23
ror R22
.dbline 31
clr R20
clr R21
rjmp L5
L2:
.dbline 31
L3:
.dbline 31
subi R20,255 ; offset = 1
sbci R21,255
L5:
.dbline 31
; {
cp R20,R22
cpc R21,R23
brlo L2
.dbline -2
.dbline 32
; PORTB|=BIT(number); //输出数据
L1:
rcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r i 20 i
.dbsym r US 22 i
.dbend
.dbfunc e Delayms _Delayms fV
; i -> R20,R21
; j -> R22,R23
; MS -> R16,R17
.even
_Delayms::
rcall push_gset2
.dbline -1
.dbline 40
; PORTA|=BIT(LEDLK); //更新数据
; Delayms(5); //调整时序
; PORTA&=~BIT(LEDLK); //锁存数据
; }
; }
; /*******************************************
; 函数名称: All_led
; 功 能: 点亮或者熄灭全部LED
.dbline 42
; 参 数: light--为TRUE的时候为点亮全部LED,为FALSE的时候为熄灭全部LED
; 返回值 : 无
clr R20
clr R21
rjmp L10
L7:
.dbline 43
clr R22
clr R23
rjmp L14
L11:
.dbline 43
L12:
.dbline 43
subi R22,255 ; offset = 1
sbci R23,255
L14:
.dbline 43
cpi R22,117
ldi R30,4
cpc R23,R30
brlo L11
L8:
.dbline 42
subi R20,255 ; offset = 1
sbci R21,255
L10:
.dbline 42
cp R20,R16
cpc R21,R17
brlo L7
.dbline -2
.dbline 44
; /********************************************/
; void All_led(uchar light)
L6:
rcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r i 20 i
.dbsym r j 22 i
.dbsym r MS 16 i
.dbend
.dbfunc e Board_init _Board_init fV
.even
_Board_init::
.dbline -1
.dbline 52
; {
; if(light)
; {
; PORTB&=~ALLLED; //ALLLED=0xFF,使全部LED都亮
; PORTA|=BIT(LEDLK); //输出数据
; Delayms(5); //调整时序
; PORTA&=~BIT(LEDLK); //锁存数据
; }
.dbline 53
; else
ldi R24,255
out 0x1a,R24
.dbline 54
; {
out 0x17,R24
.dbline 55
; PORTB|=ALLLED; //ALLLED=0xFF,使全部LED都灭
out 0x14,R24
.dbline 56
; PORTA|=BIT(LEDLK); //输出数据
out 0x11,R24
.dbline 58
; Delayms(5); //调整时序
; PORTA&=~BIT(LEDLK); //锁存数据
clr R2
out 0xd,R2
.dbline 60
; }
; }
sbi 0x1b,6
.dbline 61
; /*******************************************
cbi 0x15,6
.dbline 62
; 函数名称: Flow_led
cbi 0x1b,1
.dbline 63
; 功 能: 流水灯(循环一次)
out 0x18,R24
.dbline 64
; 参 数: MS--点亮相邻LED的时间间隔,单位是毫秒
sbi 0x1b,2
.dbline 65
; 返回值 : 无
ldi R16,5
ldi R17,0
rcall _Delayus
.dbline 66
; /********************************************/
cbi 0x1b,2
.dbline 68
; void Flow_LED(uchar MS)
; {
clr R2
out 0x18,R2
.dbline 69
; uchar i;
sbi 0x1b,3
.dbline 70
; for(i=0;i<8;i++) //循环8次,8个LED依次点亮
ldi R16,50
ldi R17,0
rcall _Delayus
.dbline 71
; {
cbi 0x1b,3
.dbline 73
; All_led(FALSE); //全部熄灭
; One_led(i,TRUE); //点亮指定的LED
ldi R24,255
out 0x18,R24
.dbline 74
; Delayms(MS); //延时指定的时间
sbi 0x1b,4
.dbline 75
; }
ldi R16,50
ldi R17,0
rcall _Delayus
.dbline 76
; }
cbi 0x1b,4
.dbline 78
; /*******************************************
; 函数名称: Flash_led
ldi R24,255
out 0x12,R24
.dbline 79
; 功 能: 闪烁指定的LED(循环一次)
sbi 0x1b,7
.dbline 80
; 参 数: number--指定的LED
ldi R16,50
ldi R17,0
rcall _Delayus
.dbline 81
; MS--LED闪烁的时间间隔
cbi 0x1b,7
.dbline -2
.dbline 84
; 返回值 : 无
; /********************************************/
; void Flash_LED(uchar number,uchar MS)
L15:
.dbline 0 ; func end
ret
.dbend
.dbfile I:\AVR视频教程\视频教程\lesson1\lesson1\lesson1.c
.dbfunc e One_led _One_led fV
; i -> <dead>
; light -> R22
; number -> R20
.even
_One_led::
rcall push_gset2
mov R22,R18
mov R20,R16
.dbline -1
.dbline 22
.dbline 23
cpi R22,1
brne L17
.dbline 24
.dbline 25
ldi R16,1
mov R17,R20
rcall lsl8
mov R2,R16
com R2
in R3,0x18
and R3,R2
out 0x18,R3
.dbline 26
sbi 0x1b,2
.dbline 27
ldi R16,5
ldi R17,0
rcall _Delayms
.dbline 28
cbi 0x1b,2
.dbline 29
rjmp L18
L17:
.dbline 31
.dbline 32
ldi R16,1
mov R17,R20
rcall lsl8
in R2,0x18
or R2,R16
out 0x18,R2
.dbline 33
sbi 0x1b,2
.dbline 34
ldi R16,5
ldi R17,0
rcall _Delayms
.dbline 35
cbi 0x1b,2
.dbline 36
L18:
.dbline -2
.dbline 37
L16:
rcall pop_gset2
.dbline 0 ; func end
ret
.dbsym l i 1 c
.dbsym r light 22 c
.dbsym r number 20 c
.dbend
.dbfunc e All_led _All_led fV
; light -> R20
.even
_All_led::
rcall push_gset1
mov R20,R16
.dbline -1
.dbline 45
.dbline 46
tst R20
breq L20
.dbline 47
.dbline 48
in R24,0x18
andi R24,0
out 0x18,R24
.dbline 49
sbi 0x1b,2
.dbline 50
ldi R16,5
ldi R17,0
rcall _Delayms
.dbline 51
cbi 0x1b,2
.dbline 52
rjmp L21
L20:
.dbline 54
.dbline 55
in R24,0x18
ori R24,255
out 0x18,R24
.dbline 56
sbi 0x1b,2
.dbline 57
ldi R16,5
ldi R17,0
rcall _Delayms
.dbline 58
cbi 0x1b,2
.dbline 59
L21:
.dbline -2
.dbline 60
L19:
rcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r light 20 c
.dbend
.dbfunc e Flow_LED _Flow_LED fV
; i -> R20
; MS -> R22
.even
_Flow_LED::
rcall push_gset2
mov R22,R16
.dbline -1
.dbline 68
.dbline 70
clr R20
rjmp L26
L23:
.dbline 71
.dbline 72
clr R16
rcall _All_led
.dbline 73
ldi R18,1
mov R16,R20
rcall _One_led
.dbline 74
mov R16,R22
clr R17
rcall _Delayms
.dbline 75
L24:
.dbline 70
inc R20
L26:
.dbline 70
cpi R20,8
brlo L23
.dbline -2
.dbline 76
L22:
rcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbsym r MS 22 c
.dbend
.dbfunc e Flash_LED _Flash_LED fV
; MS -> R22
; number -> R20
.even
_Flash_LED::
rcall push_gset2
mov R22,R18
mov R20,R16
.dbline -1
.dbline 85
; {
.dbline 86
; One_led(number,TRUE); //点亮指定的LED
ldi R18,1
mov R16,R20
rcall _One_led
.dbline 87
; Delayms(MS); //延时指定的时间
mov R16,R22
clr R17
rcall _Delayms
.dbline 88
; All_led(FALSE); //熄灭所有的LED
clr R16
rcall _All_led
.dbline 89
; Delayms(MS); //延时指定的时间
mov R16,R22
clr R17
rcall _Delayms
.dbline 90
; One_led(number,FALSE); //熄灭指定的LED
clr R18
mov R16,R20
rcall _One_led
.dbline -2
.dbline 91
; }
L27:
rcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r MS 22 c
.dbsym r number 20 c
.dbend
.dbfunc e main _main fV
; bit -> R20
; i -> R22
.even
_main::
.dbline -1
.dbline 99
; /*******************************************
; 函数名称: main
; 功 能: 1. 流水灯 2.闪烁指定的LED
; 参 数: 无
; 返回值 : 无
; /********************************************/
; void main(void)
; {
.dbline 101
; uchar i,bit;
; i=0; //i=0时为流水灯,i=1时为闪烁灯
clr R22
.dbline 102
; bit=0; //bit指定闪烁的LED
clr R20
.dbline 103
; Board_init( ); //初始化开发板
rcall _Board_init
rjmp L30
L29:
.dbline 105
; while(1)
; {
.dbline 106
; switch(i)
mov R10,R22
clr R11
tst R10
brne X0
tst R11
breq L35
X0:
mov R24,R10
mov R25,R11
cpi R24,1
ldi R30,0
cpc R25,R30
breq L36
rjmp L32
X1:
.dbline 107
; {
L35:
.dbline 109
; case 0:
; Flow_LED(200); //i=0,以流水灯的方式显示
ldi R16,200
rcall _Flow_LED
.dbline 110
; break;
rjmp L33
L36:
.dbline 112
; case 1:
; Flash_LED(bit,100); //i=1,以闪烁灯的方式显示
ldi R18,100
mov R16,R20
rcall _Flash_LED
.dbline 113
; }
L32:
L33:
.dbline 114
L30:
.dbline 104
rjmp L29
X2:
.dbline -2
.dbline 115
; }
; }
L28:
.dbline 0 ; func end
ret
.dbsym r bit 20 c
.dbsym r i 22 c
.dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -