📄 wr.c
字号:
/********************************************************************
* 名称: Delay_us
* 说明:
* 功能: 延时量 = DelayTime*2(us)
* 调用: 无
* 输入: DelayTime
* 返回值: 无
***********************************************************************/
void Delay_us(uchar DelayTime)
{
T0IF = 0;
TMR0 = 255-DelayTime;
while(T0IF == 0);
}
/********************************************************************
* 名称: HEX_TO_DEC
* 说明:
* 功能: 将一个16BIT的16进制数转换为10进制数
* 调用: 无
* 输入: uint source,uchar * object
* 返回值: 无
***********************************************************************/
void HEX_TO_DEC(uint source,uchar * object)
{
uchar i;
for(i=0;i<5;i++)
{
*(object+i) = source % 10;
source/=10;
}
return;
}
/********************************************************************
* 名称: IIC_START
* 说明:
* 功能: IIC启动信号
* 调用: Delay_us
* 输入: 无
* 返回值: 无
***********************************************************************/
void IIC_START(void)//启动信号
{
IIC_SCL = 0;
IIC_SDA_OUT;
IIC_SDA = 1;
IIC_SCL = 1;
Delay_us(2);
IIC_SDA = 0;
Delay_us(2);
IIC_SCL = 0;
}
/********************************************************************
* 名称: IIC_ACK
* 说明:
* 功能: 读取返回应答信号
* 调用: Delay_us
* 输入: 无
* 返回值: 操作标志
***********************************************************************/
uchar IIC_ACK(void) //读取返回应答信号
{
IIC_SDA_IN; //接收应答信号
TMR1L = 0;
TMR1H = 0;
TMR1IF =0;
while(IIC_SDA)
{
if(TMR1IF == 1) return ERROR;
}
TMR1L = 0;
TMR1H = 0;
TMR1IF =0;
while(IIC_SDA==0)
{
if(TMR1IF == 1) return ERROR;
}
Delay_us(5);
return OK;
}
/********************************************************************
* 名称: SendByte
* 说明:
* 功能: 发送1 Byte 数据
* 调用: Delay_us
* 输入: uchar Byte
* 返回值: 无
***********************************************************************/
void SendByte(uchar Byte) //发送1 Byte 数据
{
uchar i;
IIC_SDA_OUT;
for(i=0;i<8;i++)
{
IIC_SCL = 0;
Byte = Byte<<1;
IIC_SDA = CARRY;
Delay_us(5);
IIC_SCL = 1;
Delay_us(5);
}
IIC_SCL = 0;
}
/********************************************************************
* 名称: Send_BIT9RW
* 说明:
* 功能: 发送第9位的R/W_N
* 调用: Delay_us
* 输入: uchar RW
* 返回值: 无
***********************************************************************/
void Send_BIT9RW(uchar RW) //发送第9位的R/W_N
{
IIC_SCL = 0;
if(RW == W)
IIC_SDA = W;
else
IIC_SDA = R;
Delay_us(5);
IIC_SCL = 1;
Delay_us(5);
IIC_SCL = 0;
IIC_SDA = 1;
Delay_us(5);
}
/********************************************************************
* 名称: ReceiveTowByte
* 说明:
* 功能: 接收 2 Byte数据
* 调用: Delay_us
* 输入: uint *p
* 返回值: 无
***********************************************************************/
void ReceiveTowByte(uint *p) //接收 2 Byte数据
{
uchar i;
uint TempInt;
*p = 0;
TempInt = 0x8000;
for(i=0;i<16;i++)
{
IIC_SCL = 1;
Delay_us(2);
if(IIC_SDA == 1)
*p = *p + TempInt;
TempInt = TempInt>>1;
Delay_us(2);
IIC_SCL = 0;
Delay_us(5);
}
}
/********************************************************************
* 名称: Read_Temper
* 说明:
* 功能: 读取温度的低层驱动模块
* 调用: IIC_START,SendByte,Send_BIT9RW,IIC_ACK,ReceiveTowByte
* 输入: uint *p
* 返回值: 操作标志
***********************************************************************/
uchar Read_Temper(uint *p)
{
uchar Temp;
IIC_START(); //启动信号
SendByte(140);
Send_BIT9RW(R); //读
Temp = IIC_ACK();
if(Temp == OK)
{
ReceiveTowByte(p);
return OK;
}
else
return ERROR;
}
/********************************************************************
* 名称: Read_EEPROM
* 说明:
* 功能: 读模块内部的EEPROM
* 调用: IIC_START,SendByte,Send_BIT9RW,IIC_ACK,ReceiveTowByte
* 输入: uchar Addr,uchar *p
* 返回值: 操作标志
***********************************************************************/
uchar Read_EEPROM(uchar Addr,uchar *p)//读EEPROM
{
uchar Temp;
uint DataInt;
IIC_START(); //启动信号
SendByte(Addr);
Send_BIT9RW(R); //读
Temp = IIC_ACK();
if(Temp == OK)
{
ReceiveTowByte(&DataInt);
*p = (uchar)(DataInt&0x00ff);
return OK;
}
else
return ERROR;
}
/********************************************************************
* 名称: Write_EEPROM
* 说明:
* 功能: 写模块内部的EEPROM
* 调用: IIC_START,SendByte,Send_BIT9RW,IIC_ACK
* 输入: uchar Addr,uchar Data
* 返回值: 操作标志
***********************************************************************/
uchar Write_EEPROM(uchar Addr,uchar Data)
{
uchar Temp;
uint DataInt;
IIC_START(); //启动信号
SendByte(Addr);
Send_BIT9RW(W); //写
SendByte(Data);
Temp = IIC_ACK();
if(Temp == OK)
return OK;
else
return ERROR;
}
/********************************************************************
* 名称: Read_Ultra
* 说明:
* 功能: 读超声波测量到的距离数据
* 调用: IIC_START,SendByte,Send_BIT9RW,IIC_ACK,ReceiveTowByte
* 输入: uuint *p
* 返回值: 操作标志
***********************************************************************/
uchar Read_Ultra(uint *p)//读超声波测量到的距离数据
{
uchar Temp;
IIC_START(); //启动信号
SendByte(150);
Send_BIT9RW(R); //读
Temp = IIC_ACK();
if(Temp == OK)
{
ReceiveTowByte(p);
return OK;
}
else
return ERROR;
}
/********************************************************************
* 名称: Read_AD
* 说明:
* 功能: 读AD转换数据
* 调用: IIC_START,SendByte,Send_BIT9RW,IIC_ACK,ReceiveTowByte
* 输入: uchar Channel(通道选择1 - 4) ,uint *p
* 返回值: 操作标志
***********************************************************************/
uchar Read_AD(uchar Channel ,uint *p)
{
uchar Temp;
IIC_START(); //启动信号
SendByte(130+(Channel&0x07));
Send_BIT9RW(R); //读
Temp = IIC_ACK();
if(Temp == OK)
{
ReceiveTowByte(p);
return OK;
}
else
return ERROR;
}
/********************************************************************
* 名称: DisplayTemper
* 说明:
* 功能: 显示温度
* 调用: Read_Temper,WR_DATA10
* 输入: 无
* 返回值: 无
***********************************************************************/
void DisplayTemper(void)//显示温度
{
uchar i;
uchar Temp;
uchar TemperData;
uint DataInt;
Temp = Read_Temper(&DataInt);
if(Temp == OK)
{
TemperData = (uchar)(DataInt>>4)&0x00ff;
dis[1]= TemperData/10;
dis[0] = TemperData%10;
for(i=8;i>1;i--)
{
dis[i] = 10;
}
dis[9] = Mode;
WR_DATA10();
}
}
/********************************************************************
* 名称: DisplayUltra
* 说明:
* 功能: 显示超声波测量距离
* 调用: Read_Ultra,HEX_TO_DEC,WR_DATA10
* 输入: 无
* 返回值: 无
***********************************************************************/
void DisplayUltra(void)//显示超声波测量距离
{
uchar i;
uchar Temp;
uint DataInt;
Temp = Read_Ultra(&DataInt);
if(Temp == OK)
{
HEX_TO_DEC(DataInt,dis);
dis[2] = dis[2]|0xf0;
for(i=8;i>4;i--)
{
dis[i] = 10;
}
dis[9] = Mode;
WR_DATA10();
}
}
/********************************************************************
* 名称: EEPROM_Test
* 说明:
* 功能: 写EEPROM测试
* 调用: Write_EEPROM,Read_EEPROM,WR_DATA10
* 输入: 无
* 返回值: 无
***********************************************************************/
void EEPROM_Test(void) //写EEPROM测试
{
uchar Temp;
uchar Temp2;
uchar i;
Write_EEPROM(127,0x28);
Temp = Read_EEPROM(127,&Temp2);
if(Temp == OK)
{
dis[1] = (Temp2>>4)&0x0f;
dis[0] = Temp2&0x0f;
for(i=8;i>1;i--)
{
dis[i] = 10;
}
dis[9] = Mode;
WR_DATA10();
}
}
/********************************************************************
* 名称: AD_Test
* 说明:
* 功能: 读内部AD测试
* 调用: Read_AD,HEX_TO_DEC,WR_DATA10
* 输入: uchar Channel:通道选择(1 - 4)
* 返回值: 无
***********************************************************************/
void AD_Test(uchar Channel)//读内部AD测试
{
uchar Temp;
uchar i;
uint DataInt;
Temp = Read_AD(Channel,&DataInt);//读AD输入
if(Temp == OK)
{
HEX_TO_DEC(DataInt,dis);
for(i=8;i>4;i--)
{
dis[i] = 10;
}
dis[9] = Mode;
WR_DATA10();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -