?? 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 + -