📄 取得电压函数.lst
字号:
__start:
__text_start:
1B E5CF LDI R28,0x5F
1C E0D4 LDI R29,4
1D BFCD OUT 0x3D,R28
1E BFDE OUT 0x3E,R29
1F 51CE SUBI R28,0x1E
20 40D0 SBCI R29,0
21 EA0A LDI R16,0xAA
22 8308 STD Y+0,R16
23 2400 CLR R0
24 E6E0 LDI R30,0x60
25 E0F0 LDI R31,0
26 E010 LDI R17,0
27 36E0 CPI R30,0x60
28 07F1 CPC R31,R17
29 F011 BEQ 0x002C
2A 9201 ST R0,Z+
2B CFFB RJMP 0x0027
2C 8300 STD Z+0,R16
2D E3E6 LDI R30,0x36
2E E0F0 LDI R31,0
2F E6A0 LDI R26,0x60
30 E0B0 LDI R27,0
31 E010 LDI R17,0
32 E000 LDI R16,0
33 BF0B OUT 0x3B,R16
34 33E6 CPI R30,0x36
35 07F1 CPC R31,R17
36 F021 BEQ 0x003B
37 95C8 LPM
38 9631 ADIW R30,1
39 920D ST R0,X+
3A CFF9 RJMP 0x0034
3B D068 RCALL _main
_exit:
3C CFFF RJMP _exit
FILE: E:\xiaozhiyong2009\设计资料\项目设计\mega8_C语言常用程序\ICCAVR_mega8_取得电压函数\取得电压函数.c
(0001) //ICC-AVR application builder : 2009-3-10 14:59:10
(0002) // Target : M8
(0003) // Crystal: 8.0000Mhz
(0004)
(0005) #include <iom8v.h>
(0006) #include <macros.h>
(0007)
(0008) void port_init(void)
(0009) {
(0010) PORTB = 0x00;
_port_init:
3D 2422 CLR R2
3E BA28 OUT 0x18,R2
(0011) DDRB = 0x00;
3F BA27 OUT 0x17,R2
(0012) PORTC = 0x00; //m103 output only
40 BA25 OUT 0x15,R2
(0013) DDRC = 0x00;
41 BA24 OUT 0x14,R2
(0014) PORTD = 0x00;
42 BA22 OUT 0x12,R2
(0015) DDRD = 0x00;
43 BA21 OUT 0x11,R2
44 9508 RET
(0016) }
(0017)
(0018) //call this routine to initialize all peripherals
(0019) void init_devices(void)
(0020) {
(0021) //stop errant interrupts until set up
(0022) CLI(); //disable all interrupts
_init_devices:
45 94F8 BCLR 7
(0023) port_init();
46 DFF6 RCALL _port_init
(0024)
(0025) MCUCR = 0x00;
47 2422 CLR R2
48 BE25 OUT 0x35,R2
(0026) GICR = 0x00;
49 BE2B OUT 0x3B,R2
(0027) TIMSK = 0x00; //timer interrupt sources
4A BE29 OUT 0x39,R2
(0028) SEI(); //re-enable interrupts
4B 9478 BSET 7
4C 9508 RET
(0029) //all peripherals are now initialized
(0030) }
(0031)
(0032) /************************************
(0033) 用 途:微秒级延时程序
(0034) Taget :mega8
(0035) crystal :8M
(0036) 介 绍:在8M的晶振上进行us级的延时
(0037) 入口参数:
(0038) *************************************/
(0039) void delay_us(int time)
(0040) {
(0041) do
(0042) {
(0043) time--;
_delay_us:
time --> R16
4D 5001 SUBI R16,1
4E 4010 SBCI R17,0
(0044) }
(0045) while (time > 1);
4F E081 LDI R24,1
50 E090 LDI R25,0
51 1780 CP R24,R16
52 0791 CPC R25,R17
53 F3CC BLT 0x004D
54 9508 RET
_show_2_digit:
i --> Y,+1
digi --> R10
55 92AA ST R10,-Y
56 2EA0 MOV R10,R16
(0046) }
(0047)
(0048)
(0049) /************************************
(0050) 用 途:两位数码管显示一个数
(0051) Taget :mega8
(0052) crystal :8M
(0053) 介 绍:共阳数码管
(0054) 1-PC1(片选)
(0055) 2-PC0
(0056) -----
(0057) a-PB0(数据)
(0058) b-PB1
(0059) ...
(0060) h-PB6
(0061) DP-PB7
(0062) 入口参数:要显示的数,十进制表示
(0063) *************************************/
(0064) const unsigned char num[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
(0065) 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
(0066) void show_2_digit(unsigned char digi)
(0067) {
(0068) unsigned char i;
(0069) DDRD=0xff;
57 EF8F LDI R24,0xFF
58 BB81 OUT 0x11,R24
(0070) DDRB=0xff;
59 BB87 OUT 0x17,R24
(0071) PORTD=0;//关片选
5A 2422 CLR R2
5B BA22 OUT 0x12,R2
(0072) PORTB=~num[(unsigned char )(digi/10)];//显示十位
5C E02A LDI R18,0xA
5D E030 LDI R19,0
5E 2D0A MOV R16,R10
5F 2711 CLR R17
60 D04F RCALL div16s
61 2FE0 MOV R30,R16
62 27FF CLR R31
63 E286 LDI R24,0x26
64 E090 LDI R25,0
65 0FE8 ADD R30,R24
66 1FF9 ADC R31,R25
67 9024 LPM R2,0(Z)
68 9420 COM R2
69 BA28 OUT 0x18,R2
(0073) PORTD=(0x1<<1);//开十位的显示
6A E082 LDI R24,2
6B BB82 OUT 0x12,R24
(0074) delay_us(200);
6C EC08 LDI R16,0xC8
6D E010 LDI R17,0
6E DFDE RCALL _delay_us
(0075) PORTD=0;//关显示
6F 2422 CLR R2
70 BA22 OUT 0x12,R2
(0076) PORTB=~num[(unsigned char )(digi%10)];//显示个位
71 E02A LDI R18,0xA
72 E030 LDI R19,0
73 2D0A MOV R16,R10
74 2711 CLR R17
75 D036 RCALL mod16s
76 2FE0 MOV R30,R16
77 27FF CLR R31
78 E286 LDI R24,0x26
79 E090 LDI R25,0
7A 0FE8 ADD R30,R24
7B 1FF9 ADC R31,R25
7C 9024 LPM R2,0(Z)
7D 9420 COM R2
7E BA28 OUT 0x18,R2
(0077) PORTD=(0x1<<0);//开个位的显示
7F E081 LDI R24,1
80 BB82 OUT 0x12,R24
(0078) delay_us(200);
81 EC08 LDI R16,0xC8
82 E010 LDI R17,0
83 DFC9 RCALL _delay_us
(0079) PORTD=0x0;//关显示
84 2422 CLR R2
85 BA22 OUT 0x12,R2
86 90A9 LD R10,Y+
87 9508 RET
(0080) }
(0081)
(0082) /************************************
(0083) 用 途:adc初始化
(0084) target :atmega8
(0085) crystal :8M
(0086) 介 绍:ADC0端口输入
(0087) 10位精度,最高为5V
(0088) 入口参数:
(0089) 出口参数:
(0090) *************************************/
(0091) void adc_init()
(0092) {
(0093) ACSR=0x80;//关掉模拟比较器的电源(禁用模拟比较器)
_adc_init:
88 E880 LDI R24,0x80
89 B988 OUT 0x08,R24
(0094) ADMUX=(1<<REFS0);
8A E480 LDI R24,0x40
8B B987 OUT 0x07,R24
(0095) //ADMUX=7,6参考电源选择,5左对齐选择,3-0输入端口选择
(0096) ADCSRA=(1<<ADEN);//这里选择的是连续模式
8C E880 LDI R24,0x80
8D B986 OUT 0x06,R24
(0097) //ADCSRA=7,adc使能,6,adc开始转换,5,连续转换模式选择
(0098) //4,中断标志,3,中断允许,2-0,预分频选择
(0099) SFIOR=0x00;//4,adc高速模式选择
8E 2422 CLR R2
8F BE20 OUT 0x30,R2
90 9508 RET
_adc_get:
temp --> R10
91 92AA ST R10,-Y
92 92BA ST R11,-Y
(0100) }
(0101)
(0102) /************************************
(0103) 用 途:进行一次adc转换
(0104) target :atmega8
(0105) crystal :8M
(0106) 介 绍:10位精度
(0107) 入口参数:
(0108) 出口参数:电压值(0-50)表示0-5.0V
(0109) *************************************/
(0110) unsigned char adc_get()
(0111) {
(0112) unsigned int temp;
(0113)
(0114) ADCSRA|=(1<<ADSC);//开始转换
93 9A36 SBI 0x06,6
(0115) while(!(ADCSR&(1<<ADIF))){;}//等待转换完成
94 9B34 SBIS 0x06,4
95 CFFE RJMP 0x0094
(0116) ADCSR|=(1<<ADIF);//清标志
96 9A34 SBI 0x06,4
(0117) temp=ADC;//读数
97 B0A4 IN R10,0x04
98 B0B5 IN R11,0x05
(0118) temp=temp*50/0x03ff;//转换成0-50(表示0-5.0)
99 E302 LDI R16,0x32
9A E010 LDI R17,0
9B 0195 MOVW R18,R10
9C D048 RCALL empy16s
9D EF2F LDI R18,0xFF
9E E033 LDI R19,3
9F D02B RCALL div16u
A0 0158 MOVW R10,R16
(0119) return (unsigned char)(temp);
A1 90B9 LD R11,Y+
A2 90A9 LD R10,Y+
A3 9508 RET
(0120) }
(0121)
(0122) void main()
(0123) {
(0124) port_init();
_main:
A4 DF98 RCALL _port_init
(0125) init_devices();
A5 DF9F RCALL _init_devices
(0126)
(0127) adc_init();
A6 DFE1 RCALL _adc_init
A7 C002 RJMP 0x00AA
(0128) while(1)
(0129) {
(0130) show_2_digit(adc_get());
FILE: <library>
A8 DFE8 RCALL _adc_get
A9 DFAB RCALL _show_2_digit
AA CFFD RJMP 0x00A8
AB 9508 RET
mod16s:
AC 9468 BSET 6
AD 92DA ST R13,-Y
AE 2ED1 MOV R13,R17
AF C004 RJMP 0x00B4
div16s:
B0 94E8 BCLR 6
B1 92DA ST R13,-Y
B2 2ED1 MOV R13,R17
B3 26D3 EOR R13,R19
B4 FF17 SBRS R17,7
B5 C004 RJMP 0x00BA
B6 9510 COM R17
B7 9500 COM R16
B8 5F0F SUBI R16,0xFF
B9 4F1F SBCI R17,0xFF
BA FF37 SBRS R19,7
BB C004 RJMP 0x00C0
BC 9530 COM R19
BD 9520 COM R18
BE 5F2F SUBI R18,0xFF
BF 4F3F SBCI R19,0xFF
C0 D00B RCALL xdiv16u
C1 FED7 SBRS R13,7
C2 C004 RJMP 0x00C7
C3 9510 COM R17
C4 9500 COM R16
C5 5F0F SUBI R16,0xFF
C6 4F1F SBCI R17,0xFF
C7 90D9 LD R13,Y+
C8 9508 RET
mod16u:
C9 9468 BSET 6
CA C001 RJMP xdiv16u
div16u:
CB 94E8 BCLR 6
xdiv16u:
CC 92EA ST R14,-Y
CD 92FA ST R15,-Y
CE 938A ST R24,-Y
CF 24EE CLR R14
D0 24FF CLR R15
D1 E180 LDI R24,0x10
D2 0F00 LSL R16
D3 1F11 ROL R17
D4 1CEE ROL R14
D5 1CFF ROL R15
D6 16E2 CP R14,R18
D7 06F3 CPC R15,R19
D8 F018 BCS 0x00DC
D9 1AE2 SUB R14,R18
DA 0AF3 SBC R15,R19
DB 9503 INC R16
DC 958A DEC R24
DD F7A1 BNE 0x00D2
DE F416 BRTC 0x00E1
DF 2D0E MOV R16,R14
E0 2D1F MOV R17,R15
E1 9189 LD R24,Y+
E2 90F9 LD R15,Y+
E3 90E9 LD R14,Y+
E4 9508 RET
empy16s:
E5 920A ST R0,-Y
E6 921A ST R1,-Y
E7 938A ST R24,-Y
E8 939A ST R25,-Y
E9 9F02 MUL R16,R18
EA 01C0 MOVW R24,R0
EB 9F12 MUL R17,R18
EC 0D90 ADD R25,R0
ED 9F03 MUL R16,R19
EE 0D90 ADD R25,R0
EF 018C MOVW R16,R24
F0 9199 LD R25,Y+
F1 9189 LD R24,Y+
F2 9019 LD R1,Y+
F3 9009 LD R0,Y+
F4 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -