📄 lesson1.lis
字号:
.module lesson1.c
.area text(rom, con, rel)
0000 .dbfile C:/icc/include/AVR_PQ1A.h
0000 .dbfunc e Delayus _Delayus fV
0000 ; i -> R20,R21
0000 ; US -> R22,R23
.even
0000 _Delayus::
0000 00D0 rcall push_gset2
0002 602F mov R22,R16
0004 712F mov R23,R17
0006 .dbline -1
0006 .dbline 28
0006 ; /*******************************************
0006 ; 文件:LED.C
0006 ; 环境:编译为ICC AVR6.25A,仿真为AVR Studio4.10
0006 ; 硬件:ATMEGA16芯片
0006 ; 日期:2006年12月10日
0006 ; 功能:驱动开发板上的LED。1. 流水灯 2.闪烁指定的LED
0006 ; 备注:参考《AVR系列单片机C语言编程与应用实例》(清华大学出版社)
0006 ; /******************************************/
0006 ; #include <iom16v.h> //包含型号头文件
0006 ; #include <macros.h> //包含"位"操作头文件
0006 ; #include <stdio.h> //标准输入输出头文件
0006 ; #include <AVR_PQ1A.h> //包含自定义常量头文件
0006 ;
0006 ; /*******************************************
0006 ; 函数名称: One_led
0006 ; 功 能: 点亮或者熄灭指定的LED
0006 ; 参 数: number--指定的LED
0006 ; light--为TRUE的时候为点亮LED,为FALSE的时候为熄灭LED
0006 ; 返回值 : 无
0006 ; /********************************************/
0006 ; void One_led(uchar number,uchar light)
0006 ; {uchar i;
0006 ; if(light==TRUE) //点亮操作
0006 ; {
0006 ; PORTB&=~BIT(number); //输出数据
0006 ; PORTA|=BIT(LEDLK); //更新数据
0006 ; Delayms(5); //调整时序
0006 ; PORTA&=~BIT(LEDLK); //锁存数据
0006 .dbline 30
0006 ; }
0006 ; else
0006 05E0 ldi R16,5
0008 10E0 ldi R17,0
000A 262F mov R18,R22
000C 372F mov R19,R23
000E 00D0 rcall mpy16s
0010 602F mov R22,R16
0012 712F mov R23,R17
0014 7695 lsr R23
0016 6795 ror R22
0018 7695 lsr R23
001A 6795 ror R22
001C .dbline 31
001C 4427 clr R20
001E 5527 clr R21
0020 02C0 rjmp L5
0022 L2:
0022 .dbline 31
0022 L3:
0022 .dbline 31
0022 4F5F subi R20,255 ; offset = 1
0024 5F4F sbci R21,255
0026 L5:
0026 .dbline 31
0026 ; {
0026 4617 cp R20,R22
0028 5707 cpc R21,R23
002A D8F3 brlo L2
002C .dbline -2
002C .dbline 32
002C ; PORTB|=BIT(number); //输出数据
002C L1:
002C 00D0 rcall pop_gset2
002E .dbline 0 ; func end
002E 0895 ret
0030 .dbsym r i 20 i
0030 .dbsym r US 22 i
0030 .dbend
0030 .dbfunc e Delayms _Delayms fV
0030 ; i -> R20,R21
0030 ; j -> R22,R23
0030 ; MS -> R16,R17
.even
0030 _Delayms::
0030 00D0 rcall push_gset2
0032 .dbline -1
0032 .dbline 40
0032 ; PORTA|=BIT(LEDLK); //更新数据
0032 ; Delayms(5); //调整时序
0032 ; PORTA&=~BIT(LEDLK); //锁存数据
0032 ; }
0032 ; }
0032 ; /*******************************************
0032 ; 函数名称: All_led
0032 ; 功 能: 点亮或者熄灭全部LED
0032 .dbline 42
0032 ; 参 数: light--为TRUE的时候为点亮全部LED,为FALSE的时候为熄灭全部LED
0032 ; 返回值 : 无
0032 4427 clr R20
0034 5527 clr R21
0036 0BC0 rjmp L10
0038 L7:
0038 .dbline 43
0038 6627 clr R22
003A 7727 clr R23
003C 02C0 rjmp L14
003E L11:
003E .dbline 43
003E L12:
003E .dbline 43
003E 6F5F subi R22,255 ; offset = 1
0040 7F4F sbci R23,255
0042 L14:
0042 .dbline 43
0042 6537 cpi R22,117
0044 E4E0 ldi R30,4
0046 7E07 cpc R23,R30
0048 D0F3 brlo L11
004A L8:
004A .dbline 42
004A 4F5F subi R20,255 ; offset = 1
004C 5F4F sbci R21,255
004E L10:
004E .dbline 42
004E 4017 cp R20,R16
0050 5107 cpc R21,R17
0052 90F3 brlo L7
0054 .dbline -2
0054 .dbline 44
0054 ; /********************************************/
0054 ; void All_led(uchar light)
0054 L6:
0054 00D0 rcall pop_gset2
0056 .dbline 0 ; func end
0056 0895 ret
0058 .dbsym r i 20 i
0058 .dbsym r j 22 i
0058 .dbsym r MS 16 i
0058 .dbend
0058 .dbfunc e Board_init _Board_init fV
.even
0058 _Board_init::
0058 .dbline -1
0058 .dbline 52
0058 ; {
0058 ; if(light)
0058 ; {
0058 ; PORTB&=~ALLLED; //ALLLED=0xFF,使全部LED都亮
0058 ; PORTA|=BIT(LEDLK); //输出数据
0058 ; Delayms(5); //调整时序
0058 ; PORTA&=~BIT(LEDLK); //锁存数据
0058 ; }
0058 .dbline 53
0058 ; else
0058 8FEF ldi R24,255
005A 8ABB out 0x1a,R24
005C .dbline 54
005C ; {
005C 87BB out 0x17,R24
005E .dbline 55
005E ; PORTB|=ALLLED; //ALLLED=0xFF,使全部LED都灭
005E 84BB out 0x14,R24
0060 .dbline 56
0060 ; PORTA|=BIT(LEDLK); //输出数据
0060 81BB out 0x11,R24
0062 .dbline 58
0062 ; Delayms(5); //调整时序
0062 ; PORTA&=~BIT(LEDLK); //锁存数据
0062 2224 clr R2
0064 2DB8 out 0xd,R2
0066 .dbline 60
0066 ; }
0066 ; }
0066 DE9A sbi 0x1b,6
0068 .dbline 61
0068 ; /*******************************************
0068 AE98 cbi 0x15,6
006A .dbline 62
006A ; 函数名称: Flow_led
006A D998 cbi 0x1b,1
006C .dbline 63
006C ; 功 能: 流水灯(循环一次)
006C 88BB out 0x18,R24
006E .dbline 64
006E ; 参 数: MS--点亮相邻LED的时间间隔,单位是毫秒
006E DA9A sbi 0x1b,2
0070 .dbline 65
0070 ; 返回值 : 无
0070 05E0 ldi R16,5
0072 10E0 ldi R17,0
0074 C5DF rcall _Delayus
0076 .dbline 66
0076 ; /********************************************/
0076 DA98 cbi 0x1b,2
0078 .dbline 68
0078 ; void Flow_LED(uchar MS)
0078 ; {
0078 2224 clr R2
007A 28BA out 0x18,R2
007C .dbline 69
007C ; uchar i;
007C DB9A sbi 0x1b,3
007E .dbline 70
007E ; for(i=0;i<8;i++) //循环8次,8个LED依次点亮
007E 02E3 ldi R16,50
0080 10E0 ldi R17,0
0082 BEDF rcall _Delayus
0084 .dbline 71
0084 ; {
0084 DB98 cbi 0x1b,3
0086 .dbline 73
0086 ; All_led(FALSE); //全部熄灭
0086 ; One_led(i,TRUE); //点亮指定的LED
0086 8FEF ldi R24,255
0088 88BB out 0x18,R24
008A .dbline 74
008A ; Delayms(MS); //延时指定的时间
008A DC9A sbi 0x1b,4
008C .dbline 75
008C ; }
008C 02E3 ldi R16,50
008E 10E0 ldi R17,0
0090 B7DF rcall _Delayus
0092 .dbline 76
0092 ; }
0092 DC98 cbi 0x1b,4
0094 .dbline 78
0094 ; /*******************************************
0094 ; 函数名称: Flash_led
0094 8FEF ldi R24,255
0096 82BB out 0x12,R24
0098 .dbline 79
0098 ; 功 能: 闪烁指定的LED(循环一次)
0098 DF9A sbi 0x1b,7
009A .dbline 80
009A ; 参 数: number--指定的LED
009A 02E3 ldi R16,50
009C 10E0 ldi R17,0
009E B0DF rcall _Delayus
00A0 .dbline 81
00A0 ; MS--LED闪烁的时间间隔
00A0 DF98 cbi 0x1b,7
00A2 .dbline -2
00A2 .dbline 84
00A2 ; 返回值 : 无
00A2 ; /********************************************/
00A2 ; void Flash_LED(uchar number,uchar MS)
00A2 L15:
00A2 .dbline 0 ; func end
00A2 0895 ret
00A4 .dbend
00A4 .dbfile I:\AVR视频教程\视频教程\lesson1\lesson1\lesson1.c
00A4 .dbfunc e One_led _One_led fV
00A4 ; i -> <dead>
00A4 ; light -> R22
00A4 ; number -> R20
.even
00A4 _One_led::
00A4 00D0 rcall push_gset2
00A6 622F mov R22,R18
00A8 402F mov R20,R16
00AA .dbline -1
00AA .dbline 22
00AA .dbline 23
00AA 6130 cpi R22,1
00AC 71F4 brne L17
00AE .dbline 24
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -