📄 111.lst
字号:
__start:
__text_start:
13 E5CF LDI R28,0x5F
14 E0D4 LDI R29,4
15 BFCD OUT 0x3D,R28
16 BFDE OUT 0x3E,R29
17 51CE SUBI R28,0x1E
18 40D0 SBCI R29,0
19 EA0A LDI R16,0xAA
1A 8308 STD Y+0,R16
1B 2400 CLR R0
1C E6E0 LDI R30,0x60
1D E0F0 LDI R31,0
1E E010 LDI R17,0
1F 36E0 CPI R30,0x60
20 07F1 CPC R31,R17
21 F011 BEQ 0x0024
22 9201 ST R0,Z+
23 CFFB RJMP 0x001F
24 8300 STD Z+0,R16
25 E2E6 LDI R30,0x26
26 E0F0 LDI R31,0
27 E6A0 LDI R26,0x60
28 E0B0 LDI R27,0
29 E010 LDI R17,0
2A E000 LDI R16,0
2B BF0B OUT 0x3B,R16
2C 32E6 CPI R30,0x26
2D 07F1 CPC R31,R17
2E F021 BEQ 0x0033
2F 95C8 LPM
30 9631 ADIW R30,1
31 920D ST R0,X+
32 CFF9 RJMP 0x002C
33 D027 RCALL _main
_exit:
34 CFFF RJMP _exit
_delay1s:
i --> R16
j --> R18
k --> R20
35 934A ST R20,-Y
FILE: D:\教程及心得\Proteus\PROTEU~2\5.avr\19.温度测量ds18b20\3.开搞ds18b20\111.c
(0001) //ICC-AVR application builder : 2008/11/19 20:51:44
(0002) // Target : M8
(0003) // Crystal: 8.0000Mhz
(0004)
(0005) #include <iom8v.h>
(0006) #include <macros.h>
(0007) #include "mydelay.h"
(0008) #include "ds18b20.h"
(0009)
(0010) void delay1s(void)
(0011) {
(0012) unsigned char i,j,k;
(0013) for (i=100;i>0;i--)
36 E604 LDI R16,0x64
37 C00D RJMP 0x0045
(0014) for (j=100;j>0;j--)
38 E624 LDI R18,0x64
39 C007 RJMP 0x0041
(0015) for (k=20;k>0;k--)
3A E144 LDI R20,0x14
3B C001 RJMP 0x003D
3C 954A DEC R20
3D E080 LDI R24,0
3E 1784 CP R24,R20
3F F3E0 BCS 0x003C
40 952A DEC R18
41 E080 LDI R24,0
42 1782 CP R24,R18
43 F3B0 BCS 0x003A
44 950A DEC R16
45 E080 LDI R24,0
46 1780 CP R24,R16
47 F380 BCS 0x0038
48 9149 LD R20,Y+
49 9508 RET
(0016) ;
(0017) }
(0018) void port_init(void)
(0019) {
(0020) PORTB = 0x00;
_port_init:
4A 2422 CLR R2
4B BA28 OUT 0x18,R2
(0021) DDRB = 0xff;
4C EF8F LDI R24,0xFF
4D BB87 OUT 0x17,R24
(0022) PORTC = 0x00; //m103 output only
4E BA25 OUT 0x15,R2
(0023) DDRC = 0x00;
4F BA24 OUT 0x14,R2
(0024) PORTD = 0x00;
50 BA22 OUT 0x12,R2
(0025) DDRD = 0xff;
51 BB81 OUT 0x11,R24
52 9508 RET
(0026) }
(0027)
(0028) //call this routine to initialize all peripherals
(0029) void init_devices(void)
(0030) {
(0031) //stop errant interrupts until set up
(0032) CLI(); //disable all interrupts
_init_devices:
53 94F8 BCLR 7
(0033) port_init();
54 DFF5 RCALL _port_init
(0034)
(0035) MCUCR = 0x00;
55 2422 CLR R2
56 BE25 OUT 0x35,R2
(0036) GICR = 0x00;
57 BE2B OUT 0x3B,R2
(0037) TIMSK = 0x00; //timer interrupt sources
58 BE29 OUT 0x39,R2
(0038) SEI(); //re-enable interrupts
59 9478 BSET 7
5A 9508 RET
(0039) //all peripherals are now initialized
(0040) }
(0041)
(0042) void main(void)
(0043) {
(0044) unsigned int data;
(0045) unsigned char dataL,dataH;
(0046) init_devices();
_main:
dataH --> R10
dataL --> R12
data --> R10
5B DFF7 RCALL _init_devices
5C C007 RJMP 0x0064
(0047) while(1)
(0048) {
(0049) convert();
5D D079 RCALL _convert
(0050) data=rdtemp();
5E D07E RCALL _rdtemp
5F 0158 MOVW R10,R16
(0051) dataL=data;
60 2CCA MOV R12,R10
(0052) dataH=data>>8;
61 2CAB MOV R10,R11
62 24BB CLR R11
(0053) delay1s();
63 DFD1 RCALL _delay1s
64 CFF8 RJMP 0x005D
65 9508 RET
FILE: D:\教程及心得\Proteus\PROTEU~2\5.avr\19.温度测量ds18b20\3.开搞ds18b20\mydelay.c
(0001) #include "mydelay.h"
(0002) void delay0ms5us(void)
(0003) {
(0004) /*精确延时0ms 5us ,晶振8MHz*/
(0005) /*us级精确延时 766us/晶振以内 延时=1+n*3 */
(0006) // CLI;//屏蔽中断吗?
(0007) asm("LDI R18,10");//1t ,寄存器R15~R30
_delay0ms5us:
66 E02A LDI R18,0xA
(0008) asm("CLZ");//1t
67 9498 BCLR 1
(0009) asm("LOOP1:DEC R18");//1t
68 952A DEC R18
(0010) asm("BRNE LOOP1");//1t或2t//标志位Z是0就转移
69 F7F1 BNE 0x0068
(0011) asm("NOP");//1t
6A 0000 NOP
(0012) asm("NOP");//1t
6B 0000 NOP
6C 9508 RET
(0013) // SEI;
(0014) /*us级精确延时 24543us以内,用nop补足了余数*/
(0015) //===精确延时 4.125us,晶振8MHz ===//
(0016) //===调用函数及返回花费0.875us==//
(0017) }
(0018) void delay0ms15us(void)
(0019) {
(0020) /*精确延时0ms 15us ,晶振8MHz*/
(0021) /*us级精确延时 766us/晶振以内 延时=1+n*3 */
(0022) // CLI;//屏蔽中断吗?
(0023) asm("LDI R18,37");//1t ,寄存器R15~R30
_delay0ms15us:
6D E225 LDI R18,0x25
(0024) asm("CLZ");//1t
6E 9498 BCLR 1
(0025) asm("LOOP111:DEC R18");//1t
6F 952A DEC R18
(0026) asm("BRNE LOOP111");//1t或2t//标志位Z是0就转移
70 F7F1 BNE 0x006F
(0027) asm("NOP");//1t
71 0000 NOP
72 9508 RET
(0028) // SEI;
(0029) /*us级精确延时 24543us以内,用nop补足了余数*/
(0030) //===精确延时 14.125us,晶振8MHz ===//
(0031) //===调用函数及返回花费0.875us==//
(0032) }
(0033) void delay0ms60us(void)
(0034) {
(0035) /*精确延时0ms 60us ,晶振8MHz*/
(0036) /*us级精确延时 766us/晶振以内 延时=1+n*3 */
(0037) // CLI;//屏蔽中断吗?
(0038) asm("LDI R18,157");//1t ,寄存器R15~R30
_delay0ms60us:
73 E92D LDI R18,0x9D
(0039) asm("CLZ");//1t
74 9498 BCLR 1
(0040) asm("LOOP11:DEC R18");//1t
75 952A DEC R18
(0041) asm("BRNE LOOP11");//1t或2t//标志位Z是0就转移
76 F7F1 BNE 0x0075
(0042) asm("NOP");//1t
77 0000 NOP
78 9508 RET
(0043) // SEI;
(0044) /*us级精确延时 24543us以内,用nop补足了余数*/
(0045) //===精确延时 59.125us,晶振8MHz ===//
(0046) //===调用函数及返回花费0.875us==//
(0047) }
(0048) void delay0ms500us(void)
(0049) {
(0050) /*精确延时0ms 500us ,晶振8MHz*/
(0051) /*us级 196348us/晶振即196ms/晶振以内 延时=n*(m*3+5)*/
(0052) // CLI;//屏蔽中断吗?
(0053) asm("LDI R18,6");//外圈循环n
_delay0ms500us:
79 E026 LDI R18,6
(0054) asm("LOOP32:LDI R19,220");//内圈循环m
7A ED3C LDI R19,0xDC
(0055) asm("CLZ");//1t
7B 9498 BCLR 1
(0056) asm("LOOP22:DEC R19");//1t
7C 953A DEC R19
(0057) asm("BRNE LOOP22");
7D F7F1 BNE 0x007C
(0058) asm("CLZ");//1t
7E 9498 BCLR 1
(0059) asm("DEC R18");//1t
7F 952A DEC R18
(0060) asm("BRNE LOOP32");
80 F7C9 BNE 0x007A
(0061) asm("NOP");//1t
81 0000 NOP
(0062) asm("NOP");//1t
82 0000 NOP
(0063) asm("NOP");//1t
83 0000 NOP
84 9508 RET
FILE: D:\教程及心得\Proteus\PROTEU~2\5.avr\19.温度测量ds18b20\3.开搞ds18b20\ds18b20.c
(0001) /*
(0002) 我自己写的ds18b20的驱动,暂时固定PORTC0口当总线口好了
(0003) */
(0004) #include <iom8v.h>
(0005) #include <macros.h>
(0006) #include "mydelay.h"
(0007) #include "ds18b20.h"
(0008) //一。单点测量只要有presense应答就可以了,多点测量以后再搞
(0009) //1.reset
(0010) void reset(void)
(0011) {
(0012) DDRC=DDRC|0x01;//输出
_reset:
85 9AA0 SBI 0x14,0
(0013) PORTC=PORTC&0xfe;//置0
86 B385 IN R24,0x15
87 7F8E ANDI R24,0xFE
88 BB85 OUT 0x15,R24
(0014) delay0ms500us();
89 CFEF RJMP _delay0ms500us
(0015) }
(0016) //2.读取presense应答信号
(0017) void ReadPresense(void)
(0018) {
(0019) DDRC=DDRC&0xfe;//输入
_ReadPresense:
8A B384 IN R24,0x14
8B 7F8E ANDI R24,0xFE
8C BB84 OUT 0x14,R24
(0020) delay0ms60us();
8D DFE5 RCALL _delay0ms60us
(0021) while((PINC&0x01)==0x00) ;//检测到了应答信号
8E 9B98 SBIS 0x13,0
8F CFFE RJMP 0x008E
90 9508 RET
_rdbit:
data --> R20
91 934A ST R20,-Y
(0022) //delay0ms60us();
(0023) }
(0024) unsigned char rdbit(void)
(0025) {
(0026) unsigned char data;
(0027) DDRC=DDRC|0x01;//输出
92 9AA0 SBI 0x14,0
(0028) PORTC=PORTC&0xfe;//置0
93 B385 IN R24,0x15
94 7F8E ANDI R24,0xFE
95 BB85 OUT 0x15,R24
(0029) delay0ms5us();//等待1us即可,为了照顾晶振,这里给5us
96 DFCF RCALL _delay0ms5us
(0030) //PORTC=PORTC|0x01;//置1
(0031) DDRC=DDRC&0xfe;//输入
97 B384 IN R24,0x14
98 7F8E ANDI R24,0xFE
99 BB84 OUT 0x14,R24
(0032) data=PINC&0x01;
9A B343 IN R20,0x13
9B 7041 ANDI R20,1
(0033) delay0ms15us();
9C DFD0 RCALL _delay0ms15us
(0034) delay0ms60us();//读时隙不少于60us
9D DFD5 RCALL _delay0ms60us
(0035) return (data);
9E 2F04 MOV R16,R20
9F 9149 LD R20,Y+
A0 9508 RET
_rdbyte:
j --> R12
i --> R20
data --> R10
A1 D059 RCALL push_xgset303C
(0036) }
(0037) unsigned char rdbyte(void)
(0038) {
(0039) unsigned char data;
(0040) unsigned char i,j;
(0041) for(i=8;i>0;i--)
A2 E048 LDI R20,0x8
A3 C00F RJMP 0x00B3
(0042) {
(0043) j=rdbit();
A4 DFEC RCALL _rdbit
A5 2EC0 MOV R12,R16
(0044) data=(data>>1)|(j<<7);
A6 2C2C MOV R2,R12
A7 0C22 LSL R2
A8 0C22 LSL R2
A9 0C22 LSL R2
AA 0C22 LSL R2
AB 0C22 LSL R2
AC 0C22 LSL R2
AD 0C22 LSL R2
AE 2C3A MOV R3,R10
AF 9436 LSR R3
B0 2832 OR R3,R2
B1 2CA3 MOV R10,R3
B2 954A DEC R20
B3 E080 LDI R24,0
B4 1784 CP R24,R20
B5 F370 BCS 0x00A4
(0045) }
(0046) return (data);
B6 2D0A MOV R16,R10
B7 C04A RJMP pop_xgset303C
_wtbit:
data --> R20
B8 934A ST R20,-Y
B9 2F40 MOV R20,R16
(0047) }
(0048) void wtbit(unsigned char data)
(0049) {
(0050) DDRC=DDRC|0x01;//输出
BA 9AA0 SBI 0x14,0
(0051) PORTC=PORTC&0xfe;//置0
BB B385 IN R24,0x15
BC 7F8E ANDI R24,0xFE
BD BB85 OUT 0x15,R24
(0052) delay0ms5us();//等待1us即可,为了照顾晶振,这里给5us
BE DFA7 RCALL _delay0ms5us
(0053) if (data==0x01) PORTC=PORTC|0x01;//置1
BF 3041 CPI R20,1
C0 F409 BNE 0x00C2
C1 9AA8 SBI 0x15,0
(0054) delay0ms60us();
C2 DFB0 RCALL _delay0ms60us
(0055) PORTC=PORTC|0x01;//拉高回来
C3 9AA8 SBI 0x15,0
(0056) delay0ms60us();//时隙不少于60us
C4 DFAE RCALL _delay0ms60us
C5 9149 LD R20,Y+
C6 9508 RET
_wtbyte:
j --> R22
i --> R20
data --> R10
C7 D025 RCALL push_xgsetF00C
C8 2EA0 MOV R10,R16
(0057) }
(0058) void wtbyte(unsigned char data)
(0059) {
(0060) unsigned char i,j;
(0061) for (i=8;i>0;i--)
C9 E048 LDI R20,0x8
CA C008 RJMP 0x00D3
(0062) {
(0063) j=(data>>i)&0x01;
CB 2D0A MOV R16,R10
CC 2F14 MOV R17,R20
CD D03B RCALL lsr8
CE 2F60 MOV R22,R16
CF 7061 ANDI R22,1
(0064) wtbit(j);
D0 2F06 MOV R16,R22
D1 DFE6 RCALL _wtbit
D2 954A DEC R20
D3 E080 LDI R24,0
D4 1784 CP R24,R20
D5 F3A8 BCS 0x00CB
D6 C01D RJMP pop_xgsetF00C
(0065) }
(0066) }
(0067) //启动温度转换
(0068) void convert(void)
(0069) {
(0070) reset();
_convert:
D7 DFAD RCALL _reset
(0071) ReadPresense();
D8 DFB1 RCALL _ReadPresense
(0072) wtbyte(0xcc);
D9 EC0C LDI R16,0xCC
DA DFEC RCALL _wtbyte
(0073) wtbyte(0x44);
DB E404 LDI R16,0x44
DC CFEA RJMP _wtbyte
_rdtemp:
tmp --> Y,+1
temp --> R10
DD 92AA ST R10,-Y
DE 92BA ST R11,-Y
(0074) }
(0075) //读温度值
(0076) unsigned int rdtemp(void)
(0077) {
(0078) unsigned int temp,tmp;
(0079) reset();
DF DFA5 RCALL _reset
(0080) ReadPresense();
E0 DFA9 RCALL _ReadPresense
(0081) wtbyte(0xcc);
E1 EC0C LDI R16,0xCC
E2 DFE4 RCALL _wtbyte
(0082) wtbyte(0xbe);
E3 EB0E LDI R16,0xBE
E4 DFE2 RCALL _wtbyte
(0083) //temp=rdbyte();
(0084) //tmp=temp;
(0085) //temp=rdbyte();
(0086) //temp=(temp<<8)|tmp;
(0087) PORTB=rdbyte();
E5 DFBB RCALL _rdbyte
E6 BB08 OUT 0x18,R16
(0088) PORTD=rdbyte();
E7 DFB9 RCALL _rdbyte
E8 BB02 OUT 0x12,R16
(0089) return temp;
FILE: <library>
E9 0185 MOVW R16,R10
EA 90B9 LD R11,Y+
EB 90A9 LD R10,Y+
EC 9508 RET
push_xgsetF00C:
ED 937A ST R23,-Y
EE 936A ST R22,-Y
EF 935A ST R21,-Y
F0 934A ST R20,-Y
F1 92BA ST R11,-Y
F2 92AA ST R10,-Y
F3 9508 RET
pop_xgsetF00C:
F4 90A9 LD R10,Y+
F5 90B9 LD R11,Y+
F6 9149 LD R20,Y+
F7 9159 LD R21,Y+
F8 9169 LD R22,Y+
F9 9179 LD R23,Y+
FA 9508 RET
push_xgset303C:
FB 935A ST R21,-Y
FC 934A ST R20,-Y
FD 92DA ST R13,-Y
FE 92CA ST R12,-Y
FF 92BA ST R11,-Y
100 92AA ST R10,-Y
101 9508 RET
pop_xgset303C:
102 90A9 LD R10,Y+
103 90B9 LD R11,Y+
104 90C9 LD R12,Y+
105 90D9 LD R13,Y+
106 9149 LD R20,Y+
107 9159 LD R21,Y+
108 9508 RET
lsr8:
109 2311 TST R17
10A F019 BEQ 0x010E
10B 9506 LSR R16
10C 951A DEC R17
10D CFFB RJMP lsr8
10E 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -