📄 main.lis
字号:
.module main.c
.area data(ram, con, rel)
0000 _extint_count::
0000 .blkb 2
.area idata
0000 0000 .word 0
.area data(ram, con, rel)
0002 .dbfile F:\radio\第十一篇\test-adc\main.c
0002 .dbsym e extint_count _extint_count i
0002 _act_flag::
0002 .blkb 1
.area idata
0002 00 .byte 0
.area data(ram, con, rel)
0003 .dbfile F:\radio\第十一篇\test-adc\main.c
0003 .dbsym e act_flag _act_flag c
.area text(rom, con, rel)
0000 .dbfile F:\radio\第十一篇\test-adc\main.c
0000 .dbfunc e port_init _port_init fV
.even
0000 _port_init::
0000 .dbline -1
0000 .dbline 21
0000 ; #include <iom16v.h>
0000 ; #include <macros.h>
0000 ; #include "lcd.h"
0000 ; #include "usart.h"
0000 ; #include "delay.h"
0000 ; #define vref 256
0000 ; volatile unsigned int extint_count=0;
0000 ; volatile unsigned char act_flag=0;
0000 ; volatile unsigned int adc_result;
0000 ; unsigned char adc_show[6];
0000 ; /** /
0000 ; volatile:数据类型声明,表明该变量在程序执行中可被隐含改变
0000 ; 编译器有时会将SRAM中的数据拷贝到通用寄存器中以提高程序的执行效率
0000 ; (在通用寄存器中对数据的操作速度比操作SRAM中的数据要快),这样会带来
0000 ; 一个问题,如果该SRAM中的数据已经被隐含改变(比如中断),那么编译器仍然
0000 ; 读取寄存器中之前的SRAM拷贝值显然与其实际值不同,从而出现错误。
0000 ; 本例中extint_count的值在外部中断服务程序中被改变,通过volatile
0000 ; 声明通知编译器。
0000 ; /**/
0000 ; void port_init(void)
0000 ; {
0000 .dbline 22
0000 ; PORTA = 0xFE;
0000 8EEF ldi R24,254
0002 8BBB out 0x1b,R24
0004 .dbline 23
0004 ; DDRA = 0xFE;
0004 8ABB out 0x1a,R24
0006 .dbline 24
0006 ; PORTB = 0xFF;
0006 8FEF ldi R24,255
0008 88BB out 0x18,R24
000A .dbline 25
000A ; DDRB = 0xFF;
000A 87BB out 0x17,R24
000C .dbline 26
000C ; PORTC = 0xFF;
000C 85BB out 0x15,R24
000E .dbline 27
000E ; DDRC = 0xFF;
000E 84BB out 0x14,R24
0010 .dbline 28
0010 ; DDRD = 0xFB; //PD2(INT0)引脚设置为输入
0010 8BEF ldi R24,251
0012 81BB out 0x11,R24
0014 .dbline 29
0014 ; PORTD = 0xFB; //关闭内部上拉
0014 82BB out 0x12,R24
0016 .dbline -2
0016 L1:
0016 .dbline 0 ; func end
0016 0895 ret
0018 .dbend
.area vector(rom, abs)
.org 56
0038 0C940C00 jmp _adc_isr
.area text(rom, con, rel)
0018 .dbfile F:\radio\第十一篇\test-adc\main.c
0018 .dbfunc e adc_isr _adc_isr fV
0018 ; temp -> R16,R17
.even
0018 _adc_isr::
0018 2A92 st -y,R2
001A 3A92 st -y,R3
001C 0A93 st -y,R16
001E 1A93 st -y,R17
0020 EA93 st -y,R30
0022 2FB6 in R2,0x3f
0024 2A92 st -y,R2
0026 .dbline -1
0026 .dbline 34
0026 ; }
0026 ; /* AD转换程序 */
0026 ; #pragma interrupt_handler adc_isr:15
0026 ; void adc_isr(void)
0026 ; {
0026 .dbline 35
0026 ; unsigned int temp=0;
0026 0027 clr R16
0028 1127 clr R17
002A 02C0 xjmp L4
002C L3:
002C .dbline 37
002C 0F5F subi R16,255 ; offset = 1
002E 1F4F sbci R17,255
0030 L4:
0030 .dbline 36
0030 ; while(temp<6)
0030 0630 cpi R16,6
0032 E0E0 ldi R30,0
0034 1E07 cpc R17,R30
0036 D0F3 brlo L3
0038 .dbline 38
0038 ; temp++; //短延时
0038 ; adc_result = ADC; //读取AD转换值
0038 24B0 in R2,0x4
003A 35B0 in R3,0x5
003C 30920700 sts _adc_result+1,R3
0040 20920600 sts _adc_result,R2
0044 .dbline 40
0044 ;
0044 ; ADCSRA |= (1<<ADSC); //再次启动转换
0044 369A sbi 0x6,6
0046 .dbline -2
0046 L2:
0046 2990 ld R2,y+
0048 2FBE out 0x3f,R2
004A E991 ld R30,y+
004C 1991 ld R17,y+
004E 0991 ld R16,y+
0050 3990 ld R3,y+
0052 2990 ld R2,y+
0054 .dbline 0 ; func end
0054 1895 reti
0056 .dbsym r temp 16 i
0056 .dbend
0056 .dbfunc e data_con _data_con fV
0056 ; i -> R10
0056 ; temp -> R12,R13
.even
0056 _data_con::
0056 0E940000 xcall push_gset4
005A .dbline -1
005A .dbline 43
005A ; }
005A ; void data_con(void)
005A ; {
005A .dbline 46
005A ; unsigned int temp;
005A ; unsigned char i;
005A ; temp=(unsigned int)(((unsigned long)((unsigned long)adc_result*vref))/1024);
005A 20900600 lds R2,_adc_result
005E 30900700 lds R3,_adc_result+1
0062 4424 clr R4
0064 5524 clr R5
0066 40E0 ldi R20,0
0068 51E0 ldi R21,1
006A 60E0 ldi R22,0
006C 70E0 ldi R23,0
006E 5A92 st -y,R5
0070 4A92 st -y,R4
0072 3A92 st -y,R3
0074 2A92 st -y,R2
0076 8A01 movw R16,R20
0078 9B01 movw R18,R22
007A 0E940000 xcall empy32u
007E 8AE0 ldi R24,10
0080 90E0 ldi R25,0
0082 8A93 st -y,R24
0084 0E940000 xcall lsr32
0088 6801 movw R12,R16
008A .dbline 47
008A ; for(i=0;i<3;i++)
008A AA24 clr R10
008C 19C0 xjmp L10
008E L7:
008E .dbline 48
008E .dbline 49
008E 2A2C mov R2,R10
0090 3324 clr R3
0092 E3E0 ldi R30,3
0094 F0E0 ldi R31,0
0096 E219 sub R30,R2
0098 F309 sbc R31,R3
009A 80E0 ldi R24,<_adc_show
009C 90E0 ldi R25,>_adc_show
009E E80F add R30,R24
00A0 F91F adc R31,R25
00A2 2AE0 ldi R18,10
00A4 30E0 ldi R19,0
00A6 8601 movw R16,R12
00A8 0E940000 xcall mod16u
00AC C801 movw R24,R16
00AE C096 adiw R24,48
00B0 8083 std z+0,R24
00B2 .dbline 50
00B2 2AE0 ldi R18,10
00B4 30E0 ldi R19,0
00B6 8601 movw R16,R12
00B8 0E940000 xcall div16u
00BC 6801 movw R12,R16
00BE .dbline 51
00BE L8:
00BE .dbline 47
00BE A394 inc R10
00C0 L10:
00C0 .dbline 47
00C0 8A2D mov R24,R10
00C2 8330 cpi R24,3
00C4 20F3 brlo L7
00C6 .dbline 52
00C6 ; {
00C6 ; adc_show[3-i]=temp%10+0x30; //转换电压值用来在LCD上显示
00C6 ; temp=temp/10;
00C6 ; }
00C6 ; adc_show[0]=adc_show[1];
00C6 20900100 lds R2,_adc_show+1
00CA 20920000 sts _adc_show,R2
00CE .dbline 53
00CE ; adc_show[1]='.';
00CE 8EE2 ldi R24,46
00D0 80930100 sts _adc_show+1,R24
00D4 .dbline 54
00D4 ; adc_show[4]='V';
00D4 86E5 ldi R24,86
00D6 80930400 sts _adc_show+4,R24
00DA .dbline 55
00DA ; adc_show[5]=0; //数组结束标记
00DA 2224 clr R2
00DC 20920500 sts _adc_show+5,R2
00E0 .dbline -2
00E0 L6:
00E0 0E940000 xcall pop_gset4
00E4 .dbline 0 ; func end
00E4 0895 ret
00E6 .dbsym r i 10 c
00E6 .dbsym r temp 12 i
00E6 .dbend
.area vector(rom, abs)
.org 4
0004 0C947300 jmp _int0_isr
.area text(rom, con, rel)
00E6 .dbfile F:\radio\第十一篇\test-adc\main.c
00E6 .dbfunc e int0_isr _int0_isr fV
.even
00E6 _int0_isr::
00E6 8A93 st -y,R24
00E8 9A93 st -y,R25
00EA 8FB7 in R24,0x3f
00EC 8A93 st -y,R24
00EE .dbline -1
00EE .dbline 60
00EE .dbline 61
00EE 80910000 lds R24,_extint_count
00F2 90910100 lds R25,_extint_count+1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -