📄 adc.s
字号:
.module adc.c
.area text(rom, con, rel)
.dbfile E:\尤虎\程序设计\AVR单片机\MAGE16\ADCAND~1\adc.c
.dbfunc e adc_init _adc_init fV
.even
_adc_init::
.dbline -1
.dbline 21
; //Project :ADC(10 bit) and LCD Display
; //ICC-AVR application builder : 2007-5-10 21:20:44
; // Target : M16
; // Crystal : 8.0000Mhz
; // Writer : you hu
; #include <iom16v.h>
; #include <macros.h>
; #include "lcd.h"
; #include "display.h"
;
; typedef unsigned char uchar;
; typedef unsigned int uint;
;
; int value; //全局变量,存储10位的AD转换数据
;
;
; //ADC initialize
; // Conversion time: 52uS
;
; void adc_init(void)
; {
.dbline 22
; ADCSR = 0x00; //禁止AD启动
clr R2
out 0x6,R2
.dbline 23
; ADMUX = 0xC0; //选择通道0,默认的右对齐方式
ldi R24,192
out 0x7,R24
.dbline 24
; ACSR = 0x80;
ldi R24,128
out 0x8,R24
.dbline 25
; ADCSR = 0xED; //启动AD转换
ldi R24,237
out 0x6,R24
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbend
.area vector(rom, abs)
.org 56
jmp _adc_isr
.area text(rom, con, rel)
.dbfile E:\尤虎\程序设计\AVR单片机\MAGE16\ADCAND~1\adc.c
.dbfunc e adc_isr _adc_isr fV
.even
_adc_isr::
st -y,R2
st -y,R3
st -y,R4
st -y,R5
in R2,0x3f
st -y,R2
.dbline -1
.dbline 30
; }
;
; #pragma interrupt_handler adc_isr:15 //中断方式读取AD转换值
; void adc_isr(void)
; {
.dbline 31
; value=ADCL; //读取低8位转换值
in R2,0x4
clr R3
sts _value+1,R3
sts _value,R2
.dbline 32
; value|=(int)ADCH << 8; //读取高2位转换值
in R2,0x5
clr R3
mov R3,R2
clr R2
lds R4,_value
lds R5,_value+1
or R4,R2
or R5,R3
sts _value+1,R5
sts _value,R4
.dbline -2
L2:
ld R2,y+
out 0x3f,R2
ld R5,y+
ld R4,y+
ld R3,y+
ld R2,y+
.dbline 0 ; func end
reti
.dbend
.dbfunc e Bit_display _Bit_display fV
; Y -> R22
; X -> R20
.even
_Bit_display::
xcall push_gset2
mov R22,R18
mov R20,R16
sbiw R28,1
.dbline -1
.dbline 37
; }
;
;
; void Bit_display(unsigned char X,unsigned char Y) //位显示函数,将对转换结果的数字量进行“0”或“1”的显示
; {
.dbline 39
;
; if(Y)
tst R22
breq L4
.dbline 40
; LCD_write_char(X,0,'1'); //如果转换结果变量的某一位为“1”,则显示,否则显示“0”
ldi R24,49
std y+0,R24
clr R18
mov R16,R20
xcall _LCD_write_char
xjmp L5
L4:
.dbline 42
ldi R24,48
std y+0,R24
clr R18
mov R16,R20
xcall _LCD_write_char
L5:
.dbline -2
L3:
adiw R28,1
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r Y 22 c
.dbsym r X 20 c
.dbend
.dbfunc e Bit_transfor _Bit_transfor fV
; pos -> R20
; i -> R22
; bits -> R10,R11
; datas -> R12,R13
.even
_Bit_transfor::
xcall push_gset4
.dbline -1
.dbline 46
; else
; LCD_write_char(X,0,'0');
; }
;
; void Bit_transfor(void) //对12位数字量的量化和显示函数
; {
.dbline 48
; unsigned int datas;
; unsigned int bits=0x0001; //位屏蔽变量,通过移位处理,将得出数字量的每一位值(0或1)
ldi R24,1
ldi R25,0
movw R10,R24
.dbline 49
; unsigned char i,pos=10; //显示位置变量,通过循环处理将依次将数字量的每一位显示在LCD上
ldi R20,10
.dbline 50
; init_lcd();
xcall _init_lcd
.dbline 51
; datas =(value&bits); //最低位独立处理
lds R12,_value
lds R13,_value+1
and R12,R10
and R13,R11
.dbline 52
; Bit_display(11,datas);
mov R18,R12
ldi R16,11
xcall _Bit_display
.dbline 53
; bits = bits<<1;
lsl R10
rol R11
.dbline 54
; for(i=0;i<=10;i++) //高11位在循环中处理
clr R22
xjmp L10
L7:
.dbline 55
.dbline 56
lds R12,_value
lds R13,_value+1
and R12,R10
and R13,R11
.dbline 57
mov R18,R22
clr R19
subi R18,255 ; offset = 1
sbci R19,255
movw R16,R12
xcall lsr16
movw R12,R16
.dbline 58
mov R18,R12
mov R16,R20
xcall _Bit_display
.dbline 59
lsl R10
rol R11
.dbline 60
dec R20
.dbline 61
L8:
.dbline 54
inc R22
L10:
.dbline 54
ldi R24,10
cp R24,R22
brsh L7
.dbline -2
L6:
xcall pop_gset4
.dbline 0 ; func end
ret
.dbsym r pos 20 c
.dbsym r i 22 c
.dbsym r bits 10 i
.dbsym r datas 12 i
.dbend
.dbfunc e Analog_display _Analog_display fV
; data -> R22
; X -> R20
.even
_Analog_display::
xcall push_gset2
mov R22,R18
mov R20,R16
sbiw R28,1
.dbline -1
.dbline 67
; {
; datas =(value&bits); //位屏蔽操作
; datas = datas>>(i+1);
; Bit_display(pos,datas); //位显示操作
; bits = bits<<1;
; pos--;
; }
; }
;
;
;
; void Analog_display(unsigned char X,unsigned char data) //对输入模拟量的显示
; {
.dbline 68
; switch(data)
clr R23
cpi R22,0
cpc R22,R23
brne X2
xjmp L15
X2:
X0:
cpi R22,1
ldi R30,0
cpc R23,R30
brne X3
xjmp L16
X3:
cpi R22,2
ldi R30,0
cpc R23,R30
brne X4
xjmp L17
X4:
cpi R22,3
ldi R30,0
cpc R23,R30
brne X5
xjmp L18
X5:
cpi R22,4
ldi R30,0
cpc R23,R30
brne X6
xjmp L19
X6:
cpi R22,5
ldi R30,0
cpc R23,R30
brne X7
xjmp L20
X7:
cpi R22,6
ldi R30,0
cpc R23,R30
brne X8
xjmp L21
X8:
cpi R22,7
ldi R30,0
cpc R23,R30
brne X9
xjmp L22
X9:
cpi R22,8
ldi R30,0
cpc R23,R30
brne X10
xjmp L23
X10:
cpi R22,9
ldi R30,0
cpc R23,R30
brne X11
xjmp L24
X11:
xjmp L12
X1:
.dbline 69
; {
L15:
.dbline 70
; case 0:LCD_write_char( X, 1, '0'); break;
ldi R24,48
std y+0,R24
ldi R18,1
mov R16,R20
xcall _LCD_write_char
.dbline 70
xjmp L13
L16:
.dbline 71
; case 1:LCD_write_char( X, 1, '1'); break;
ldi R24,49
std y+0,R24
ldi R18,1
mov R16,R20
xcall _LCD_write_char
.dbline 71
xjmp L13
L17:
.dbline 72
; case 2:LCD_write_char( X, 1, '2'); break;
ldi R24,50
std y+0,R24
ldi R18,1
mov R16,R20
xcall _LCD_write_char
.dbline 72
xjmp L13
L18:
.dbline 73
; case 3:LCD_write_char( X, 1, '3'); break;
ldi R24,51
std y+0,R24
ldi R18,1
mov R16,R20
xcall _LCD_write_char
.dbline 73
xjmp L13
L19:
.dbline 74
; case 4:LCD_write_char( X, 1, '4'); break;
ldi R24,52
std y+0,R24
ldi R18,1
mov R16,R20
xcall _LCD_write_char
.dbline 74
xjmp L13
L20:
.dbline 75
; case 5:LCD_write_char( X, 1, '5'); break;
ldi R24,53
std y+0,R24
ldi R18,1
mov R16,R20
xcall _LCD_write_char
.dbline 75
xjmp L13
L21:
.dbline 76
; case 6:LCD_write_char( X, 1, '6'); break;
ldi R24,54
std y+0,R24
ldi R18,1
mov R16,R20
xcall _LCD_write_char
.dbline 76
xjmp L13
L22:
.dbline 77
; case 7:LCD_write_char( X, 1, '7'); break;
ldi R24,55
std y+0,R24
ldi R18,1
mov R16,R20
xcall _LCD_write_char
.dbline 77
xjmp L13
L23:
.dbline 78
; case 8:LCD_write_char( X, 1, '8'); break;
ldi R24,56
std y+0,R24
ldi R18,1
mov R16,R20
xcall _LCD_write_char
.dbline 78
xjmp L13
L24:
.dbline 79
; case 9:LCD_write_char( X, 1, '9'); break;
ldi R24,57
std y+0,R24
ldi R18,1
mov R16,R20
xcall _LCD_write_char
.dbline 79
L12:
L13:
.dbline -2
L11:
adiw R28,1
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r data 22 c
.dbsym r X 20 c
.dbend
.dbfunc e Analog_transfor _Analog_transfor fV
; x5 -> R20,R21
; x4 -> R22,R23
; x3 -> R22,R23
; x2 -> R22,R23
; x1 -> R22,R23
; value2 -> R20,R21
; result -> R20,R21
.even
_Analog_transfor::
xcall push_gset2
sbiw R28,5
.dbline -1
.dbline 85
; }
; }
;
;
; void Analog_transfor(void) //在液晶的第二行显示对应的输入模拟电压值
; {
.dbline 89
; uint value2;
; uint result;
; uint x1,x2,x3,x4,x5;
; value2 = value; //由于选择的转化方式为右对齐,因此在此处
lds R20,_value
lds R21,_value+1
.dbline 91
; //需要右移2位以取得准确的数字量。
; result=(value2*2.56/1024)*10000; //以下为数字处理部分,可作为AD转换的通用处理模块
ldi R16,<L28
ldi R17,>L28
xcall lpm32
st -y,R19
st -y,R18
st -y,R17
st -y,R16
ldi R16,<L29
ldi R17,>L29
xcall lpm32
st -y,R19
st -y,R18
st -y,R17
st -y,R16
ldi R16,<L30
ldi R17,>L30
xcall lpm32
st -y,R19
st -y,R18
st -y,R17
st -y,R16
movw R16,R20
lsr R17
ror R16
xcall int2fp
st -y,R19
st -y,R18
st -y,R17
st -y,R16
xcall empy32fs
movw R16,R20
andi R16,1
andi R17,0
xcall int2fp
st -y,R19
st -y,R18
st -y,R17
st -y,R16
xcall add32fs
xcall empy32fs
ldi R16,<L31
ldi R17,>L31
xcall lpm32
st -y,R19
st -y,R18
st -y,R17
st -y,R16
xcall div32fs
xcall empy32f
movw R30,R28
std z+1,R16
std z+2,R17
std z+3,R18
std z+4,R19
movw R30,R28
ldd R2,z+1
ldd R3,z+2
ldd R4,z+3
ldd R5,z+4
st -y,R5
st -y,R4
st -y,R3
st -y,R2
ldi R16,<L32
ldi R17,>L32
xcall lpm32
st -y,R19
st -y,R18
st -y,R17
st -y,R16
xcall cmp32f
brlt L26
movw R30,R28
ldd R2,z+1
ldd R3,z+2
ldd R4,z+3
ldd R5,z+4
st -y,R5
st -y,R4
st -y,R3
st -y,R2
ldi R16,<L32
ldi R17,>L32
xcall lpm32
st -y,R19
st -y,R18
st -y,R17
st -y,R16
xcall sub32f
xcall fp2int
movw R22,R16
subi R22,0 ; offset = 32768
sbci R23,128
xjmp L27
L26:
movw R30,R28
ldd R16,z+1
ldd R17,z+2
ldd R18,z+3
ldd R19,z+4
xcall fp2int
movw R22,R16
L27:
movw R20,R22
.dbline 93
;
; x1=result/10000; Analog_display(0,x1);
ldi R18,10000
ldi R19,39
movw R16,R20
xcall div16u
movw R22,R16
.dbline 93
mov R18,R22
clr R16
xcall _Analog_display
.dbline 94
; LCD_write_char(1,1,'.');
ldi R24,46
std y+0,R24
ldi R18,1
ldi R16,1
xcall _LCD_write_char
.dbline 95
; x2=(result/1000)%10; Analog_display(2,x2);
ldi R18,1000
ldi R19,3
movw R16,R20
xcall div16u
ldi R18,10
ldi R19,0
xcall mod16u
movw R22,R16
.dbline 95
mov R18,R22
ldi R16,2
xcall _Analog_display
.dbline 96
; x3=(result/100)%100%10; Analog_display(3,x3);
ldi R18,100
ldi R19,0
movw R16,R20
xcall div16u
ldi R18,100
ldi R19,0
xcall mod16u
ldi R18,10
ldi R19,0
xcall mod16u
movw R22,R16
.dbline 96
mov R18,R22
ldi R16,3
xcall _Analog_display
.dbline 97
; x4=(result/10)%1000%10; Analog_display(4,x4);
ldi R18,10
ldi R19,0
movw R16,R20
xcall div16u
ldi R18,1000
ldi R19,3
xcall mod16u
ldi R18,10
ldi R19,0
xcall mod16u
movw R22,R16
.dbline 97
mov R18,R22
ldi R16,4
xcall _Analog_display
.dbline 98
; x5=(result%1000)%100%10; Analog_display(5,x5);
ldi R18,1000
ldi R19,3
movw R16,R20
xcall mod16u
ldi R18,100
ldi R19,0
xcall mod16u
ldi R18,10
ldi R19,0
xcall mod16u
movw R20,R16
.dbline 98
mov R18,R20
ldi R16,5
xcall _Analog_display
.dbline -2
L25:
adiw R28,5
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r x5 20 i
.dbsym r x4 22 i
.dbsym r x3 22 i
.dbsym r x2 22 i
.dbsym r x1 22 i
.dbsym r value2 20 i
.dbsym r result 20 i
.dbend
.dbfunc e init_devices _init_devices fV
.even
_init_devices::
.dbline -1
.dbline 102
; }
;
; void init_devices(void)
; {
.dbline 104
;
; CLI(); //禁止所有中断
cli
.dbline 105
; adc_init();
xcall _adc_init
.dbline 106
; Bit_transfor(); //数字量显示
xcall _Bit_transfor
.dbline 107
; Analog_transfor(); //模拟量显示
xcall _Analog_transfor
.dbline 108
; MCUCR = 0x00;
clr R2
out 0x35,R2
.dbline 109
; SREG = 0X80; //允许中断发生
ldi R24,128
out 0x3f,R24
.dbline 110
; GICR = 0x00;
out 0x3b,R2
.dbline 111
; TIMSK = 0x00;
out 0x39,R2
.dbline 112
; SEI(); //重新开启所有中断
sei
.dbline -2
L33:
.dbline 0 ; func end
ret
.dbend
.dbfunc e main _main fV
.even
_main::
.dbline -1
.dbline 118
;
; }
;
;
; void main(void)
; {
.dbline 119
; init_devices();
xcall _init_devices
L35:
.dbline 120
L36:
.dbline 120
xjmp L35
X12:
.dbline -2
L34:
.dbline 0 ; func end
ret
.dbend
.area bss(ram, con, rel)
.dbfile E:\尤虎\程序设计\AVR单片机\MAGE16\ADCAND~1\adc.c
_value::
.blkb 2
.dbsym e value _value I
.area lit(rom, con, rel)
L32:
.word 0x0,0x4700
L31:
.word 0x0,0x4480
L30:
.word 0x0,0x4000
L29:
.word 0xd70a,0x4023
L28:
.word 0x4000,0x461c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -