📄 urm37_wr.c
字号:
#include"URM37_51demo.H"
extern void LCD_ClearLin2(void);
extern void LCD_WRITE_COMM(uchar);
extern void LCD_WRITE_DATA(uchar);
/********************************************************************
* 名称: Delay_us
* 说明:
* 功能: 延时量 = DelayTime(us) MAX = 65536MS
* 调用: 无
* 输入: DelayTime
* 返回值: 无
***********************************************************************/
/*
void Delay_us(uint DelayTime)
{
uchar *p;
p = &DelayTime;
DelayTime = 65535-DelayTime;
TR0 = 0;
TF0 = 0;
TH0 = *p++;
TL0 = *p;
TR0 = 1;
while(TF0 == 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)//启动信号
{
uchar i;
IIC_SCL = 0;
for(i=0;i<7;i++);
IIC_SDA = 1;
for(i=0;i<7;i++);
IIC_SCL = 1;
for(i=0;i<7;i++);
IIC_SDA = 0;
for(i=0;i<7;i++);
IIC_SCL = 0;
}
/********************************************************************
* 名称: IIC_ACK
* 说明:
* 功能: 读取返回应答信号
* 调用: Delay_us
* 输入: 无
* 返回值: 操作标志
***********************************************************************/
uchar IIC_ACK(void) //读取返回应答信号
{
uchar i;
TR0 = 0;
TF0 = 0;
TL0 = 0;
TH0 = 0;
TR0 = 1;
while(IIC_SDA)
{
if(TF0 == 1) return ERROR;
}
TR0 = 0;
TF0 = 0;
TL0 = 0;
TH0 = 0;
TR0 = 1;
while(IIC_SDA==0)
{
if(TF0 == 1) return ERROR;
}
for(i=0;i<7;i++);
return OK;
}
/********************************************************************
* 名称: SendByte
* 说明:
* 功能: 发送1 Byte 数据
* 调用: Delay_us
* 输入: uchar Byte
* 返回值: 无
***********************************************************************/
void SendByte(uchar Byte) //发送1 Byte 数据
{
uchar i;
uchar j;
for(j=0;j<8;j++)
{
IIC_SCL = 0;
for(i=0;i<7;i++);
IIC_SDA = (bit)(Byte & 0x80);
Byte <<= 1;
for(i=0;i<7;i++);
IIC_SCL = 1;
for(i=0;i<7;i++);
}
IIC_SCL = 0;
}
/********************************************************************
* 名称: Send_BIT9RW
* 说明:
* 功能: 发送第9位的R/W_N
* 调用: Delay_us
* 输入: uchar RW
* 返回值: 无
***********************************************************************/
void Send_BIT9RW(uchar RW) //发送第9位的R/W_N
{
uchar i;
IIC_SCL = 0;
for(i=0;i<7;i++);
if(RW == W)
IIC_SDA = W;
else
IIC_SDA = R;
for(i=0;i<7;i++);
IIC_SCL = 1;
for(i=0;i<7;i++);
IIC_SCL = 0;
IIC_SDA = 1;
for(i=0;i<7;i++);
}
/********************************************************************
* 名称: ReceiveTowByte
* 说明:
* 功能: 接收 2 Byte数据
* 调用: Delay_us
* 输入: uint *p
* 返回值: 无
***********************************************************************/
void ReceiveTowByte(uint *p) //接收 2 Byte数据
{
uchar i;
uchar j;
uint TempInt;
*p = 0;
TempInt = 0x8000;
for(j=0;j<16;j++)
{
IIC_SCL = 1;
for(i=0;i<7;i++);
if(IIC_SDA == 1)
*p = *p + TempInt;
CY = 0;
TempInt = TempInt>>1;
for(i=0;i<7;i++);
IIC_SCL = 0;
for(i=0;i<7;i++);
}
}
/********************************************************************
* 名称: 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;
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;
uchar array[]="Temperature: ";
Temp = Read_Temper(&DataInt);
if(Temp == OK)
{
i = 0;
//LCD_ClearLin2();
LCD_WRITE_COMM(0xc0); //
while(array[i]!='\0')
{
LCD_WRITE_DATA(array[i]);
i++;
}
TemperData = (uchar)(DataInt>>4)&0x00ff;
Temp = TemperData/10;
LCD_WRITE_DATA(0x30+Temp);
Temp= TemperData%10;
LCD_WRITE_DATA(0x30+Temp);
LCD_WRITE_DATA('C');
}
}
/********************************************************************
* 名称: DisplayUltra
* 说明:
* 功能: 显示超声波测量距离
* 调用: Read_Ultra,HEX_TO_DEC,WR_DATA10
* 输入: 无
* 返回值: 无
***********************************************************************/
void DisplayUltra(void)//显示超声波测量距离
{
uchar i;
uchar Temp;
uint DataInt;
uchar Data[5];
uchar array[]="Distance: ";
Temp = Read_Ultra(&DataInt);
if(Temp == OK)
{
i = 0;
//LCD_ClearLin2();
LCD_WRITE_COMM(0xc0); //
while(array[i]!='\0')
{
LCD_WRITE_DATA(array[i]);
i++;
}
HEX_TO_DEC(DataInt,Data);
LCD_WRITE_DATA(0x30+Data[2]);
LCD_WRITE_DATA('.');
LCD_WRITE_DATA(0x30+Data[1]);
LCD_WRITE_DATA(0x30+Data[0]);
LCD_WRITE_DATA('m');
}
}
/********************************************************************
* 名称: EEPROM_Test
* 说明:
* 功能: 写EEPROM测试
* 调用: Write_EEPROM,Read_EEPROM,WR_DATA10
* 输入: 无
* 返回值: 无
***********************************************************************/
void EEPROM_Test(void) //写EEPROM测试
{
uchar Temp;
uchar Temp2;
uchar i;
uchar array[]="EEPROM Test: ";
Write_EEPROM(0,0x51);
Temp = Read_EEPROM(0,&Temp2);
if(Temp == OK)
{
i = 0;
//LCD_ClearLin2();
LCD_WRITE_COMM(0xc0); //
while(array[i]!='\0')
{
LCD_WRITE_DATA(array[i]);
i++;
}
Temp = (Temp2>>4)&0x0f;
LCD_WRITE_DATA(0x30+Temp);
Temp = Temp2&0x0f;
LCD_WRITE_DATA(0x30+Temp);
}
}
/********************************************************************
* 名称: 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;
uchar Data[5];
uchar array[]="AD CH";
Temp = Read_AD(Channel,&DataInt);//读AD输入
if(Temp == OK)
{
i = 0;
//LCD_ClearLin2();
LCD_WRITE_COMM(0xc0); //
while(array[i]!='\0')
{
LCD_WRITE_DATA(array[i]);
i++;
}
LCD_WRITE_DATA(0x30+Channel);
LCD_WRITE_DATA(':');
LCD_WRITE_DATA(' ');
LCD_WRITE_DATA(' ');
LCD_WRITE_DATA(' ');
LCD_WRITE_DATA(' ');
LCD_WRITE_DATA(' ');
HEX_TO_DEC(DataInt,Data);
LCD_WRITE_DATA(0x30+Data[3]);
LCD_WRITE_DATA(0x30+Data[2]);
LCD_WRITE_DATA(0x30+Data[1]);
LCD_WRITE_DATA(0x30+Data[0]);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -