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

📄 m41t0drv.c

📁 C8051ucos源码
💻 C
字号:
/*=======================================================================================================

M41T0drv是面向M41T0芯片的驱动程序

建立于:2005.08.01
编写人:杨术轩

=======================================================================================================*/

#include "C8051F020.h"
#include "M41T0DRV.h"

#define M41T0ClkDelay 10
#define M41T0SCL 	  P1_5
#define M41T0SDA	  P1_4

//---------------------------------------------------------------------------------
//IIC总线的开始状态
void M41T0I2CStart(void)
{
unsigned char wait;
	for(wait=0;wait<M41T0ClkDelay;wait++);
	M41T0SDA = 1;
	M41T0SCL = 1;
	for(wait=0;wait<M41T0ClkDelay;wait++);
	M41T0SDA = 0;
	for(wait=0;wait<M41T0ClkDelay;wait++);
	M41T0SCL = 0;
	for(wait=0;wait<M41T0ClkDelay;wait++);
}
//----------------------------------------------------------------------------------
//IIC总线的停止状态
void M41T0I2CStop(void)
{
unsigned char wait;
	M41T0SCL  = 0;	
	M41T0SDA  = 0;
	for(wait=0;wait<M41T0ClkDelay;wait++);
	M41T0SCL  = 1;
	for(wait=0;wait<M41T0ClkDelay;wait++);
	M41T0SDA  = 1;
}
//----------------------------------------------------------------------------------
//向从器件写出一个字节 ch,同时判断ack返回
//返回:ack的状态
unsigned char M41T0I2CByteWr(unsigned char ch)
{
unsigned char i,wait;
	for (i=0; i<8; i++)
	{
		if(ch&0x80) M41T0SDA=1; else  M41T0SDA=0;
		ch<<=1;
		for(wait=0;wait<M41T0ClkDelay;wait++);  
		M41T0SCL = 1;
		for(wait=0;wait<M41T0ClkDelay;wait++);
		M41T0SCL = 0;
		for(wait=0;wait<M41T0ClkDelay;wait++);
	}
	M41T0SDA=1; 
	for(wait=0;wait<M41T0ClkDelay;wait++);
	M41T0SCL = 1; 
	if(M41T0SDA)i=1;else i=0;
	for(wait=0;wait<M41T0ClkDelay;wait++);
	M41T0SCL = 0;
	return i;
}
//-----------------------------------------------------------------------------------
//从从器件读入一个字节 
//reack:是反给从器件的应答信号
//返回:读入的字节
unsigned char M41T0I2CByteRd(unsigned char reack)
{
unsigned char i,val,wait;
	M41T0SDA = 1;
	for (i=0; i<8; i++)
	{
		for(wait=0;wait<M41T0ClkDelay;wait++);
		M41T0SCL = 1;
		val<<=1;
		if(M41T0SDA) val|=1;
		for(wait=0;wait<M41T0ClkDelay;wait++);
		M41T0SCL = 0;
	} 
	for(wait=0;wait<M41T0ClkDelay;wait++);
	if (reack)M41T0SDA = 1;else M41T0SDA = 0;
	for(wait=0;wait<M41T0ClkDelay;wait++);
	M41T0SCL = 1;
	for(wait=0;wait<M41T0ClkDelay;wait++);
	M41T0SCL = 0;

return val;
}
//===========================================================================================================
//向m41t0写一组数据
//参数
//	adr:M41T0内部的地址
//	pbuf:写出的数据指针
//	len:写出的数据长度
unsigned char M41T0Write(unsigned char adr,unsigned char *pbuf,unsigned char len)
{
	M41T0I2CStart();
	if(M41T0I2CByteWr(0xd0))return 1;
	if(M41T0I2CByteWr(adr))return 1;
	while(len--)
	{
		if(M41T0I2CByteWr(*pbuf++))return 1;
	}
	M41T0I2CStop();
	return 0;
}
//------------------------------------------------------------------------------------------------------
//从m41t0读一组数据
//参数
//	adr:M41T0内部的地址
//	pbuf:读入的数据指针
//	len:读入的数据长度
unsigned char M41T0Read(unsigned char adr,unsigned char *pbuf,unsigned char len)
{
	if(len==0)return 0;
	M41T0I2CStart();
	M41T0I2CByteWr(0xd0);
	M41T0I2CByteWr(adr);
	M41T0I2CStop();	
	M41T0I2CStart();
	M41T0I2CByteWr(0xd1);

	while(len--)
	{
		if(len!=0)*pbuf++ = M41T0I2CByteRd(0);
		else *pbuf++ = M41T0I2CByteRd(1);//读取最后一个字节后ACK的值必须是1
	}

	M41T0I2CStop();	
	return 0;
}
//===========================================================================================================
//获取日期时间
unsigned char GetM41T0Time(DateTimeTYP *datetime)
{
unsigned char buf[8];
unsigned char *ptr = (unsigned char *) datetime;
unsigned char i;
	for(i=0;i<5;i++)
	{
		M41T0Read(0,buf,8);
		if((buf[0]>>4)>6||(buf[0]&0x0f)>9)continue;
		if((buf[1]>>4)>6||(buf[1]&0x0f)>9)continue;
		if((buf[2]>>4)>2||(buf[2]&0x0f)>9)continue;
		if((buf[4]>>4)>3||(buf[4]&0x0f)>9)continue;
		if((buf[5]>>4)>1||(buf[5]&0x0f)>9)continue;
		if((buf[6]>>4)>9||(buf[6]&0x0f)>9)continue;
		*ptr++ = buf[0];
		*ptr++ = buf[1];
		*ptr++ = buf[2];
		*ptr++ = buf[4];
		*ptr++ = buf[5];
		*ptr++ = buf[6];
	return 0;	
	}	
	return 1;
}
//------------------------------------------------------------------------------------------------------
//设置日期时间
//返回:非零数正确
unsigned char SetM41T0Time(DateTimeTYP *datetime)
{
idata unsigned char buf[7];
idata unsigned char *ptr = (unsigned char *) datetime;
	M41T0Write(1,"\x80",1);
	buf[0] = datetime->sec;
	buf[1] = datetime->min;
	buf[2] = datetime->hour;
	buf[3] = 0x01;
	buf[4] = datetime->date;
	buf[5] = datetime->month;
	buf[6] = datetime->year;

		if((buf[0]>>4)>6||(buf[0]&0x0f)>9)return 0;
		if((buf[1]>>4)>6||(buf[1]&0x0f)>9)return 0;
		if((buf[2]>>4)>2||(buf[2]&0x0f)>9)return 0;
		if((buf[4]>>4)>3||(buf[4]&0x0f)>9)return 0;
		if((buf[5]>>4)>1||(buf[5]&0x0f)>9)return 0;
		if((buf[6]>>4)>9||(buf[6]&0x0f)>9)return 0;
	
	M41T0Write(6,&buf[6],1);
	M41T0Write(5,&buf[5],1);
	M41T0Write(4,&buf[4],1);
	M41T0Write(3,&buf[3],1);
	M41T0Write(2,&buf[2],1);
	M41T0Write(1,&buf[1],1);
	M41T0Write(0,&buf[0],1);
return 1;
}

//=======================================================================================================


⌨️ 快捷键说明

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