📄 adc.lis
字号:
.module adc.c
.area text(rom, con, rel)
0000 .dbfile E:\尤虎\程序设计\AVR单片机\MAGE16\ADCAND~1\adc.c
0000 .dbfunc e adc_init _adc_init fV
.even
0000 _adc_init::
0000 .dbline -1
0000 .dbline 21
0000 ; //Project :ADC(10 bit) and LCD Display
0000 ; //ICC-AVR application builder : 2007-5-10 21:20:44
0000 ; // Target : M16
0000 ; // Crystal : 8.0000Mhz
0000 ; // Writer : you hu
0000 ; #include <iom16v.h>
0000 ; #include <macros.h>
0000 ; #include "lcd.h"
0000 ; #include "display.h"
0000 ;
0000 ; typedef unsigned char uchar;
0000 ; typedef unsigned int uint;
0000 ;
0000 ; int value; //全局变量,存储10位的AD转换数据
0000 ;
0000 ;
0000 ; //ADC initialize
0000 ; // Conversion time: 52uS
0000 ;
0000 ; void adc_init(void)
0000 ; {
0000 .dbline 22
0000 ; ADCSR = 0x00; //禁止AD启动
0000 2224 clr R2
0002 26B8 out 0x6,R2
0004 .dbline 23
0004 ; ADMUX = 0xC0; //选择通道0,默认的右对齐方式
0004 80EC ldi R24,192
0006 87B9 out 0x7,R24
0008 .dbline 24
0008 ; ACSR = 0x80;
0008 80E8 ldi R24,128
000A 88B9 out 0x8,R24
000C .dbline 25
000C ; ADCSR = 0xED; //启动AD转换
000C 8DEE ldi R24,237
000E 86B9 out 0x6,R24
0010 .dbline -2
0010 L1:
0010 .dbline 0 ; func end
0010 0895 ret
0012 .dbend
.area vector(rom, abs)
.org 56
0038 0C940900 jmp _adc_isr
.area text(rom, con, rel)
0012 .dbfile E:\尤虎\程序设计\AVR单片机\MAGE16\ADCAND~1\adc.c
0012 .dbfunc e adc_isr _adc_isr fV
.even
0012 _adc_isr::
0012 2A92 st -y,R2
0014 3A92 st -y,R3
0016 4A92 st -y,R4
0018 5A92 st -y,R5
001A 2FB6 in R2,0x3f
001C 2A92 st -y,R2
001E .dbline -1
001E .dbline 30
001E ; }
001E ;
001E ; #pragma interrupt_handler adc_isr:15 //中断方式读取AD转换值
001E ; void adc_isr(void)
001E ; {
001E .dbline 31
001E ; value=ADCL; //读取低8位转换值
001E 24B0 in R2,0x4
0020 3324 clr R3
0022 30920100 sts _value+1,R3
0026 20920000 sts _value,R2
002A .dbline 32
002A ; value|=(int)ADCH << 8; //读取高2位转换值
002A 25B0 in R2,0x5
002C 3324 clr R3
002E 322C mov R3,R2
0030 2224 clr R2
0032 40900000 lds R4,_value
0036 50900100 lds R5,_value+1
003A 4228 or R4,R2
003C 5328 or R5,R3
003E 50920100 sts _value+1,R5
0042 40920000 sts _value,R4
0046 .dbline -2
0046 L2:
0046 2990 ld R2,y+
0048 2FBE out 0x3f,R2
004A 5990 ld R5,y+
004C 4990 ld R4,y+
004E 3990 ld R3,y+
0050 2990 ld R2,y+
0052 .dbline 0 ; func end
0052 1895 reti
0054 .dbend
0054 .dbfunc e Bit_display _Bit_display fV
0054 ; Y -> R22
0054 ; X -> R20
.even
0054 _Bit_display::
0054 0E940000 xcall push_gset2
0058 622F mov R22,R18
005A 402F mov R20,R16
005C 2197 sbiw R28,1
005E .dbline -1
005E .dbline 37
005E ; }
005E ;
005E ;
005E ; void Bit_display(unsigned char X,unsigned char Y) //位显示函数,将对转换结果的数字量进行“0”或“1”的显示
005E ; {
005E .dbline 39
005E ;
005E ; if(Y)
005E 6623 tst R22
0060 39F0 breq L4
0062 .dbline 40
0062 ; LCD_write_char(X,0,'1'); //如果转换结果变量的某一位为“1”,则显示,否则显示“0”
0062 81E3 ldi R24,49
0064 8883 std y+0,R24
0066 2227 clr R18
0068 042F mov R16,R20
006A 0E940000 xcall _LCD_write_char
006E 06C0 xjmp L5
0070 L4:
0070 .dbline 42
0070 80E3 ldi R24,48
0072 8883 std y+0,R24
0074 2227 clr R18
0076 042F mov R16,R20
0078 0E940000 xcall _LCD_write_char
007C L5:
007C .dbline -2
007C L3:
007C 2196 adiw R28,1
007E 0E940000 xcall pop_gset2
0082 .dbline 0 ; func end
0082 0895 ret
0084 .dbsym r Y 22 c
0084 .dbsym r X 20 c
0084 .dbend
0084 .dbfunc e Bit_transfor _Bit_transfor fV
0084 ; pos -> R20
0084 ; i -> R22
0084 ; bits -> R10,R11
0084 ; datas -> R12,R13
.even
0084 _Bit_transfor::
0084 0E940000 xcall push_gset4
0088 .dbline -1
0088 .dbline 46
0088 ; else
0088 ; LCD_write_char(X,0,'0');
0088 ; }
0088 ;
0088 ; void Bit_transfor(void) //对12位数字量的量化和显示函数
0088 ; {
0088 .dbline 48
0088 ; unsigned int datas;
0088 ; unsigned int bits=0x0001; //位屏蔽变量,通过移位处理,将得出数字量的每一位值(0或1)
0088 81E0 ldi R24,1
008A 90E0 ldi R25,0
008C 5C01 movw R10,R24
008E .dbline 49
008E ; unsigned char i,pos=10; //显示位置变量,通过循环处理将依次将数字量的每一位显示在LCD上
008E 4AE0 ldi R20,10
0090 .dbline 50
0090 ; init_lcd();
0090 0E940000 xcall _init_lcd
0094 .dbline 51
0094 ; datas =(value&bits); //最低位独立处理
0094 C0900000 lds R12,_value
0098 D0900100 lds R13,_value+1
009C CA20 and R12,R10
009E DB20 and R13,R11
00A0 .dbline 52
00A0 ; Bit_display(11,datas);
00A0 2C2D mov R18,R12
00A2 0BE0 ldi R16,11
00A4 D7DF xcall _Bit_display
00A6 .dbline 53
00A6 ; bits = bits<<1;
00A6 AA0C lsl R10
00A8 BB1C rol R11
00AA .dbline 54
00AA ; for(i=0;i<=10;i++) //高11位在循环中处理
00AA 6627 clr R22
00AC 15C0 xjmp L10
00AE L7:
00AE .dbline 55
00AE .dbline 56
00AE C0900000 lds R12,_value
00B2 D0900100 lds R13,_value+1
00B6 CA20 and R12,R10
00B8 DB20 and R13,R11
00BA .dbline 57
00BA 262F mov R18,R22
00BC 3327 clr R19
00BE 2F5F subi R18,255 ; offset = 1
00C0 3F4F sbci R19,255
00C2 8601 movw R16,R12
00C4 0E940000 xcall lsr16
00C8 6801 movw R12,R16
00CA .dbline 58
00CA 2C2D mov R18,R12
00CC 042F mov R16,R20
00CE C2DF xcall _Bit_display
00D0 .dbline 59
00D0 AA0C lsl R10
00D2 BB1C rol R11
00D4 .dbline 60
00D4 4A95 dec R20
00D6 .dbline 61
00D6 L8:
00D6 .dbline 54
00D6 6395 inc R22
00D8 L10:
00D8 .dbline 54
00D8 8AE0 ldi R24,10
00DA 8617 cp R24,R22
00DC 40F7 brsh L7
00DE .dbline -2
00DE L6:
00DE 0E940000 xcall pop_gset4
00E2 .dbline 0 ; func end
00E2 0895 ret
00E4 .dbsym r pos 20 c
00E4 .dbsym r i 22 c
00E4 .dbsym r bits 10 i
00E4 .dbsym r datas 12 i
00E4 .dbend
00E4 .dbfunc e Analog_display _Analog_display fV
00E4 ; data -> R22
00E4 ; X -> R20
.even
00E4 _Analog_display::
00E4 0E940000 xcall push_gset2
00E8 622F mov R22,R18
00EA 402F mov R20,R16
00EC 2197 sbiw R28,1
00EE .dbline -1
00EE .dbline 67
00EE ; {
00EE ; datas =(value&bits); //位屏蔽操作
00EE ; datas = datas>>(i+1);
00EE ; Bit_display(pos,datas); //位显示操作
00EE ; bits = bits<<1;
00EE ; pos--;
00EE ; }
00EE ; }
00EE ;
00EE ;
00EE ;
00EE ; void Analog_display(unsigned char X,unsigned char data) //对输入模拟量的显示
00EE ; {
00EE .dbline 68
00EE ; switch(data)
00EE 7727 clr R23
00F0 6030 cpi R22,0
00F2 6707 cpc R22,R23
00F4 09F4 brne X2
00F6 2EC0 xjmp L15
00F8 X2:
00F8 X0:
00F8 6130 cpi R22,1
00FA E0E0 ldi R30,0
00FC 7E07 cpc R23,R30
00FE 09F4 brne X3
0100 30C0 xjmp L16
0102 X3:
0102 6230 cpi R22,2
0104 E0E0 ldi R30,0
0106 7E07 cpc R23,R30
0108 09F4 brne X4
010A 32C0 xjmp L17
010C X4:
010C 6330 cpi R22,3
010E E0E0 ldi R30,0
0110 7E07 cpc R23,R30
0112 09F4 brne X5
0114 34C0 xjmp L18
0116 X5:
0116 6430 cpi R22,4
0118 E0E0 ldi R30,0
011A 7E07 cpc R23,R30
011C 09F4 brne X6
011E 36C0 xjmp L19
0120 X6:
0120 6530 cpi R22,5
0122 E0E0 ldi R30,0
0124 7E07 cpc R23,R30
0126 09F4 brne X7
0128 38C0 xjmp L20
012A X7:
012A 6630 cpi R22,6
012C E0E0 ldi R30,0
012E 7E07 cpc R23,R30
0130 09F4 brne X8
0132 3AC0 xjmp L21
0134 X8:
0134 6730 cpi R22,7
0136 E0E0 ldi R30,0
0138 7E07 cpc R23,R30
013A 09F4 brne X9
013C 3CC0 xjmp L22
013E X9:
013E 6830 cpi R22,8
0140 E0E0 ldi R30,0
0142 7E07 cpc R23,R30
0144 09F4 brne X10
0146 3EC0 xjmp L23
0148 X10:
0148 6930 cpi R22,9
014A E0E0 ldi R30,0
014C 7E07 cpc R23,R30
014E 09F4 brne X11
0150 40C0 xjmp L24
0152 X11:
0152 45C0 xjmp L12
0154 X1:
0154 .dbline 69
0154 ; {
0154 L15:
0154 .dbline 70
0154 ; case 0:LCD_write_char( X, 1, '0'); break;
0154 80E3 ldi R24,48
0156 8883 std y+0,R24
0158 21E0 ldi R18,1
015A 042F mov R16,R20
015C 0E940000 xcall _LCD_write_char
0160 .dbline 70
0160 3EC0 xjmp L13
0162 L16:
0162 .dbline 71
0162 ; case 1:LCD_write_char( X, 1, '1'); break;
0162 81E3 ldi R24,49
0164 8883 std y+0,R24
0166 21E0 ldi R18,1
0168 042F mov R16,R20
016A 0E940000 xcall _LCD_write_char
016E .dbline 71
016E 37C0 xjmp L13
0170 L17:
0170 .dbline 72
0170 ; case 2:LCD_write_char( X, 1, '2'); break;
0170 82E3 ldi R24,50
0172 8883 std y+0,R24
0174 21E0 ldi R18,1
0176 042F mov R16,R20
0178 0E940000 xcall _LCD_write_char
017C .dbline 72
017C 30C0 xjmp L13
017E L18:
017E .dbline 73
017E ; case 3:LCD_write_char( X, 1, '3'); break;
017E 83E3 ldi R24,51
0180 8883 std y+0,R24
0182 21E0 ldi R18,1
0184 042F mov R16,R20
0186 0E940000 xcall _LCD_write_char
018A .dbline 73
018A 29C0 xjmp L13
018C L19:
018C .dbline 74
018C ; case 4:LCD_write_char( X, 1, '4'); break;
018C 84E3 ldi R24,52
018E 8883 std y+0,R24
0190 21E0 ldi R18,1
0192 042F mov R16,R20
0194 0E940000 xcall _LCD_write_char
0198 .dbline 74
0198 22C0 xjmp L13
019A L20:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -