⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 adc.s

📁 AVR mega16系列单片机开发程序
💻 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 + -