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

📄 取得电压函数.lis

📁 ICC mega8例子
💻 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 + -