?? mega16_ad.s
字號:
.module MEGA16_AD.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::
xcall push_gset2
movw R22,R16
.dbline -1
.dbline 28
; /*******************************************
; 文件:MEGA16_AD.C
; 環境:編譯為ICC AVR6.25A,仿真為AVR Studio4.10
; 硬件:ATMEGA16芯片
; 日期:2006年12月10日
; 功能:驅動MEGA16片上自帶的AD轉換器
; 備注:參考《AVR系列單片機C語言編程與應用實例》(清華大學出版社)
; /******************************************/
; #include <iom16v.h> //包含型號頭文件
; #include <macros.h> //包含"位"操作頭文件
; #include <stdio.h> //標準輸入輸出頭文件
; #include <AVR_PQ1A.h> //包含自定義常量頭文件
; #include "SMG.C" //包含數碼管顯示函數
;
; /*******************************************
; 函數名稱: Mega16_ad
; 功 能: 對指定的通道進行模數轉換
; 參 數: chl--指定的通道(本開發板只用了通道0)
; 返回值 : addata--10位數據輸出
; /********************************************/
; uint Mega16_ad(uchar chl)
; {
; uint addata;
; DDRA&=~(BIT(PA0)|BIT(PA1)); //轉換口設置為輸入、無上拉
; PORTA&=~(BIT(PA0)|BIT(PA1));
; ADMUX=0; //采用外部參考電壓,輸出數據右對齊
; ADMUX|=chl; //設置指定的通道
; ADCSR=0x80; //采用單次轉換,查詢模式,2分頻
.dbline 30
; ADCSR|=BIT(ADSC); //啟動轉換
; while(!(ADCSR&(BIT(ADIF)))); //等待轉換結束
ldi R16,5
ldi R17,0
movw R18,R22
xcall empy16s
movw R22,R16
lsr R23
ror R22
lsr R23
ror R22
.dbline 31
clr R20
clr R21
xjmp L5
L2:
.dbline 31
L3:
.dbline 31
subi R20,255 ; offset = 1
sbci R21,255
L5:
.dbline 31
; addata=ADCL;
cp R20,R22
cpc R21,R23
brlo L2
.dbline -2
.dbline 32
; addata+=ADCH*256;
L1:
xcall 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::
xcall push_gset2
.dbline -1
.dbline 40
; return addata;
; }
; /*******************************************
; 函數名稱: Num_BCD
; 功 能: 將一個字節的整數轉換成三位BCD碼
; 參 數: num--需要轉換的整數
; 返回值 : chr--三位BCD碼數組指針
; /********************************************/
.dbline 42
; uchar* Num_BCD(uchar num)
; {
clr R20
clr R21
xjmp L10
L7:
.dbline 43
clr R22
clr R23
xjmp 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
; uchar i,chr[3];
; uchar *rept;
L6:
xcall 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
; rept=&(chr[0]); //返回指針指向BCD碼數組
; for(i=0;i<3;i++)
; {
; chr[2-i]=num%10; //對10取余數(其實是求模,但是對于正數,取余與求模是相等的)
; num/=10; //除以10,為取出下一位做準備
; }
; return rept; //返回指針
; }
.dbline 53
; /*******************************************
ldi R24,255
out 0x1a,R24
.dbline 54
; 函數名稱: main
out 0x17,R24
.dbline 55
; 功 能: 驅動MEGA16的AD,并在數碼管上顯示采集值
out 0x14,R24
.dbline 56
; 參 數: 無
out 0x11,R24
.dbline 58
; 返回值 : 無
; /********************************************/
clr R2
out 0xd,R2
.dbline 60
; void main(void)
; {
sbi 0x1b,6
.dbline 61
; uchar *adpt; //定義一個接受返回指針的指針變量
cbi 0x15,6
.dbline 62
; uchar i,ad0[3];
cbi 0x1b,1
.dbline 63
; Board_init( ); //初始化開發板
out 0x18,R24
.dbline 64
; while(1)
sbi 0x1b,2
.dbline 65
; {
ldi R16,5
ldi R17,0
xcall _Delayus
.dbline 66
; adpt=Num_BCD(Mega16_ad(0)/4); //啟動AD轉換通道0,同時將數值轉換成BCD碼
cbi 0x1b,2
.dbline 68
; for(i=0;i<3;i++) //將轉換后的BCD碼存入顯示數組
; {
clr R2
out 0x18,R2
.dbline 69
; ad0[i]=*(adpt+i);
sbi 0x1b,3
.dbline 70
; }
ldi R16,50
ldi R17,0
xcall _Delayus
.dbline 71
; for(i=0;i<3;i++) //顯示轉換的數值
cbi 0x1b,3
.dbline 73
; {
; One_smg_display(ad0[i],i+1);
ldi R24,255
out 0x18,R24
.dbline 74
; Delayms(2);
sbi 0x1b,4
.dbline 75
; }
ldi R16,50
ldi R17,0
xcall _Delayus
.dbline 76
; }
cbi 0x1b,4
.dbline 78
; }
; }
ldi R24,255
out 0x12,R24
.dbline 79
; }
sbi 0x1b,7
.dbline 80
; }
ldi R16,50
ldi R17,0
xcall _Delayus
.dbline 81
; }
cbi 0x1b,7
.dbline -2
.dbline 84
; }
; }
; }
L15:
.dbline 0 ; func end
ret
.dbend
.area code(ram, con, rel)
.dbfile C:/icc/include/AVR_PQ1A.h
.area lit(rom, con, rel)
_SEGMENT::
.word 63
.word 6
.word 91
.word 79
.word 102
.word 109
.word 125
.word 7
.word 127
.word 111
.word 119
.word 124
.word 57
.word 94
.word 121
.word 113
.dbfile C:\icc\examples.avr\AVR_PQ1A_DEMO\9_AD/SMG.C
.dbsym e SEGMENT _SEGMENT A[32:16]I
.area text(rom, con, rel)
.dbfile C:\icc\examples.avr\AVR_PQ1A_DEMO\9_AD/SMG.C
.dbfunc e One_smg_display _One_smg_display fV
; number -> R20
; data -> R22
.even
_One_smg_display::
xcall push_gset2
mov R20,R18
mov R22,R16
.dbline -1
.dbline 25
.dbline 26
in R24,0x18
ori R24,63
out 0x18,R24
.dbline 27
sbi 0x1b,4
.dbline 28
ldi R16,50
ldi R17,0
xcall _Delayus
.dbline 29
cbi 0x1b,4
.dbline 31
ldi R24,2
mul R24,R22
movw R30,R0
ldi R24,<_SEGMENT
ldi R25,>_SEGMENT
add R30,R24
adc R31,R25
lpm R0,Z+
lpm R1,Z
movw R30,R0
out 0x18,R30
.dbline 32
sbi 0x1b,3
.dbline 33
ldi R16,50
ldi R17,0
xcall _Delayus
.dbline 34
cbi 0x1b,3
.dbline 36
mov R17,R20
subi R17,1
ldi R16,1
xcall lsl8
mov R20,R16
com R20
.dbline 37
out 0x18,R20
.dbline 38
sbi 0x1b,4
.dbline 39
ldi R16,50
ldi R17,0
xcall _Delayus
.dbline 40
cbi 0x1b,4
.dbline -2
.dbline 41
L16:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r number 20 c
.dbsym r data 22 c
.dbend
.dbfunc e All_smg_display _All_smg_display fV
; i -> R20
; pdata -> R22,R23
.even
_All_smg_display::
xcall push_gset2
movw R22,R16
.dbline -1
.dbline 49
.dbline 51
clr R20
xjmp L21
L18:
.dbline 52
.dbline 53
mov R18,R20
subi R18,255 ; addi 1
mov R30,R20
clr R31
add R30,R22
adc R31,R23
ldd R16,z+0
xcall _One_smg_display
.dbline 54
ldi R16,1
ldi R17,0
xcall _Delayms
.dbline 55
L19:
.dbline 51
inc R20
L21:
.dbline 51
cpi R20,6
brlo L18
.dbline -2
.dbline 56
L17:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbsym r pdata 22 pc
.dbend
.dbfunc e Cycle_smg_display _Cycle_smg_display fV
; i -> R20
; j -> R10
; pdata -> R22,R23
.even
_Cycle_smg_display::
xcall push_gset3
movw R22,R16
.dbline -1
.dbline 64
.dbline 66
clr R20
xjmp L26
L23:
.dbline 67
.dbline 68
clr R10
xjmp L30
L27:
.dbline 69
.dbline 70
mov R18,R10
subi R18,255 ; addi 1
ldi R24,40
ldi R25,0
mov R16,R20
clr R17
push R18
push R19
movw R18,R24
xcall div16s
movw R2,R16
pop R19
pop R18
mov R4,R10
clr R5
add R2,R4
adc R3,R5
ldi R24,6
ldi R25,0
push R18
push R19
movw R18,R24
movw R16,R2
xcall mod16s
movw R30,R16
pop R19
pop R18
add R30,R22
adc R31,R23
ldd R16,z+0
xcall _One_smg_display
.dbline 71
ldi R16,2000
ldi R17,7
xcall _Delayus
.dbline 72
L28:
.dbline 68
inc R10
L30:
.dbline 68
mov R24,R10
cpi R24,6
brlo L27
.dbline 73
L24:
.dbline 66
inc R20
L26:
.dbline 66
cpi R20,240
brlo L23
.dbline -2
.dbline 74
L22:
xcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbsym r j 10 c
.dbsym r pdata 22 pc
.dbend
.dbfile C:\icc\examples.avr\AVR_PQ1A_DEMO\9_AD\MEGA16_AD.C
.dbfunc e Mega16_ad _Mega16_ad fi
; addata -> R20,R21
; chl -> R20
.even
_Mega16_ad::
xcall push_gset1
mov R20,R16
.dbline -1
.dbline 22
.dbline 24
in R24,0x1a
andi R24,252
out 0x1a,R24
.dbline 25
in R24,0x1b
andi R24,252
out 0x1b,R24
.dbline 26
clr R2
out 0x7,R2
.dbline 27
in R2,0x7
or R2,R20
out 0x7,R2
.dbline 28
ldi R24,128
out 0x6,R24
.dbline 29
sbi 0x6,6
L32:
.dbline 30
L33:
.dbline 30
sbis 0x6,4
rjmp L32
.dbline 31
in R20,0x4
clr R21
.dbline 32
in R18,0x5
clr R19
ldi R16,256
ldi R17,1
xcall empy16s
add R20,R16
adc R21,R17
.dbline 33
mov R16,R20
mov R17,R21
.dbline -2
L31:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r addata 20 i
.dbsym r chl 20 c
.dbend
.dbfunc e Num_BCD _Num_BCD fpc
; rept -> R20,R21
; chr -> y+0
; i -> R22
; num -> R10
.even
_Num_BCD::
xcall push_gset3
mov R10,R16
sbiw R28,3
.dbline -1
.dbline 42
.dbline 45
movw R20,R28
.dbline 46
clr R22
xjmp L39
L36:
.dbline 47
.dbline 48
mov R2,R22
clr R3
ldi R30,2
ldi R31,0
sub R30,R2
sbc R31,R3
movw R24,R28
add R30,R24
adc R31,R25
ldi R17,10
mov R16,R10
xcall mod8u
std z+0,R16
.dbline 49
ldi R17,10
mov R16,R10
xcall div8u
mov R10,R16
.dbline 50
L37:
.dbline 46
inc R22
L39:
.dbline 46
cpi R22,3
brlo L36
.dbline 51
mov R16,R20
mov R17,R21
.dbline -2
L35:
adiw R28,3
xcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r rept 20 pc
.dbsym l chr 0 A[3:3]c
.dbsym r i 22 c
.dbsym r num 10 c
.dbend
.dbfunc e main _main fV
; adpt -> R20,R21
; ad0 -> y+0
; i -> R22
.even
_main::
sbiw R28,3
.dbline -1
.dbline 60
.dbline 63
xcall _Board_init
xjmp L42
L41:
.dbline 65
.dbline 66
clr R16
xcall _Mega16_ad
lsr R17
ror R16
lsr R17
ror R16
xcall _Num_BCD
movw R20,R16
.dbline 67
clr R22
xjmp L47
L44:
.dbline 68
.dbline 69
mov R30,R22
clr R31
add R30,R20
adc R31,R21
ldd R2,z+0
movw R24,R28
mov R30,R22
clr R31
add R30,R24
adc R31,R25
std z+0,R2
.dbline 70
L45:
.dbline 67
inc R22
L47:
.dbline 67
cpi R22,3
brlo L44
.dbline 71
clr R22
xjmp L51
L48:
.dbline 72
.dbline 73
mov R18,R22
subi R18,255 ; addi 1
movw R24,R28
mov R30,R22
clr R31
add R30,R24
adc R31,R25
ldd R16,z+0
xcall _One_smg_display
.dbline 74
ldi R16,2
ldi R17,0
xcall _Delayms
.dbline 75
L49:
.dbline 71
inc R22
L51:
.dbline 71
cpi R22,3
brlo L48
.dbline 76
L42:
.dbline 64
xjmp L41
X0:
.dbline -2
.dbline 77
L40:
adiw R28,3
.dbline 0 ; func end
ret
.dbsym r adpt 20 pc
.dbsym l ad0 0 A[3:3]c
.dbsym r i 22 c
.dbend
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -