📄 test.s
字号:
; data -> y+0
; i -> R20
; dat -> R20,R21
; Y -> R12
; X -> R10
.even
_LCD_write_data::
xcall push_xgsetF03C
mov R12,R18
mov R10,R16
sbiw R28,5
ldd R20,y+13
ldd R21,y+14
.dbline -1
.dbline 138
; }
;
; /*-------------------------------------------------------------
; 函数: 写数字
; 参数:列---X=0~15,行---Y=0~1 写地址
; dat为所要写的数字
; ---------------------------------------------------------------*/
; void LCD_write_data(unsigned char X,unsigned char Y,int dat)
; {
.dbline 143
; unsigned char fuhao;
; unsigned char data[5];
; unsigned char i;
;
; if(dat<0)
cpi R20,0
ldi R30,0
cpc R21,R30
brge L37
X8:
.dbline 144
; {
.dbline 145
; fuhao='-';
ldi R22,45
.dbline 146
; dat=0-dat;
clr R2
clr R3
sub R2,R20
sbc R3,R21
movw R20,R2
.dbline 147
; }
xjmp L38
L37:
.dbline 149
; else
; fuhao=' ';
ldi R22,32
L38:
.dbline 150
; data[0]=fuhao;
std y+0,R22
.dbline 151
; data[1]=dat/1000+0x30; dat%=1000;
ldi R18,1000
ldi R19,3
movw R16,R20
xcall div16s
movw R24,R16
adiw R24,48
std y+1,R24
.dbline 151
ldi R18,1000
ldi R19,3
movw R16,R20
xcall mod16s
movw R20,R16
.dbline 152
; data[2]=dat/100+0x30; dat%=100;
ldi R18,100
ldi R19,0
xcall div16s
movw R24,R16
adiw R24,48
std y+2,R24
.dbline 152
ldi R18,100
ldi R19,0
movw R16,R20
xcall mod16s
movw R20,R16
.dbline 153
; data[3]=dat/10+0x30;
ldi R18,10
ldi R19,0
xcall div16s
movw R24,R16
adiw R24,48
std y+3,R24
.dbline 154
; data[4]=dat%10+0x30;
ldi R18,10
ldi R19,0
movw R16,R20
xcall mod16s
movw R24,R16
adiw R24,48
std y+4,R24
.dbline 156
;
; LCD_set_xy(X,Y);
mov R18,R12
mov R16,R10
xcall _LCD_set_xy
.dbline 157
; for(i=0;i<5;i++)
clr R20
xjmp L46
L43:
.dbline 158
; LCD_write_char(0,data[i]);
movw R24,R28
mov R30,R20
clr R31
add R30,R24
adc R31,R25
ldd R18,z+0
clr R19
clr R16
clr R17
xcall _LCD_write_char
L44:
.dbline 157
inc R20
L46:
.dbline 157
cpi R20,5
brlo L43
X9:
.dbline -2
L36:
.dbline 0 ; func end
adiw R28,5
xjmp pop_xgsetF03C
.dbsym r fuhao 22 c
.dbsym l data 0 A[5:5]c
.dbsym r i 20 c
.dbsym r dat 20 I
.dbsym r Y 12 c
.dbsym r X 10 c
.dbend
.dbfunc e LCD_write_adc _LCD_write_adc fV
; data -> y+0
; i -> R20
; dat -> R14,R15
; Y -> R12
; X -> R10
.even
_LCD_write_adc::
xcall push_xgset30FC
mov R12,R18
mov R10,R16
sbiw R28,5
ldd R14,y+13
ldd R15,y+14
.dbline -1
.dbline 167
; }
;
; /*-------------------------------------------------------------
; 函数: 写数字
; 参数:列---X=0~15,行---Y=0~1 写地址
; dat为所要写的数字
; ---------------------------------------------------------------*/
; void LCD_write_adc(unsigned char X,unsigned char Y,int dat)
; {
.dbline 171
; unsigned char data[5];
; unsigned char i;
;
; dat*=4.928;
ldi R16,<L48
ldi R17,>L48
xcall lpm32
movw R2,R16
movw R4,R18
movw R16,R14
xcall int2fp
st -y,R19
st -y,R18
st -y,R17
st -y,R16
movw R16,R2
movw R18,R4
xcall fpmule2
xcall fpint
movw R14,R16
.dbline 172
; data[0]=dat/1000+0x30; dat%=1000;
ldi R18,1000
ldi R19,3
xcall div16s
movw R24,R16
adiw R24,48
std y+0,R24
.dbline 172
ldi R18,1000
ldi R19,3
movw R16,R14
xcall mod16s
movw R14,R16
.dbline 173
; data[1]='.';
ldi R24,46
std y+1,R24
.dbline 174
; data[2]=dat/100+0x30; dat%=100;
ldi R18,100
ldi R19,0
xcall div16s
movw R24,R16
adiw R24,48
std y+2,R24
.dbline 174
ldi R18,100
ldi R19,0
movw R16,R14
xcall mod16s
movw R14,R16
.dbline 175
; data[3]=dat/10+0x30;
ldi R18,10
ldi R19,0
xcall div16s
movw R24,R16
adiw R24,48
std y+3,R24
.dbline 176
; data[4]=dat%10+0x30;
ldi R18,10
ldi R19,0
movw R16,R14
xcall mod16s
movw R24,R16
adiw R24,48
std y+4,R24
.dbline 178
;
; LCD_set_xy(X,Y);
mov R18,R12
mov R16,R10
xcall _LCD_set_xy
.dbline 179
; for(i=0;i<5;i++)
clr R20
xjmp L56
L53:
.dbline 180
; LCD_write_char(0,data[i]);
movw R24,R28
mov R30,R20
clr R31
add R30,R24
adc R31,R25
ldd R18,z+0
clr R19
clr R16
clr R17
xcall _LCD_write_char
L54:
.dbline 179
inc R20
L56:
.dbline 179
cpi R20,5
brlo L53
X10:
.dbline -2
L47:
.dbline 0 ; func end
adiw R28,5
xjmp pop_xgset30FC
.dbsym l data 0 A[5:5]c
.dbsym r i 20 c
.dbsym r dat 14 I
.dbsym r Y 12 c
.dbsym r X 10 c
.dbend
.dbfile D:\iccavr\mega16\11\10bit_adc\adc.h
.dbfunc e adc_init _adc_init fV
; adc_channel -> R16
.even
_adc_init::
.dbline -1
.dbline 6
;
; /******************************************************
; ** ADC转换初始化 **
; ******************************************************/
; void adc_init(unsigned char adc_channel)
; {
.dbline 7
; PORTA&=~(BIT(PA0)|BIT(PA1));
in R24,0x1b
andi R24,252
out 0x1b,R24
.dbline 8
; DDRA&=~(BIT(PA0)|BIT(PA1));
in R24,0x1a
andi R24,252
out 0x1a,R24
.dbline 9
; ACSR=0x80;
ldi R24,128
out 0x8,R24
.dbline 10
; ADMUX=(0<<REFS1)|(1<<REFS0)|adc_channel;
mov R24,R16
ori R24,64
out 0x7,R24
.dbline 11
; ADCSRA=(1<<ADEN)|(0<<ADSC)|(0<<ADIE)|(0<<ADPS2)|(0<<ADPS1)|(0<<ADPS0);
ldi R24,128
out 0x6,R24
.dbline -2
L57:
.dbline 0 ; func end
ret
.dbsym r adc_channel 16 c
.dbend
.dbfunc e GetAdcValue _GetAdcValue fi
; i -> R20
; adc_value -> R10,R11
; temp -> R12,R13
; adc_channel -> R12
.even
_GetAdcValue::
xcall push_xgset303C
mov R12,R16
.dbline -1
.dbline 18
; }
;
; /******************************************************
; ** 取通道adc_channel的ADC值 **
; ******************************************************/
; unsigned int GetAdcValue(unsigned char adc_channel)
; {
.dbline 19
; unsigned int adc_value=0; //定义全局变量来存储ADC值
clr R10
clr R11
.dbline 23
; unsigned int temp;
; unsigned char i;
;
; adc_init(adc_channel);
mov R16,R12
xcall _adc_init
.dbline 24
; delay_nms(30);
ldi R16,30
ldi R17,0
xcall _delay_nms
.dbline 26
;
; for(i=0;i<19;i++)
clr R20
xjmp L62
L59:
.dbline 27
; {
.dbline 28
; ADCSRA|=(1<<ADSC);
sbi 0x6,6
L63:
.dbline 29
; while((ADCSRA&0x10)==0);
L64:
.dbline 29
sbis 0x6,4
rjmp L63
X11:
.dbline 30
; temp=ADCL;
in R12,0x4
clr R13
.dbline 31
; temp|=(int)ADCH<<8;
in R2,0x5
clr R3
mov R3,R2
clr R2
or R12,R2
or R13,R3
.dbline 32
; adc_value=adc_value+temp;
add R10,R12
adc R11,R13
.dbline 33
; ADCSR|=(0<<ADSC);
in R2,0x6
out 0x6,R2
.dbline 34
; }
L60:
.dbline 26
inc R20
L62:
.dbline 26
cpi R20,19
brlo L59
X12:
.dbline 36
;
; adc_value=adc_value/19;
ldi R18,19
ldi R19,0
movw R16,R10
xcall div16u
movw R10,R16
.dbline 37
; return adc_value;
.dbline -2
L58:
.dbline 0 ; func end
xjmp pop_xgset303C
.dbsym r i 20 c
.dbsym r adc_value 10 i
.dbsym r temp 12 i
.dbsym r adc_channel 12 c
.dbend
.dbfile D:\iccavr\mega16\11\10bit_adc\test.c
.dbfunc e init_devices _init_devices fV
.even
_init_devices::
.dbline -1
.dbline 13
; //ICC-AVR application builder : 2008-11-4 12:53:50
; // Target : M16
; // Crystal: 8.0000Mhz
;
; #include <iom16v.h>
; #include <macros.h>
;
; #include "delay.h"
; #include "lcd1602.h"
; #include "adc.h"
; //call this routine to initialize all peripherals
; void init_devices(void)
; {
.dbline 15
; //stop errant interrupts until set up
; CLI(); //disable all interrupts
cli
.dbline 16
; LCD_init();
xcall _LCD_init
.dbline 17
; PORTD|=BIT(PD7);
sbi 0x12,7
.dbline 18
; DDRD|=BIT(PD7);
sbi 0x11,7
.dbline 20
;
; MCUCR = 0x00;
clr R2
out 0x35,R2
.dbline 21
; GICR = 0x00;
out 0x3b,R2
.dbline 22
; TIMSK = 0x00; //timer interrupt sources
out 0x39,R2
.dbline 23
; SEI(); //re-enable interrupts
sei
.dbline -2
L66:
.dbline 0 ; func end
ret
.dbend
.dbfunc e main _main fV
; adc1 -> R10,R11
; adc0 -> R10,R11
.even
_main::
sbiw R28,2
.dbline -1
.dbline 29
; //all peripherals are now initialized
; }
;
; //
; void main(void)
; {
.dbline 31
; unsigned int adc0,adc1;
; init_devices();
xcall _init_devices
.dbline 33
; //insert your functional code here...
; LCD_write_string(0,0,"10_Bit ADC Test!");
ldi R24,<L68
ldi R25,>L68
std y+1,R25
std y+0,R24
clr R18
clr R16
xcall _LCD_write_string
.dbline 34
; delay_nms(2000);
ldi R16,2000
ldi R17,7
xcall _delay_nms
.dbline 35
; LCD_write_string(0,0," ADC0: V ");
ldi R24,<L69
ldi R25,>L69
std y+1,R25
std y+0,R24
clr R18
clr R16
xcall _LCD_write_string
.dbline 36
; LCD_write_string(0,1," ADC1: V ");
ldi R24,<L70
ldi R25,>L70
std y+1,R25
std y+0,R24
ldi R18,1
clr R16
xcall _LCD_write_string
xjmp L72
L71:
.dbline 38
; while(1)
; {
.dbline 39
; adc0=GetAdcValue(0);
clr R16
xcall _GetAdcValue
movw R10,R16
.dbline 40
; LCD_write_adc(7,0,adc0);
std y+1,R11
std y+0,R10
clr R18
ldi R16,7
xcall _LCD_write_adc
.dbline 42
;
; adc1=GetAdcValue(1);
ldi R16,1
xcall _GetAdcValue
movw R10,R16
.dbline 43
; LCD_write_adc(7,1,adc1);
std y+1,R11
std y+0,R10
ldi R18,1
ldi R16,7
xcall _LCD_write_adc
.dbline 44
; }
L72:
.dbline 37
xjmp L71
X13:
.dbline -2
L67:
.dbline 0 ; func end
adiw R28,2
ret
.dbsym r adc1 10 i
.dbsym r adc0 10 i
.dbend
.area data(ram, con, rel)
.dbfile D:\iccavr\mega16\11\10bit_adc\test.c
L70:
.blkb 17
.area idata
.byte 32,'A,'D,'C,49,58,32,32,32,32,32,32,'V,32,32,32
.byte 0
.area data(ram, con, rel)
.dbfile D:\iccavr\mega16\11\10bit_adc\test.c
L69:
.blkb 17
.area idata
.byte 32,'A,'D,'C,48,58,32,32,32,32,32,32,'V,32,32,32
.byte 0
.area data(ram, con, rel)
.dbfile D:\iccavr\mega16\11\10bit_adc\test.c
L68:
.blkb 17
.area idata
.byte 49,48,95,'B,'i,'t,32,'A,'D,'C,32,'T,'e,'s,'t,33
.byte 0
.area data(ram, con, rel)
.dbfile D:\iccavr\mega16\11\10bit_adc\test.c
.area lit(rom, con, rel)
L48:
.word 0xb22d,0x409d
; }
;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -