📄 取得电压函数.lis
字号:
.module _取得电压函数.c
.area text(rom, con, rel)
0000 .dbfile E:\xiaozhiyong2009\设计资料\项目设计\mega8_C语言常用程序\ICCAVR_mega8_取得电压函数\取得电压函数.c
0000 .dbfunc e port_init _port_init fV
.even
0000 _port_init::
0000 .dbline -1
0000 .dbline 9
0000 ; //ICC-AVR application builder : 2009-3-10 14:59:10
0000 ; // Target : M8
0000 ; // Crystal: 8.0000Mhz
0000 ;
0000 ; #include <iom8v.h>
0000 ; #include <macros.h>
0000 ;
0000 ; void port_init(void)
0000 ; {
0000 .dbline 10
0000 ; PORTB = 0x00;
0000 2224 clr R2
0002 28BA out 0x18,R2
0004 .dbline 11
0004 ; DDRB = 0x00;
0004 27BA out 0x17,R2
0006 .dbline 12
0006 ; PORTC = 0x00; //m103 output only
0006 25BA out 0x15,R2
0008 .dbline 13
0008 ; DDRC = 0x00;
0008 24BA out 0x14,R2
000A .dbline 14
000A ; PORTD = 0x00;
000A 22BA out 0x12,R2
000C .dbline 15
000C ; DDRD = 0x00;
000C 21BA out 0x11,R2
000E .dbline -2
000E L1:
000E .dbline 0 ; func end
000E 0895 ret
0010 .dbend
0010 .dbfunc e init_devices _init_devices fV
.even
0010 _init_devices::
0010 .dbline -1
0010 .dbline 20
0010 ; }
0010 ;
0010 ; //call this routine to initialize all peripherals
0010 ; void init_devices(void)
0010 ; {
0010 .dbline 22
0010 ; //stop errant interrupts until set up
0010 ; CLI(); //disable all interrupts
0010 F894 cli
0012 .dbline 23
0012 ; port_init();
0012 F6DF rcall _port_init
0014 .dbline 25
0014 ;
0014 ; MCUCR = 0x00;
0014 2224 clr R2
0016 25BE out 0x35,R2
0018 .dbline 26
0018 ; GICR = 0x00;
0018 2BBE out 0x3b,R2
001A .dbline 27
001A ; TIMSK = 0x00; //timer interrupt sources
001A 29BE out 0x39,R2
001C .dbline 28
001C ; SEI(); //re-enable interrupts
001C 7894 sei
001E .dbline -2
001E L2:
001E .dbline 0 ; func end
001E 0895 ret
0020 .dbend
0020 .dbfunc e delay_us _delay_us fV
0020 ; time -> R16,R17
.even
0020 _delay_us::
0020 .dbline -1
0020 .dbline 40
0020 ; //all peripherals are now initialized
0020 ; }
0020 ;
0020 ; /************************************
0020 ; 用 途:微秒级延时程序
0020 ; Taget :mega8
0020 ; crystal :8M
0020 ; 介 绍:在8M的晶振上进行us级的延时
0020 ; 入口参数:
0020 ; *************************************/
0020 ; void delay_us(int time)
0020 ; {
0020 L4:
0020 .dbline 42
0020 ; do
0020 ; {
0020 .dbline 43
0020 ; time--;
0020 0150 subi R16,1
0022 1040 sbci R17,0
0024 .dbline 44
0024 ; }
0024 L5:
0024 .dbline 45
0024 ; while (time > 1);
0024 81E0 ldi R24,1
0026 90E0 ldi R25,0
0028 8017 cp R24,R16
002A 9107 cpc R25,R17
002C CCF3 brlt L4
002E X0:
002E .dbline -2
002E L3:
002E .dbline 0 ; func end
002E 0895 ret
0030 .dbsym r time 16 I
0030 .dbend
.area lit(rom, con, rel)
0000 _num::
0000 3F06 .byte 63,6
0002 5B4F .byte 91,'O
0004 666D .byte 'f,'m
0006 7D07 .byte 125,7
0008 7F6F .byte 127,'o
000A 777C .byte 'w,124
000C 395E .byte 57,94
000E 7971 .byte 'y,'q
0010 .dbsym e num _num A[16:16]kc
.area text(rom, con, rel)
0030 .dbfile E:\xiaozhiyong2009\设计资料\项目设计\mega8_C语言常用程序\ICCAVR_mega8_取得电压函数\取得电压函数.c
0030 .dbfunc e show_2_digit _show_2_digit fV
0030 ; i -> <dead>
0030 ; digi -> R10
.even
0030 _show_2_digit::
0030 AA92 st -y,R10
0032 A02E mov R10,R16
0034 .dbline -1
0034 .dbline 67
0034 ; }
0034 ;
0034 ;
0034 ; /************************************
0034 ; 用 途:两位数码管显示一个数
0034 ; Taget :mega8
0034 ; crystal :8M
0034 ; 介 绍:共阳数码管
0034 ; 1-PC1(片选)
0034 ; 2-PC0
0034 ; -----
0034 ; a-PB0(数据)
0034 ; b-PB1
0034 ; ...
0034 ; h-PB6
0034 ; DP-PB7
0034 ; 入口参数:要显示的数,十进制表示
0034 ; *************************************/
0034 ; const unsigned char num[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0034 ; 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
0034 ; void show_2_digit(unsigned char digi)
0034 ; {
0034 .dbline 69
0034 ; unsigned char i;
0034 ; DDRD=0xff;
0034 8FEF ldi R24,255
0036 81BB out 0x11,R24
0038 .dbline 70
0038 ; DDRB=0xff;
0038 87BB out 0x17,R24
003A .dbline 71
003A ; PORTD=0;//关片选
003A 2224 clr R2
003C 22BA out 0x12,R2
003E .dbline 72
003E ; PORTB=~num[(unsigned char )(digi/10)];//显示十位
003E 2AE0 ldi R18,10
0040 30E0 ldi R19,0
0042 0A2D mov R16,R10
0044 1127 clr R17
0046 00D0 rcall div16s
0048 E02F mov R30,R16
004A FF27 clr R31
004C 80E0 ldi R24,<_num
004E 90E0 ldi R25,>_num
0050 E80F add R30,R24
0052 F91F adc R31,R25
0054 2490 lpm R2,Z
0056 2094 com R2
0058 28BA out 0x18,R2
005A .dbline 73
005A ; PORTD=(0x1<<1);//开十位的显示
005A 82E0 ldi R24,2
005C 82BB out 0x12,R24
005E .dbline 74
005E ; delay_us(200);
005E 08EC ldi R16,200
0060 10E0 ldi R17,0
0062 DEDF rcall _delay_us
0064 .dbline 75
0064 ; PORTD=0;//关显示
0064 2224 clr R2
0066 22BA out 0x12,R2
0068 .dbline 76
0068 ; PORTB=~num[(unsigned char )(digi%10)];//显示个位
0068 2AE0 ldi R18,10
006A 30E0 ldi R19,0
006C 0A2D mov R16,R10
006E 1127 clr R17
0070 00D0 rcall mod16s
0072 E02F mov R30,R16
0074 FF27 clr R31
0076 80E0 ldi R24,<_num
0078 90E0 ldi R25,>_num
007A E80F add R30,R24
007C F91F adc R31,R25
007E 2490 lpm R2,Z
0080 2094 com R2
0082 28BA out 0x18,R2
0084 .dbline 77
0084 ; PORTD=(0x1<<0);//开个位的显示
0084 81E0 ldi R24,1
0086 82BB out 0x12,R24
0088 .dbline 78
0088 ; delay_us(200);
0088 08EC ldi R16,200
008A 10E0 ldi R17,0
008C C9DF rcall _delay_us
008E .dbline 79
008E ; PORTD=0x0;//关显示
008E 2224 clr R2
0090 22BA out 0x12,R2
0092 .dbline -2
0092 L7:
0092 .dbline 0 ; func end
0092 A990 ld R10,y+
0094 0895 ret
0096 .dbsym l i 1 c
0096 .dbsym r digi 10 c
0096 .dbend
0096 .dbfunc e adc_init _adc_init fV
.even
0096 _adc_init::
0096 .dbline -1
0096 .dbline 92
0096 ; }
0096 ;
0096 ; /************************************
0096 ; 用 途:adc初始化
0096 ; target :atmega8
0096 ; crystal :8M
0096 ; 介 绍:ADC0端口输入
0096 ; 10位精度,最高为5V
0096 ; 入口参数:
0096 ; 出口参数:
0096 ; *************************************/
0096 ; void adc_init()
0096 ; {
0096 .dbline 93
0096 ; ACSR=0x80;//关掉模拟比较器的电源(禁用模拟比较器)
0096 80E8 ldi R24,128
0098 88B9 out 0x8,R24
009A .dbline 94
009A ; ADMUX=(1<<REFS0);
009A 80E4 ldi R24,64
009C 87B9 out 0x7,R24
009E .dbline 96
009E ; //ADMUX=7,6参考电源选择,5左对齐选择,3-0输入端口选择
009E ; ADCSRA=(1<<ADEN);//这里选择的是连续模式
009E 80E8 ldi R24,128
00A0 86B9 out 0x6,R24
00A2 .dbline 99
00A2 ; //ADCSRA=7,adc使能,6,adc开始转换,5,连续转换模式选择
00A2 ; //4,中断标志,3,中断允许,2-0,预分频选择
00A2 ; SFIOR=0x00;//4,adc高速模式选择
00A2 2224 clr R2
00A4 20BE out 0x30,R2
00A6 .dbline -2
00A6 L8:
00A6 .dbline 0 ; func end
00A6 0895 ret
00A8 .dbend
00A8 .dbfunc e adc_get _adc_get fc
00A8 ; temp -> R10,R11
.even
00A8 _adc_get::
00A8 AA92 st -y,R10
00AA BA92 st -y,R11
00AC .dbline -1
00AC .dbline 111
00AC ; }
00AC ;
00AC ; /************************************
00AC ; 用 途:进行一次adc转换
00AC ; target :atmega8
00AC ; crystal :8M
00AC ; 介 绍:10位精度
00AC ; 入口参数:
00AC ; 出口参数:电压值(0-50)表示0-5.0V
00AC ; *************************************/
00AC ; unsigned char adc_get()
00AC ; {
00AC .dbline 114
00AC ; unsigned int temp;
00AC ;
00AC ; ADCSRA|=(1<<ADSC);//开始转换
00AC 369A sbi 0x6,6
00AE L10:
00AE .dbline 115
00AE ; while(!(ADCSR&(1<<ADIF))){;}//等待转换完成
00AE .dbline 115
00AE .dbline 115
00AE L11:
00AE .dbline 115
00AE 349B sbis 0x6,4
00B0 FECF rjmp L10
00B2 X1:
00B2 .dbline 116
00B2 ; ADCSR|=(1<<ADIF);//清标志
00B2 349A sbi 0x6,4
00B4 .dbline 117
00B4 ; temp=ADC;//读数
00B4 A4B0 in R10,0x4
00B6 B5B0 in R11,0x5
00B8 .dbline 118
00B8 ; temp=temp*50/0x03ff;//转换成0-50(表示0-5.0)
00B8 02E3 ldi R16,50
00BA 10E0 ldi R17,0
00BC 9501 movw R18,R10
00BE 00D0 rcall empy16s
00C0 2FEF ldi R18,1023
00C2 33E0 ldi R19,3
00C4 00D0 rcall div16u
00C6 5801 movw R10,R16
00C8 .dbline 119
00C8 ; return (unsigned char)(temp);
00C8 .dbline -2
00C8 L9:
00C8 .dbline 0 ; func end
00C8 B990 ld R11,y+
00CA A990 ld R10,y+
00CC 0895 ret
00CE .dbsym r temp 10 i
00CE .dbend
00CE .dbfunc e main _main fV
.even
00CE _main::
00CE .dbline -1
00CE .dbline 123
00CE ; }
00CE ;
00CE ; void main()
00CE ; {
00CE .dbline 124
00CE ; port_init();
00CE 98DF rcall _port_init
00D0 .dbline 125
00D0 ; init_devices();
00D0 9FDF rcall _init_devices
00D2 .dbline 127
00D2 ;
00D2 ; adc_init();
00D2 E1DF rcall _adc_init
00D4 02C0 rjmp L15
00D6 L14:
00D6 .dbline 129
00D6 ; while(1)
00D6 ; {
00D6 .dbline 130
00D6 ; show_2_digit(adc_get());
00D6 E8DF rcall _adc_get
00D8 ABDF rcall _show_2_digit
00DA .dbline 131
00DA ; }
00DA L15:
00DA .dbline 128
00DA FDCF rjmp L14
00DC X2:
00DC .dbline -2
00DC L13:
00DC .dbline 0 ; func end
00DC 0895 ret
00DE .dbend
00DE ; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -