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

📄 ds18b20driver_io.asm

📁 这段代码是关于用凌阳采集温度、并显示在数码管上的程序。
💻 ASM
字号:
//======================================================================
//	文件名称:	DISP.ASM
//	功能描述:	在LED上显示DS18B20测量的温度值
//	维护记录:	
//======================================================================

//======================================================
// 文件名称:	DS18B20Driver_IO.asm
// 功能描述:	DS18B20底层驱动程序,主要是与时序有关的代码
//======================================================
	.DEFINE		P_IOA_Data				0x7000
	.DEFINE		P_IOA_Buffer			0x7001
	.DEFINE		P_IOA_Dir				0x7002
	.DEFINE		P_IOA_Attrib			0x7003
	.DEFINE		P_IOA_Latch				0x7004
	.DEFINE		P_IOB_Data				0x7005
	.DEFINE		P_IOB_Buffer			0x7006
	.DEFINE		P_IOB_Dir				0x7007
	.DEFINE		P_IOB_Attrib			0x7008
	.DEFINE		P_SystemClock			0x7013
//以下重复定义用于端口的定义,如用户需要针对自用的设计选择端口时,可以更改
//以下宏定义中的东东
.DEFINE Port_Data	P_IOB_Data
.DEFINE Port_Buffer	P_IOB_Buffer
.DEFINE Port_Dir	P_IOB_Dir
.DEFINE Port_Attrib	P_IOB_Attrib
.external _temp
//M_DQ用于定义具体连接DS18B20的DQ线的端口
.DEFINE	M_DQ	0x0040			//
//由于DS18B20的驱动程序需要修改CPU主频,为了让用户设用DS18B20 的API函数后,能
//恢复到原来的系统时钟、CPU主频设置,用户可以在下面的常量R_SystemClock中定义
//用户设计需要的值
.DATA
R_SystemClock:
	.DW	0x0018					//buffer of save the system clock
	
.CODE
//======================================================
// 汇编格式:	_F_18B20_Initial_IO
// C格式:		void F_18B20_Initial_IO(void);
// 实现功能:	端口初始化子程序
// 入口参数:	无
// 出口参数:	无
// 破坏寄存器:	r1
//======================================================
.PUBLIC _F_18B20_Initial_IO
_F_18B20_Initial_IO:
	r1 = [Port_Dir]				//set the prot connected DQ to float input mode 
	r1 = r1&(~M_DQ)
	[Port_Dir] = r1
	r1 = [Port_Attrib]
	r1 = r1|M_DQ
	[Port_Attrib] = r1
	r1 = [Port_Buffer]
	r1 = r1|M_DQ
	[Port_Buffer] = r1
	retf
//======================================================
// 汇编格式:	_F_18B20_Reset
// C格式:		unsigned int F_18B20_Reset(void);
// 实现功能:	一线总线复位及从设备应答控制程序
// 入口参数:	无
// 出口参数:	0表示复位失败   1表示复位成功
// 破坏寄存器:	r2  r3
//======================================================	
.PUBLIC _F_18B20_Reset
_F_18B20_Reset:
	r3 = [Port_Dir]
	r3 = r3|M_DQ
	[Port_Dir] = r3					//Set Port connect DQ as Ouput
	r2 = [Port_Buffer]
	r2 = r2&(~M_DQ)
	[Port_Buffer] = r2				//Set DQ to Low
	r1 = 600
	call _F_18B20_Delay				//Delay 600us for DS18B20 Reset
	r2 = r2|M_DQ		
	[Port_Buffer] = r2
	r3 = r3&(~M_DQ)
	[Port_Dir] = r3					//resume the port as floatting input 
	r1 = 30
	call _F_18B20_Delay				//Delay 30us
	r2 = 1000
?F_18B20_Reset_L:
	r2 -=1
	jz ?F_18B20_Reset_E				//Timer overflow Erro
	r1 = [Port_Data]
	r1 = r1&M_DQ
	jnz ?F_18B20_Reset_L
	r2 = 1000
?F_18B20_Reset_L2:
	r2-=1
	jz ?F_18B20_Reset_E				//Timer overflow Erro
	r1 = [Port_Data]
	r1 = r1&M_DQ
	jz ?F_18B20_Reset_L2
	r1 = 1
	jmp ?F_18B20_Reset_Exit
?F_18B20_Reset_E:
	r1 = 0
?F_18B20_Reset_Exit:
	retf
//======================================================
// 汇编格式:	_F_18B20_Write_1
// C格式:		void F_18B20_Write_1(void);
// 实现功能:	向一线总线写1
// 入口参数:	无
// 出口参数:	无
// 破坏寄存器:	r1  r2  r3
//======================================================
.PUBLIC _F_18B20_Write_1
_F_18B20_Write_1:
	r3 = [Port_Dir]
	r3 = r3|M_DQ
	[Port_Dir] = r3					//Set Port connect DQ as Ouput
	r2 = [Port_Buffer]
	r2 = r2&(~M_DQ)
	[Port_Buffer] = r2				//Set DQ to Low
	r1 = 10
	call _F_18B20_Delay				//Delay 10us
	r2 = r2|M_DQ		
	[Port_Buffer] = r2
	r1 = 25
	call _F_18B20_Delay				//Delay 40us
	r3 = r3&(~M_DQ)
	[Port_Dir] = r3					//resume the port as floatting input 
	retf
//======================================================
// 汇编格式:	_F_18B20_Write_0
// C格式:		void F_18B20_Write_0(void);
// 实现功能:	向一线总线写0
// 入口参数:	无
// 出口参数:	无
// 破坏寄存器:	r1  r2  r3
//======================================================
.PUBLIC _F_18B20_Write_0
_F_18B20_Write_0:
	r3 = [Port_Dir]
	r3 = r3|M_DQ
	[Port_Dir] = r3					//Set Port connect DQ as Ouput
	r2 = [Port_Buffer]
	r2 = r2&(~M_DQ)
	[Port_Buffer] = r2				//Set DQ to Low
	r1 = 40
	call _F_18B20_Delay				//Delay 40us
	r2 = r2|M_DQ		
	[Port_Buffer] = r2
	r1 = 1
	call _F_18B20_Delay				//Delay 1us
	r3 = r3&(~M_DQ)
	[Port_Dir] = r3					//resume the port as floatting input 
	retf
//======================================================
// 汇编格式:	_F_18B20_Read_DQ
// C格式:		unsigned int F_18B20_Read_DQ(void);
// 实现功能:	读一位一线总线的数据
// 入口参数:	无
// 出口参数:	当前读回的位的值0/1
// 破坏寄存器:	r1  r2  r3
//======================================================	
.PUBLIC _F_18B20_Read_DQ
_F_18B20_Read_DQ:
	r3 = [Port_Dir]
	r3 = r3|M_DQ
	[Port_Dir] = r3					//Set Port connect DQ as Ouput
	r2 = [Port_Buffer]
	r2 = r2&(~M_DQ)
	[Port_Buffer] = r2				//Set DQ to Low
	r1 = 10
	call _F_18B20_Delay				//Delay 40us
	r3 = r3&(~M_DQ)
	[Port_Dir] = r3					//resume the port as floatting input 
	r1 = 3
	call _F_18B20_Delay				//Delay 40us
	r3 = [Port_Data]
	r3 = r3&M_DQ
	jz ?L18B20_Read_0
	r3 = 0x80
?L18B20_Read_0:
	r1 = 30
	call _F_18B20_Delay
	r2 = r2|M_DQ		
	[Port_Buffer] = r2
	r1 = 1
	call _F_18B20_Delay				//Delay 1us
	r1 = r3
	retf
//======================================================
// 汇编格式:	_F_18B20_Delay
// C格式:		void F_18B20_Delay(unsigned int Timers);
// 实现功能:	在49MHz的主频下的uS延时程序
// 入口参数:	需要延时的时长(以uS为单位)
// 出口参数:	无
// 破坏寄存器:	r1  
//======================================================	
.PUBLIC _F_18B20_Delay
_F_18B20_Delay:
	cmp r1,1
	jna ?Delay_Exit
?Delay_Loop:
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	nop
	r1-=1
	jnz ?Delay_Loop
?Delay_Exit:
	retf
//======================================================
// 汇编格式:	_F_18B20_SetSystemCLK
// C格式:		F_18B20_SetSystemCLK(void);
// 实现功能:	将CPU主频设置为49MHz,为的是在时序控制时
//				可以获取到较精确的延时
// 入口参数:	无
// 出口参数:	无
// 破坏寄存器:	r1  
//======================================================
.PUBLIC _F_18B20_SetSystemCLK
_F_18B20_SetSystemCLK:
	r1 = 0x88
	[P_SystemClock] = r1			//set system clock upto 49MHz
	retf
//======================================================
// 汇编格式:	_F_18B20_RsuSystemCLK
// C格式:		void F_18B20_RsuSystemCLK(void);
// 实现功能:	恢复系统及CPU主频,而至于恢复为多少,则
//				由前面定义的变量R_SystemClock的值确定,用
//				户可根据各自的程序设计需求进行改动
// 入口参数:	无
// 出口参数:	无
// 破坏寄存器:	r1  
//======================================================
.PUBLIC _F_18B20_RsuSystemCLK
_F_18B20_RsuSystemCLK:
	r1 = [R_SystemClock]
	[P_SystemClock] = r1
	retf

⌨️ 快捷键说明

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