?? 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
* 調(diào)用: 無
* 輸入: 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進(jìn)制數(shù)轉(zhuǎn)換為10進(jìn)制數(shù)
* 調(diào)用: 無
* 輸入: uint source,uchar * object
* 返回值: 無
***********************************************************************/
void HEX_TO_DEC(uint source,uchar * object)
{
uchar i;
source*=5;//source個半厘米,放大10倍
for(i=0;i<5;i++)
{
*(object+i) = source % 10;
source/=10;
}
return;
}
/********************************************************************
* 名稱: IIC_START
* 說明:
* 功能: IIC啟動信號
* 調(diào)用: 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
* 說明:
* 功能: 讀取返回應(yīng)答信號
* 調(diào)用: Delay_us
* 輸入: 無
* 返回值: 操作標(biāo)志
***********************************************************************/
uchar IIC_ACK(void) //讀取返回應(yīng)答信號
{
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
* 說明:
* 功能: 發(fā)送1 Byte 數(shù)據(jù)
* 調(diào)用: Delay_us
* 輸入: uchar Byte
* 返回值: 無
***********************************************************************/
void SendByte(uchar Byte) //發(fā)送1 Byte 數(shù)據(jù)
{
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
* 說明:
* 功能: 發(fā)送第9位的R/W_N
* 調(diào)用: Delay_us
* 輸入: uchar RW
* 返回值: 無
***********************************************************************/
void Send_BIT9RW(uchar RW) //發(fā)送第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數(shù)據(jù)
* 調(diào)用: Delay_us
* 輸入: uint *p
* 返回值: 無
***********************************************************************/
void ReceiveTowByte(uint *p) //接收 2 Byte數(shù)據(jù)
{
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
* 說明:
* 功能: 讀取溫度的低層驅(qū)動模塊
* 調(diào)用: IIC_START,SendByte,Send_BIT9RW,IIC_ACK,ReceiveTowByte
* 輸入: uint *p
* 返回值: 操作標(biāo)志
***********************************************************************/
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
* 說明:
* 功能: 讀模塊內(nèi)部的EEPROM
* 調(diào)用: IIC_START,SendByte,Send_BIT9RW,IIC_ACK,ReceiveTowByte
* 輸入: uchar Addr,uchar *p
* 返回值: 操作標(biāo)志
***********************************************************************/
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
* 說明:
* 功能: 寫模塊內(nèi)部的EEPROM
* 調(diào)用: IIC_START,SendByte,Send_BIT9RW,IIC_ACK
* 輸入: uchar Addr,uchar Data
* 返回值: 操作標(biāo)志
***********************************************************************/
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
* 說明:
* 功能: 讀超聲波測量到的距離數(shù)據(jù)
* 調(diào)用: IIC_START,SendByte,Send_BIT9RW,IIC_ACK,ReceiveTowByte
* 輸入: uuint *p
* 返回值: 操作標(biāo)志
***********************************************************************/
uchar Read_Ultra(uint *p)//讀超聲波測量到的距離數(shù)據(jù)
{
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轉(zhuǎn)換數(shù)據(jù)
* 調(diào)用: IIC_START,SendByte,Send_BIT9RW,IIC_ACK,ReceiveTowByte
* 輸入: uchar Channel(通道選擇1 - 4) ,uint *p
* 返回值: 操作標(biāo)志
***********************************************************************/
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
* 說明:
* 功能: 顯示溫度
* 調(diào)用: 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
* 說明:
* 功能: 顯示超聲波測量距離
* 調(diào)用: 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(0x30+Data[3]);//米
LCD_WRITE_DATA('.');
LCD_WRITE_DATA(0x30+Data[2]);//分米
LCD_WRITE_DATA(0x30+Data[1]);//厘米
LCD_WRITE_DATA(0x30+Data[0]);//毫米
LCD_WRITE_DATA('m');
}
}
/********************************************************************
* 名稱: EEPROM_Test
* 說明:
* 功能: 寫EEPROM測試
* 調(diào)用: 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
* 說明:
* 功能: 讀內(nèi)部AD測試
* 調(diào)用: Read_AD,HEX_TO_DEC,WR_DATA10
* 輸入: uchar Channel:通道選擇(1 - 4)
* 返回值: 無
***********************************************************************/
void AD_Test(uchar Channel)//讀內(nèi)部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]);
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -