📄 main.lis
字号:
.module main.c
.area text(rom, con, rel)
0000 .dbfile D:\cood\18b20\main.c
0000 .dbfunc e port_init _port_init fV
.even
0000 _port_init::
0000 .dbline -1
0000 .dbline 33
0000 ; #include <iom32v.h>
0000 ; #include <macros.h>
0000 ;
0000 ; #define F_CPU 7372800
0000 ;
0000 ; //数据类型的定义
0000 ; #define uint8 unsigned char
0000 ; #define uint16 unsigned int
0000 ;
0000 ; //位变量操作宏定义
0000 ; #define BIT_SET(a,b) a|=BIT(b)
0000 ; #define BIT_CLR(a,b) a&=~BIT(b)
0000 ; #define BIT_INV(a,b) a^=BIT(b)
0000 ; #define BIT_STATUS(a,b) a&BIT(b)
0000 ;
0000 ; //DS18B20操作定义
0000 ; #define CLR_DS18B20 BIT_CLR(PORTA,PA0) //数据线强制拉低
0000 ; #define SET_DS18B20 BIT_SET(PORTA,PA0) //数据线强制拉高,上拉
0000 ; #define HLD_DS18B20 BIT_SET(DDRA,PA0) //Mega16控制总线
0000 ; #define RLS_DS18B20 BIT_CLR(DDRA,PA0) //释放总线
0000 ; #define STU_DS18B20 BIT_STATUS(PINA,PA0) //数据线的状态
0000 ; #define bit_0_1 0x00
0000 ; #define bit_0 0x01 //因为移位了,所以低在前,高位在后
0000 ; #define bit_1 0x02
0000 ; #define maxsize 7
0000 ; unsigned char rom_seq[maxsize][8];
0000 ; unsigned char B20_num;
0000 ; unsigned char tep[maxsize][10];
0000 ;
0000 ;
0000 ;
0000 ; void port_init(void)
0000 ; {
0000 .dbline 34
0000 ; PORTA = 0xFF;
0000 8FEF ldi R24,255
0002 8BBB out 0x1b,R24
0004 .dbline 35
0004 ; DDRA = 0xFF;
0004 8ABB out 0x1a,R24
0006 .dbline 36
0006 ; PORTB = 0xFF;
0006 88BB out 0x18,R24
0008 .dbline 37
0008 ; DDRB = 0xFF; //输出
0008 87BB out 0x17,R24
000A .dbline 38
000A ; PORTC = 0xFF; //m103 output only
000A 85BB out 0x15,R24
000C .dbline 39
000C ; DDRC = 0xFF; //输出
000C 84BB out 0x14,R24
000E .dbline 40
000E ; DDRD = 0xFF;
000E 81BB out 0x11,R24
0010 .dbline 41
0010 ; PORTD = 0xFF;
0010 82BB out 0x12,R24
0012 .dbline -2
0012 L1:
0012 .dbline 0 ; func end
0012 0895 ret
0014 .dbend
0014 .dbfunc e delayUs _delayUs fV
0014 ; temp -> R16
.even
0014 _delayUs::
0014 .dbline -1
0014 .dbline 63
0014 ; }
0014 ;
0014 ; /**********************************************************************
0014 ; functionName: void delayUs(BYTE temp)
0014 ; description :延时函数 晶振频率:7.3728MHZ
0014 ; delayUs(1); //2.71us
0014 ; delayUs(2); //3.53us
0014 ; delayUs(4); //5.15us
0014 ; delayUs(8); //8.41us
0014 ; delayUs(16); //14.92us
0014 ; delayUs(32); //27.94us
0014 ; delayUs(64); //53.98us
0014 ; delayUs(128); //106.07us
0014 ; delayUs(255); //209.42us
0014 ; delayUs(18); //16.55us
0014 ; delayUs(34); //29.57us
0014 ; delayUs(35); //30.38us
0014 ; delayUs(100); //83.28
0014 ; _NOP(); //0.14us
0014 ; **********************************************************************/
0014 ; void delayUs(uint8 temp)
0014 ; {
0014 L3:
0014 .dbline 64
0014 ; while(temp--);
0014 L4:
0014 .dbline 64
0014 202E mov R2,R16
0016 3324 clr R3
0018 0150 subi R16,1
001A 2220 tst R2
001C D9F7 brne L3
001E X0:
001E .dbline -2
001E L2:
001E .dbline 0 ; func end
001E 0895 ret
0020 .dbsym r temp 16 c
0020 .dbend
0020 .dbfunc e longdelay _longdelay fV
0020 ; i -> R20,R21
.even
0020 _longdelay::
0020 4A93 st -y,R20
0022 5A93 st -y,R21
0024 .dbline -1
0024 .dbline 69
0024 ; }
0024 ;
0024 ; //延时约1s
0024 ; void longdelay(void)
0024 ; {
0024 .dbline 71
0024 ; unsigned int i;
0024 ; for(i=4761;i!=0;i--)
0024 49E9 ldi R20,4761
0026 52E1 ldi R21,18
0028 04C0 xjmp L10
002A L7:
002A .dbline 72
002A ; delayUs(255);
002A 0FEF ldi R16,255
002C F3DF xcall _delayUs
002E L8:
002E .dbline 71
002E 4150 subi R20,1
0030 5040 sbci R21,0
0032 L10:
0032 .dbline 71
0032 4030 cpi R20,0
0034 4507 cpc R20,R21
0036 C9F7 brne L7
0038 X1:
0038 .dbline -2
0038 L6:
0038 .dbline 0 ; func end
0038 5991 ld R21,y+
003A 4991 ld R20,y+
003C 0895 ret
003E .dbsym r i 20 i
003E .dbend
003E .dbfunc e resetDS18B20 _resetDS18B20 fc
003E ; errTime -> R10
.even
003E _resetDS18B20::
003E AA92 st -y,R10
0040 .dbline -1
0040 .dbline 81
0040 ; }
0040 ;
0040 ;
0040 ; /*******************************************************************************
0040 ; functionName: uint8 resetDS18B20(void)
0040 ; description :DS18B20初始化
0040 ; ********************************************************************************/
0040 ; uint8 resetDS18B20(void)
0040 ; {
0040 .dbline 82
0040 ; uint8 errTime=0;
0040 AA24 clr R10
0042 .dbline 83
0042 ; RLS_DS18B20; //释放总线
0042 D098 cbi 0x1a,0
0044 .dbline 84
0044 ; _NOP();
0044 0000 nop
0046 .dbline 85
0046 ; HLD_DS18B20; //Maga16控制总线
0046 D09A sbi 0x1a,0
0048 .dbline 86
0048 ; CLR_DS18B20; //强制拉低
0048 D898 cbi 0x1b,0
004A .dbline 87
004A ; delayUs(255); //209.42us
004A 0FEF ldi R16,255
004C E3DF xcall _delayUs
004E .dbline 88
004E ; delayUs(255); //209.42us
004E 0FEF ldi R16,255
0050 E1DF xcall _delayUs
0052 .dbline 89
0052 ; delayUs(255); //83.28us
0052 0FEF ldi R16,255
0054 DFDF xcall _delayUs
0056 .dbline 91
0056 ; //以上的三个延时大于480us
0056 ; RLS_DS18B20; //释放总线,总线自动上拉
0056 D098 cbi 0x1a,0
0058 .dbline 92
0058 ; _NOP();
0058 0000 nop
005A 08C0 xjmp L13
005C L12:
005C .dbline 94
005C ; while(STU_DS18B20)
005C ; {
005C .dbline 95
005C ; delayUs(4); //5.15us
005C 04E0 ldi R16,4
005E DADF xcall _delayUs
0060 .dbline 96
0060 ; errTime++;
0060 A394 inc R10
0062 .dbline 97
0062 ; if(errTime>20)
0062 84E1 ldi R24,20
0064 8A15 cp R24,R10
0066 10F4 brsh L15
0068 X2:
0068 .dbline 98
0068 ; return(0x00); //如果等带大于约 5.15us*20就返回0x00,报告复位失败(实际上只要等待15-60us)
0068 0027 clr R16
006A 0FC0 xjmp L11
006C L15:
006C .dbline 99
006C ; }
006C L13:
006C .dbline 93
006C C899 sbic 0x19,0
006E F6CF rjmp L12
0070 X3:
0070 .dbline 100
0070 ; errTime=0;
0070 AA24 clr R10
0072 08C0 xjmp L18
0074 L17:
0074 .dbline 102
0074 ; while(!(STU_DS18B20))
0074 ; {
0074 .dbline 103
0074 ; delayUs(4); //5.15us
0074 04E0 ldi R16,4
0076 CEDF xcall _delayUs
0078 .dbline 104
0078 ; errTime++;
0078 A394 inc R10
007A .dbline 105
007A ; if(errTime>50)
007A 82E3 ldi R24,50
007C 8A15 cp R24,R10
007E 10F4 brsh L20
0080 X4:
0080 .dbline 106
0080 ; return(0x00); //如果等带大于约 5.15us*50就返回0x00,报告复位失败(实际上只要等待60-240us)
0080 0027 clr R16
0082 03C0 xjmp L11
0084 L20:
0084 .dbline 107
0084 ; }
0084 L18:
0084 .dbline 101
0084 C89B sbis 0x19,0
0086 F6CF rjmp L17
0088 X5:
0088 .dbline 108
0088 ; return(0xff);
0088 0FEF ldi R16,255
008A .dbline -2
008A L11:
008A .dbline 0 ; func end
008A A990 ld R10,y+
008C 0895 ret
008E .dbsym r errTime 10 c
008E .dbend
008E .dbfunc e write_a_bit _write_a_bit fV
008E ; temp -> R10
.even
008E _write_a_bit::
008E AA92 st -y,R10
0090 A02E mov R10,R16
0092 .dbline -1
0092 .dbline 115
0092 ; }
0092 ;
0092 ;
0092 ; /*
0092 ; 写一个位
0092 ; */
0092 ; void write_a_bit(unsigned char temp){
0092 .dbline 116
0092 ; HLD_DS18B20; //Maga16控制总线
0092 D09A sbi 0x1a,0
0094 .dbline 117
0094 ; CLR_DS18B20; //强制拉低
0094 D898 cbi 0x1b,0
0096 .dbline 118
0096 ; delayUs(16); //14.92us
0096 00E1 ldi R16,16
0098 BDDF xcall _delayUs
009A .dbline 119
009A ; if(temp&0x01)
009A A0FE sbrs R10,0
009C 02C0 rjmp L23
009E X6:
009E .dbline 120
009E ; RLS_DS18B20; //释放总线
009E D098 cbi 0x1a,0
00A0 01C0 xjmp L24
00A2 L23:
00A2 .dbline 122
00A2 ; else
00A2 ; CLR_DS18B20; //强制拉低
00A2 D898 cbi 0x1b,0
00A4 L24:
00A4 .dbline 123
00A4 ; delayUs(16); //14.92us
00A4 00E1 ldi R16,16
00A6 B6DF xcall _delayUs
00A8 .dbline 124
00A8 ; delayUs(35); //30.38us
00A8 03E2 ldi R16,35
00AA B4DF xcall _delayUs
00AC .dbline 125
00AC ; RLS_DS18B20; //释放总线
00AC D098 cbi 0x1a,0
00AE .dbline 126
00AE ; delayUs(1); //2.71us(大于1us就行了)
00AE 01E0 ldi R16,1
00B0 B1DF xcall _delayUs
00B2 .dbline -2
00B2 L22:
00B2 .dbline 0 ; func end
00B2 A990 ld R10,y+
00B4 0895 ret
00B6 .dbsym r temp 10 c
00B6 .dbend
00B6 .dbfunc e read_a_bit _read_a_bit fc
00B6 ; temp -> R20
.even
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -