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

📄 18b20_test.s

📁 mega16_32实验板的上程序mega16+LCD12232-9+ds18B20
💻 S
📖 第 1 页 / 共 2 页
字号:
	ldi R19,0
	xcall div16u
	std y+1,R16
	.dbline 120
	ldi R18,10
	ldi R19,0
	movw R16,R12
	xcall mod16u
	movw R12,R16
	.dbline 121
;  dispi[0]=adc;
	std y+0,R12
	.dbline 122
;  lcd_write(command,wz);
	mov R18,R10
	clr R16
	xcall _lcd_write
	xjmp L60
L59:
	.dbline 124
;  while(j--)
;  {
	.dbline 125
;   if((dispi[j]==0)&&(i==1)&&(j!=0))
	movw R24,R28
	mov R30,R20
	clr R31
	add R30,R24
	adc R31,R25
	ldd R2,z+0
	tst R2
	brne L62
X13:
	cpi R22,1
	brne L62
X14:
	tst R20
	breq L62
X15:
	.dbline 126
;   {
	.dbline 127
;    lcd_write(data,dispi[j]+0x20);	  
	movw R24,R28
	mov R30,R20
	clr R31
	add R30,R24
	adc R31,R25
	ldd R18,z+0
	subi R18,224    ; addi 32
	ldi R16,1
	xcall _lcd_write
	.dbline 128
;   }
	xjmp L63
L62:
	.dbline 130
;   else
;   { 
	.dbline 131
;    lcd_write(data,dispi[j]+0x30);
	movw R24,R28
	mov R30,R20
	clr R31
	add R30,R24
	adc R31,R25
	ldd R18,z+0
	subi R18,208    ; addi 48
	ldi R16,1
	xcall _lcd_write
	.dbline 132
;    i=0;
	clr R22
	.dbline 133
;   }
L63:
	.dbline 134
;  }
L60:
	.dbline 123
	mov R2,R20
	clr R3
	subi R20,1
	tst R2
	brne L59
X16:
	.dbline -2
L56:
	.dbline 0 ; func end
	adiw R28,3
	xjmp pop_xgsetF03C
	.dbsym r i 22 c
	.dbsym l dispi 0 A[3:3]c
	.dbsym r j 20 c
	.dbsym r adc 12 i
	.dbsym r wz 10 c
	.dbend
	.dbfile D:\mega16_32实验板资料\ICCAVR源程序\18b20\18b20.h
	.dbfunc e Sensor_Delay _Sensor_Delay fV
;              i -> R20,R21
;             US -> R10,R11
	.even
_Sensor_Delay::
	xcall push_xgset300C
	movw R10,R16
	.dbline -1
	.dbline 12
; #define b20_io   PC7
; #define b20_port PORTC
; #define b20_pin  PINC
; #define b20_ddr  DDRC
; /********************************************************************************************
; * 函数名称:Sensor_Delay(uint16 count)//延时函数
; * 功    能:DS18B20软件延时专用
; * 入口参数:count    
; * 出口参数:无
; *********************************************************************************************/
; void Sensor_Delay(unsigned int US)
; {
	.dbline 14
;  unsigned int i;
;  US=US*5/4;		  	 //5/4是在8MHz晶振下,通过软件仿真反复实验得到的数值
	ldi R16,5
	ldi R17,0
	movw R18,R10
	xcall empy16s
	movw R10,R16
	lsr R11
	ror R10
	lsr R11
	ror R10
	.dbline 15
;  for(i=0;i<US;i++); 
	clr R20
	clr R21
	xjmp L68
L65:
	.dbline 15
L66:
	.dbline 15
	subi R20,255  ; offset = 1
	sbci R21,255
L68:
	.dbline 15
	cp R20,R10
	cpc R21,R11
	brlo L65
X17:
	.dbline -2
L64:
	.dbline 0 ; func end
	xjmp pop_xgset300C
	.dbsym r i 20 i
	.dbsym r US 10 i
	.dbend
	.dbfunc e B20_init _B20_init fV
	.even
_B20_init::
	.dbline -1
	.dbline 24
; }
; /*******************************************
; 函数名称: B20_init
; 功    能: 复位DS18B20
; 参    数: 无
; 返回值  : 无
; ********************************************/
; void B20_init(void)
; {
	.dbline 25
;  b20_ddr|=(1<<b20_io);			//配置为输出			  
	sbi 0x14,7
	.dbline 26
;  b20_port&=~(1<<b20_io);			//拉低
	cbi 0x15,7
	.dbline 27
;  Sensor_Delay(600);					//等待600微秒
	ldi R16,600
	ldi R17,2
	xcall _Sensor_Delay
	.dbline 28
;  b20_port|=(1<<b20_io);			//释放总线
	sbi 0x15,7
	.dbline 29
;  Sensor_Delay(60);					//等待60微秒
	ldi R16,60
	ldi R17,0
	xcall _Sensor_Delay
	.dbline 30
;  b20_ddr&=~(1<<b20_io);			//配置为输入 
	cbi 0x14,7
L70:
	.dbline 31
;  while((b20_pin&(1<<b20_io)));	//等待DS18B20拉低
L71:
	.dbline 31
	sbic 0x13,7
	rjmp L70
X18:
L73:
	.dbline 32
;  while(!(b20_pin&(1<<b20_io))); //等待DS18B20释放总线
L74:
	.dbline 32
	sbis 0x13,7
	rjmp L73
X19:
	.dbline -2
L69:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e B20_readB _B20_readB fc
;           retd -> R20
;              i -> R22
	.even
_B20_readB::
	st -y,R20
	st -y,R22
	.dbline -1
	.dbline 42
; }
; 
; /*******************************************
; 函数名称: B20_readB
; 功    能: 读取一个字节的数据
; 参    数: 无
; 返回值  : retd--返回的一个字节数据
; ********************************************/
; unsigned char B20_readB(void)
; {
	.dbline 43
;  unsigned char i,retd=0;
	clr R20
	.dbline 44
;  for(i=0;i<8;i++)	 			//位计数值
	clr R22
	xjmp L80
L77:
	.dbline 45
;  {
	.dbline 46
;   retd>>=1;						//右移,准备接受新的数据位
	lsr R20
	.dbline 47
;   b20_ddr|=(1<<b20_io);			//配置为输出
	sbi 0x14,7
	.dbline 48
;   b20_port&=~(1<<b20_io);			//拉低,启动读数据位
	cbi 0x15,7
	.dbline 49
;   b20_port|=(1<<b20_io);			//释放总线
	sbi 0x15,7
	.dbline 50
;   Sensor_Delay(5);					//等待5微秒
	ldi R16,5
	ldi R17,0
	xcall _Sensor_Delay
	.dbline 51
;   b20_ddr&=~(1<<b20_io);			//配置为输入,开始读取数据位
	cbi 0x14,7
	.dbline 52
;   if(b20_pin&(1<<b20_io))			//该位是否为高
	sbis 0x13,7
	rjmp L81
X20:
	.dbline 53
;   {
	.dbline 54
;    retd|=0x80;					//是就将此位置高
	ori R20,128
	.dbline 55
;   }
L81:
	.dbline 56
;   Sensor_Delay(50);					//等待50微秒
	ldi R16,50
	ldi R17,0
	xcall _Sensor_Delay
	.dbline 57
;  }
L78:
	.dbline 44
	inc R22
L80:
	.dbline 44
	cpi R22,8
	brlo L77
X21:
	.dbline 58
;  return retd;					//将读到的一个字节返回
	mov R16,R20
	.dbline -2
L76:
	.dbline 0 ; func end
	ld R22,y+
	ld R20,y+
	ret
	.dbsym r retd 20 c
	.dbsym r i 22 c
	.dbend
	.dbfunc e B20_writeB _B20_writeB fV
;              i -> R20
;            wrd -> R10
	.even
_B20_writeB::
	st -y,R10
	st -y,R20
	mov R10,R16
	.dbline -1
	.dbline 67
; }
; /*******************************************
; 函数名称: B20_writeB
; 功    能: 写入一个字节的数据
; 参    数: wrd--要写入的数据
; 返回值  : 无
; ********************************************/
; void B20_writeB(unsigned char wrd)
; {
	.dbline 69
;  unsigned char i;
;  for(i=0;i<8;i++)	  	        //位计数值
	clr R20
	xjmp L87
L84:
	.dbline 70
;  {
	.dbline 71
;   b20_ddr|=(1<<b20_io);			//配置为输出
	sbi 0x14,7
	.dbline 72
;   b20_port&=~(1<<b20_io);			//拉低,启动写数据位
	cbi 0x15,7
	.dbline 73
;   Sensor_Delay(1);					//等待1微秒
	ldi R16,1
	ldi R17,0
	xcall _Sensor_Delay
	.dbline 74
;   if(wrd&0x01)					//此位数据是否为高
	sbrs R10,0
	rjmp L88
X22:
	.dbline 75
;   {
	.dbline 76
;    b20_port|=(1<<b20_io);			//是高则将单总线拉高
	sbi 0x15,7
	.dbline 77
;   }
	xjmp L89
L88:
	.dbline 79
;   else
;   {
	.dbline 80
;    b20_port&=~(1<<b20_io);		//是低则将单总线拉低
	cbi 0x15,7
	.dbline 81
;   }
L89:
	.dbline 82
;   Sensor_Delay(50);					//等待50微秒
	ldi R16,50
	ldi R17,0
	xcall _Sensor_Delay
	.dbline 83
;   b20_port|=(1<<b20_io);			//释放总线
	sbi 0x15,7
	.dbline 84
;   wrd>>=1;						//右移,为写入新的数据位做准备
	lsr R10
	.dbline 85
;  }
L85:
	.dbline 69
	inc R20
L87:
	.dbline 69
	cpi R20,8
	brlo L84
X23:
	.dbline 86
;  Sensor_Delay(50);					//等待50微秒
	ldi R16,50
	ldi R17,0
	xcall _Sensor_Delay
	.dbline -2
L83:
	.dbline 0 ; func end
	ld R20,y+
	ld R10,y+
	ret
	.dbsym r i 20 c
	.dbsym r wrd 10 c
	.dbend
	.dbfunc e Read_temp _Read_temp fV
;          temph -> R10,R11
;          templ -> R12,R13
	.even
_Read_temp::
	xcall push_xgset003C
	movw R10,R18
	movw R12,R16
	.dbline -1
	.dbline 96
; }
; 
; /*******************************************
; 函数名称: Read_temp
; 功    能: 读取温度值
; 参    数: templ温度值低位,temph温度值高位
; 返回值  : 无
; ********************************************/
; void Read_temp(unsigned char *templ,unsigned char *temph)
; {
	.dbline 97
;  B20_init();	      //初始化,每次写命令都从初始化开始
	xcall _B20_init
	.dbline 98
;  B20_writeB(0xcc); 	  //跳过ROM
	ldi R16,204
	xcall _B20_writeB
	.dbline 99
;  B20_writeB(0x44); 	  //启动温度转换
	ldi R16,68
	xcall _B20_writeB
	.dbline 100
;  B20_init();	   	  //初始化,每次写命令都从初始化开始
	xcall _B20_init
	.dbline 101
;  B20_writeB(0xcc); 	  //跳过ROM
	ldi R16,204
	xcall _B20_writeB
	.dbline 102
;  B20_writeB(0xbe); 	  //读寄存器
	ldi R16,190
	xcall _B20_writeB
	.dbline 103
;  *templ=B20_readB();	  //读温度低字节
	xcall _B20_readB
	movw R30,R12
	std z+0,R16
	.dbline 104
;  *temph=B20_readB();	  //读温度高字节
	xcall _B20_readB
	movw R30,R10
	std z+0,R16
	.dbline -2
L90:
	.dbline 0 ; func end
	xjmp pop_xgset003C
	.dbsym r temph 10 pc
	.dbsym r templ 12 pc
	.dbend
	.dbfunc e b20_display _b20_display fV
;       fraction -> R10,R11
;          inter -> R12
;          b20_l -> y+1
;          b20_h -> y+0
;             lz -> R20
	.even
_b20_display::
	xcall push_xgset303C
	mov R20,R16
	sbiw R28,2
	.dbline -1
	.dbline 113
; }
; /*******************************************
; 函数名称: b20_display
; 功    能: 温度值显示
; 参    数: lz为液晶显示位置
; 返回值  : 无
; ********************************************/
; void b20_display(unsigned char lz)
; {
	.dbline 114
;  unsigned char b20_h=0,b20_l=0;
	clr R2
	std y+0,R2
	.dbline 114
	std y+1,R2
	.dbline 115
;  unsigned char inter=0;
	clr R12
	.dbline 116
;  unsigned int fraction=0;
	clr R10
	clr R11
	.dbline 117
;  Read_temp(&b20_l,&b20_h);   //读取温度值
	movw R18,R28
	movw R16,R28
	subi R16,255  ; offset = 1
	sbci R17,255
	xcall _Read_temp
	.dbline 118
;  if(b20_h&0xf8)
	ldd R24,y+0
	andi R24,248
	breq L92
X24:
	.dbline 119
;  {
	.dbline 120
;   lcd_write(command,lz);
	mov R18,R20
	clr R16
	xcall _lcd_write
	.dbline 121
;   lcd_write(data,' -');
	ldi R18,32
	ldi R16,1
	xcall _lcd_write
	.dbline 122
;   b20_l=~b20_l;
	ldd R2,y+1
	com R2
	std y+1,R2
	.dbline 123
;   b20_h=~b20_h;
	ldd R2,y+0
	com R2
	std y+0,R2
	.dbline 124
;  }
L92:
	.dbline 125
;  inter=b20_h*16+(b20_l>>4);//整数部分
	ldd R2,y+0
	ldi R24,16
	mul R24,R2
	mov R12,R0
	ldd R24,y+1
	swap R24
	andi R24,#0x0F
	add R12,R24
	.dbline 126
;  int_disp(lz+1,inter);
	mov R18,R12
	clr R19
	mov R16,R20
	subi R16,255    ; addi 1
	xcall _int_disp
	.dbline 127
;  lcd_write(data,'.');
	ldi R18,46
	ldi R16,1
	xcall _lcd_write
	.dbline 128
;  fraction=(b20_l&0x0f)*625;//小数部分,只显示小数点后一位
	ldd R18,y+1
	clr R19
	andi R18,15
	andi R19,0
	ldi R16,625
	ldi R17,2
	xcall empy16s
	movw R10,R16
	.dbline 129
;  lcd_write(data,fraction/1000+48);
	ldi R18,1000
	ldi R19,3
	xcall div16u
	mov R18,R16
	subi R18,208  ; offset = 48
	sbci R19,255
	ldi R16,1
	xcall _lcd_write
	.dbline -2
L91:
	.dbline 0 ; func end
	adiw R28,2
	xjmp pop_xgset303C
	.dbsym r fraction 10 i
	.dbsym r inter 12 c
	.dbsym l b20_l 1 c
	.dbsym l b20_h 0 c
	.dbsym r lz 20 c
	.dbend
	.dbfile D:\mega16_32实验板资料\ICCAVR源程序\18b20\18b20_test.c
	.dbfunc e main _main fV
	.even
_main::
	.dbline -1
	.dbline 13
; //ICC-AVR application builder : 2008-5-8 17:24:29
; // Target : M16
; // Crystal: 8.0000Mhz
; 
; #include <iom16v.h>
; #include <macros.h>
; 
; #include "delay.h"
; #include "lcd12232.h"
; #include "18b20.h"
; 
; void main(void)
; {
	.dbline 14
;  LCD_init();
	xcall _LCD_init
	.dbline 15
;  line1_display("18B20 温度显示 ");
	ldi R16,<L95
	ldi R17,>L95
	xcall _line1_display
	xjmp L97
L96:
	.dbline 17
;  while(1)
;  {
	.dbline 18
;    b20_display(0x93);
	ldi R16,147
	xcall _b20_display
	.dbline 19
;  }
L97:
	.dbline 16
	xjmp L96
X25:
	.dbline -2
L94:
	.dbline 0 ; func end
	ret
	.dbend
	.area data(ram, con, rel)
	.dbfile D:\mega16_32实验板资料\ICCAVR源程序\18b20\18b20_test.c
L95:
	.blkb 16
	.area idata
	.byte 49,56,'B,50,48,32,206,194,182,200,207,212,202,190,32,0
	.area data(ram, con, rel)
	.dbfile D:\mega16_32实验板资料\ICCAVR源程序\18b20\18b20_test.c
; }

⌨️ 快捷键说明

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