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

📄 ds18b20.s

📁 基于AVR单片机的DS18B20测温程序.
💻 S
📖 第 1 页 / 共 2 页
字号:
	.module DS18B20.c
	.area text(rom, con, rel)
	.dbfile E:\CRAZY\调试AVR_C\电升06~1\DS18B20.c
	.dbfunc e process _process fV
;              p -> R10,R11
;              i -> y+6
	.even
_process::
	rcall push_arg4
	rcall push_gset3
	ldd R10,y+10
	ldd R11,y+11
	.dbline -1
	.dbline 20
; #include <iom8v.h>
; #include <macros.h>
; 
; #define LCM_Data  PORTB
; #define Busy    0x80
; 
; #define  Set_DQ1        DDRC |= 0x08;  PORTC |= 0x08;         //总线拉高
; #define  Set_DQ0        DDRC |= 0x08;  PORTC &= 0xf7;         //总线置低
; #define  Read_DQ        PINC&0x08                             //读总线
; #define  MatchROM       0xcc                                  //匹配ROM
; #define  WriteMode      0x4e                                  //写模式
; #define  TH             0x64                                  //设置温度上限100
; #define  TL             0x8a                                  //设置温度下限-10
; #define  MatchTemp      0x7f                                  //写温度匹配寄存器,12bit
; #define  ConverTem      0x44                                  //DS18B20温度转换命令
; #define  Get_Value      0xbe                                  //读取温度寄存器值
; uchar data[5];
; 
; void process(long int i,uchar*p)
; {
	.dbline 21
; p[0]=i/1000;
	ldi R20,232
	ldi R21,3
	ldi R22,0
	ldi R23,0
	movw R30,R28
	ldd R2,z+6
	ldd R3,z+7
	ldd R4,z+8
	ldd R5,z+9
	st -y,R23
	st -y,R22
	st -y,R21
	st -y,R20
	movw R16,R2
	movw R18,R4
	rcall div32s
	movw R30,R10
	std z+0,R16
	.dbline 22
; i=i%1000;
	ldi R20,232
	ldi R21,3
	ldi R22,0
	ldi R23,0
	movw R30,R28
	ldd R2,z+6
	ldd R3,z+7
	ldd R4,z+8
	ldd R5,z+9
	st -y,R23
	st -y,R22
	st -y,R21
	st -y,R20
	movw R16,R2
	movw R18,R4
	rcall mod32s
	movw R30,R28
	std z+6,R16
	std z+7,R17
	std z+8,R18
	std z+9,R19
	.dbline 23
; p[1]=i/100;
	ldi R20,100
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R30,R28
	ldd R2,z+6
	ldd R3,z+7
	ldd R4,z+8
	ldd R5,z+9
	st -y,R23
	st -y,R22
	st -y,R21
	st -y,R20
	movw R16,R2
	movw R18,R4
	rcall div32s
	movw R30,R10
	std z+1,R16
	.dbline 24
; i=i%100;
	ldi R20,100
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R30,R28
	ldd R2,z+6
	ldd R3,z+7
	ldd R4,z+8
	ldd R5,z+9
	st -y,R23
	st -y,R22
	st -y,R21
	st -y,R20
	movw R16,R2
	movw R18,R4
	rcall mod32s
	movw R30,R28
	std z+6,R16
	std z+7,R17
	std z+8,R18
	std z+9,R19
	.dbline 25
; p[2]=i/10;
	ldi R20,10
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R30,R28
	ldd R2,z+6
	ldd R3,z+7
	ldd R4,z+8
	ldd R5,z+9
	st -y,R23
	st -y,R22
	st -y,R21
	st -y,R20
	movw R16,R2
	movw R18,R4
	rcall div32s
	movw R30,R10
	std z+2,R16
	.dbline 26
; i=i%10;
	ldi R20,10
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R30,R28
	ldd R2,z+6
	ldd R3,z+7
	ldd R4,z+8
	ldd R5,z+9
	st -y,R23
	st -y,R22
	st -y,R21
	st -y,R20
	movw R16,R2
	movw R18,R4
	rcall mod32s
	movw R30,R28
	std z+6,R16
	std z+7,R17
	std z+8,R18
	std z+9,R19
	.dbline 27
; p[3]=i;
	movw R30,R28
	ldd R2,z+6
	ldd R3,z+7
	movw R30,R10
	std z+3,R2
	.dbline 28
; for(i=0;i<4;i++)
	ldi R20,0
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R30,R28
	std z+6,R20
	std z+7,R21
	std z+8,R22
	std z+9,R23
L2:
	.dbline 29
	movw R30,R28
	ldd R2,z+6
	ldd R3,z+7
	add R2,R10
	adc R3,R11
	movw R30,R2
	ldd R24,z+0
	subi R24,208    ; addi 48
	std z+0,R24
L3:
	.dbline 28
	ldi R20,1
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R30,R28
	ldd R2,z+6
	ldd R3,z+7
	ldd R4,z+8
	ldd R5,z+9
	add R2,R20
	adc R3,R21
	adc R4,R22
	adc R5,R23
	movw R30,R28
	std z+6,R2
	std z+7,R3
	std z+8,R4
	std z+9,R5
	.dbline 28
	ldi R20,4
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R30,R28
	ldd R2,z+6
	ldd R3,z+7
	ldd R4,z+8
	ldd R5,z+9
	cp R2,R20
	cpc R3,R21
	cpc R4,R22
	cpc R5,R23
	brge X0
	rjmp L2
X0:
	.dbline 30
; p[i]+=0x30;
; p[4]='$'; 
	ldi R24,36
	movw R30,R10
	std z+4,R24
	.dbline -2
L1:
	rcall pop_gset3
	adiw R28,4
	.dbline 0 ; func end
	ret
	.dbsym r p 10 pc
	.dbsym l i 6 L
	.dbend
	.dbfunc e delayms _delayms fV
;              j -> R20,R21
;              i -> R16,R17
	.even
_delayms::
	rcall push_gset1
	.dbline -1
	.dbline 35
; }
; 
; 
; void delayms(uint i)
; {
	.dbline 37
;  uint j;
;  for(;i!=0;i--)
	rjmp L10
L7:
	.dbline 38
;  for(j=0;j<8000;j++)
	clr R20
	clr R21
	rjmp L14
L11:
	.dbline 39
L12:
	.dbline 38
	subi R20,255  ; offset = 1
	sbci R21,255
L14:
	.dbline 38
	cpi R20,64
	ldi R30,31
	cpc R21,R30
	brlo L11
L8:
	.dbline 37
	subi R16,1
	sbci R17,0
L10:
	.dbline 37
	cpi R16,0
	cpc R16,R17
	brne L7
X1:
	.dbline -2
L6:
	rcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r j 20 i
	.dbsym r i 16 i
	.dbend
	.dbfunc e delayus _delayus fV
;              i -> R16,R17
	.even
_delayus::
	.dbline -1
	.dbline 43
;  ;
; }
; 
; void delayus(uint i)
; {
	.dbline 44
;  for(;i!=0;i--)
	rjmp L19
L16:
	.dbline 45
L17:
	.dbline 44
	subi R16,1
	sbci R17,0
L19:
	.dbline 44
	cpi R16,0
	cpc R16,R17
	brne L16
X2:
	.dbline -2
L15:
	.dbline 0 ; func end
	ret
	.dbsym r i 16 i
	.dbend
	.dbfunc e port_init _port_init fV
	.even
_port_init::
	.dbline -1
	.dbline 52
;  ;
; }
;  
;  
;  
; 
; void port_init(void)
; {
	.dbline 53
;    DDRD  = 0xfe;
	ldi R24,254
	out 0x11,R24
	.dbline 54
;    PORTD = 0xff;
	ldi R24,255
	out 0x12,R24
	.dbline 55
;    DDRB  = 0xff;
	out 0x17,R24
	.dbline 56
;    PORTB = 0xff;
	out 0x18,R24
	.dbline 57
;    DDRC  = 0xff;
	out 0x14,R24
	.dbline 58
;    PORTC = 0xff;
	out 0x15,R24
	.dbline -2
L20:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e WriteDataLCM _WriteDataLCM fV
;          WDLCM -> R20
	.even
_WriteDataLCM::
	rcall push_gset1
	mov R20,R16
	.dbline -1
	.dbline 65
; }
; 
; 
; /**********************************************************/ 
; //写数据
; void WriteDataLCM(unsigned char WDLCM)
; {
	.dbline 67
;  //ReadStatusLCM(); //检测忙
;  LCM_Data = WDLCM;
	out 0x18,R20
	.dbline 70
;  //PORTC=0B00000100;
;  //PORTC=0B00000100;
;  delayms(1);
	ldi R16,1
	ldi R17,0
	rcall _delayms
	.dbline 71
;  PORTC=0B00000101;
	ldi R24,5
	out 0x15,R24
	.dbline 72
;  PORTC=0B00000100;
	ldi R24,4
	out 0x15,R24
	.dbline -2
L21:
	rcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r WDLCM 20 c
	.dbend
	.dbfunc e WriteCommandLCM _WriteCommandLCM fV
;          BuysC -> R22
;          WCLCM -> R20
	.even
_WriteCommandLCM::
	rcall push_gset2
	mov R22,R18
	mov R20,R16
	.dbline -1
	.dbline 78
; }
; 
; //写指令
; void  WriteCommandLCM(unsigned char WCLCM,unsigned char BuysC) //BuysC为0时忽略忙检测
; 
; {
	.dbline 79
;  if (BuysC) 
	tst R22
	breq L23
	.dbline 80
;  ;//ReadStatusLCM(); //根据需要检测忙
L23:
	.dbline 81
;  LCM_Data = WCLCM;
	out 0x18,R20
	.dbline 82
;  delayms(1);
	ldi R16,1
	ldi R17,0
	rcall _delayms
	.dbline 83
;  PORTC=0B00000001;
	ldi R24,1
	out 0x15,R24
	.dbline 84
;  delayms(1);
	ldi R16,1
	ldi R17,0
	rcall _delayms
	.dbline 85
;  PORTC=0B00000000;
	clr R2
	out 0x15,R2
	.dbline -2
L22:
	rcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r BuysC 22 c
	.dbsym r WCLCM 20 c
	.dbend
	.dbfunc e ReadDataLCM _ReadDataLCM fc
	.even
_ReadDataLCM::
	.dbline -1
	.dbline 90
; }
; 
; //读数据
; unsigned char ReadDataLCM(void)
; {
	.dbline 91
;  PORTC=0X00000111;
	ldi R24,273
	ldi R25,1
	out 0x15,R24
	.dbline 92
;  return(LCM_Data);
	in R16,0x18
	.dbline -2
L25:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e LCMInit _LCMInit fV
	.even
_LCMInit::
	.dbline -1
	.dbline 99
; }
; 
; //读状态
; 
; 
; void LCMInit(void) //LCM初始化
; {
	.dbline 108
; /* LCM_Data = 0;
;  WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号
;  delayms(5);
;  WriteCommandLCM(0x38,0);
;  delayms(5);
;  WriteCommandLCM(0x38,0);
;  delayms(5);
; */
;  WriteCommandLCM(0x38,0); //显示模式设置,开始要求每次检测忙信号
	clr R18
	ldi R16,56
	rcall _WriteCommandLCM
	.dbline 110
;  //WriteCommandLCM(0x08,0); //关闭显示
;  WriteCommandLCM(0x01,0); //显示清屏
	clr R18
	ldi R16,1
	rcall _WriteCommandLCM
	.dbline 111
;  WriteCommandLCM(0x06,0); // 显示光标移动设置
	clr R18
	ldi R16,6
	rcall _WriteCommandLCM
	.dbline 112
;  WriteCommandLCM(0x0c,0); // 显示开及光标设置
	clr R18
	ldi R16,12
	rcall _WriteCommandLCM
	.dbline -2
L26:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e DisplayOneChar _DisplayOneChar fV
;          DData -> y+4
;              Y -> R22
;              X -> R20
	.even
_DisplayOneChar::
	rcall push_gset2
	mov R22,R18
	mov R20,R16
	.dbline -1
	.dbline 120
; }
; 
; /*****************************************************************************/
; 
; 
; //按指定位置显示一个字符
; void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
; {
	.dbline 121
;  Y &= 0x1;
	andi R22,1
	.dbline 122
;  X &= 0xF; //限制X不能大于15,Y不能大于1
	andi R20,15
	.dbline 123
;  if (Y) X += 0x40; //当要显示第二行时地址码+0x40;
	tst R22
	breq L28
	.dbline 123
	subi R20,192    ; addi 64
L28:
	.dbline 124
;  X += 0x80; // 算出指令码
	subi R20,128    ; addi 128
	.dbline 125
;  WriteCommandLCM(X, 0); //这里不检测忙信号,发送地址码
	clr R18
	mov R16,R20
	rcall _WriteCommandLCM
	.dbline 126
;  WriteDataLCM(DData);
	ldd R16,y+4
	rcall _WriteDataLCM
	.dbline -2
L27:
	rcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym l DData 4 c
	.dbsym r Y 22 c
	.dbsym r X 20 c
	.dbend
	.dbfunc e DisplayListChar _DisplayListChar fV
;     ListLength -> R20
;          DData -> R22,R23
;              Y -> R10
;              X -> R12
	.even
_DisplayListChar::
	rcall push_gset4
	mov R10,R18
	mov R12,R16
	sbiw R28,1
	ldd R22,y+9
	ldd R23,y+10
	.dbline -1
	.dbline 131
; }
; 
; //按指定位置显示一串字符
; void DisplayListChar(unsigned char X, unsigned char Y, unsigned char *DData)
; {
	.dbline 134
;  unsigned char ListLength;
; 
;   ListLength = 0;
	clr R20
	.dbline 135
;  Y &= 0x1;
	mov R24,R10
	andi R24,1
	mov R10,R24
	.dbline 136
;  X &= 0xF; //限制X不能大于15,Y不能大于1
	mov R24,R12
	andi R24,15
	mov R12,R24
	rjmp L32
L31:
	.dbline 138
;  while (DData[ListLength]!= '$') //若到达字串尾则退出
;   {
	.dbline 139
;    if (X <= 0xF) //X坐标应小于0xF
	ldi R24,15
	cp R24,R12
	brlo L34
	.dbline 140
;     {
	.dbline 141
;      DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符
	mov R30,R20
	clr R31
	add R30,R22
	adc R31,R23
	ldd R2,z+0
	std y+0,R2
	mov R18,R10
	mov R16,R12
	rcall _DisplayOneChar
	.dbline 142
;      ListLength++;
	inc R20
	.dbline 143
;      X++;
	inc R12
	.dbline 144
;     }
L34:
	.dbline 145
L32:
	.dbline 137
	mov R30,R20
	clr R31
	add R30,R22
	adc R31,R23
	ldd R24,z+0
	cpi R24,36
	brne L31
	.dbline -2
L30:
	adiw R28,1
	rcall pop_gset4
	.dbline 0 ; func end
	ret
	.dbsym r ListLength 20 c
	.dbsym r DData 22 pc
	.dbsym r Y 10 c
	.dbsym r X 12 c
	.dbend
	.dbfunc e Writr0 _Writr0 fV
	.even
_Writr0::
	.dbline -1
	.dbline 155
;   }
; }
; 
; /**********************************************************/ 
; 
; 
; /***************************************************************
; *  功能:主机向总线写0                                         *
; ***************************************************************/
; void Writr0(void)
; {
	.dbline 156
;    Set_DQ1;
	sbi 0x14,3
	.dbline 156
	sbi 0x15,3
	.dbline 156
	.dbline 157
;    Set_DQ0;
	sbi 0x14,3
	.dbline 157
	in R24,0x15
	andi R24,247
	out 0x15,R24
	.dbline 157
	.dbline 158
;    delayus(700);
	ldi R16,700
	ldi R17,2
	rcall _delayus
	.dbline 160
;  
;    Set_DQ1; 
	sbi 0x14,3
	.dbline 160
	sbi 0x15,3
	.dbline 160
	.dbline 161
;    asm("nop");
	nop
	.dbline 162
;    delayus(15);
	ldi R16,15
	ldi R17,0
	rcall _delayus
	.dbline -2
L36:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e Writr1 _Writr1 fV
	.even
_Writr1::
	.dbline -1
	.dbline 169
; }
; 
; /***************************************************************
; *  功能:主机向总线写1                                         *
; ***************************************************************/
; void Writr1(void)
; {
	.dbline 170
;    Set_DQ1;
	sbi 0x14,3
	.dbline 170
	sbi 0x15,3
	.dbline 170
	.dbline 171
;    Set_DQ0;
	sbi 0x14,3
	.dbline 171
	in R24,0x15
	andi R24,247
	out 0x15,R24
	.dbline 171
	.dbline 172
;    asm("nop");
	nop
	.dbline 173
;    asm("nop");
	nop
	.dbline 174
;    asm("nop");
	nop
	.dbline 175
;    asm("nop");
	nop
	.dbline 176
;  asm("nop");
	nop
	.dbline 177
;  asm("nop");
	nop
	.dbline 178
;  asm("nop");
	nop
	.dbline 179
;     asm("nop");
	nop
	.dbline 180
;    asm("nop");
	nop
	.dbline 181
;    asm("nop");
	nop
	.dbline 182
;    asm("nop");

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -