📄 function.c
字号:
/************************** (C) 2005 485表项目 *******************************
项 目: 485表项目
编译环境 : IARAVR 编译器 4.10A
模块名称 : function.c
版 本 : V 1.0
建立时间 : 2008-5-21 0:12
修改时间 : 2008-5-21 0:12
作 者 : haoyuyun
-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
功能描述 : 公共处理函数
-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-
修改 :
******************************************************************************/
//#ifdef _USE_I2C
//-----------------------------------------------------------------------------
// I2C 总线操作函数定义
void IO_SDA0(void) { DDRC|=(1<<IO_SDA); ShortDelay();}
void IO_SDA1(void) { DDRC&=(~(1<<IO_SDA)); ShortDelay();}
void IO_SCL0(void) { DDRC|=(1<<IO_SCL); ShortDelay();}
void IO_SCL1(void) { DDRC&=(~(1<<IO_SCL)); ShortDelay();}
//void IO_SDAA0(void) { DDRC|=(1<<IO_SDAA);_NOP();} // ShortDelay();}
//void IO_SDAA1(void) { DDRC&=(~(1<<IO_SDAA));_NOP();} //ShortDelay();}
//*****************************************************************************
// 函数名称 : void StartI2c(); *
// 输入输出 : None *
// 描述 : 起动总线函数 *
// 注释 : *
//*****************************************************************************
void StartI2c(void)
{
CLRBIT(PORTC,IO_SCL);
CLRBIT(PORTC,IO_SDA);
ShortDelay();
IO_SCL0(); // 延时>5uS
IO_SDA1(); // 延时>5uS
IO_SCL1(); // 延时>5uS
IO_SDA0(); // 延时>5uS
}
//*****************************************************************************
// 函数名称 : void StopI2c(); *
// 输入输出 : None *
// 描述 : 结束总线函数 *
// 注释 : *
//*****************************************************************************
void StopI2c(void)
{
INT8U retry_cnt;
retry_cnt = 0;
RepeatStop:
CLRBIT(PORTC,IO_SCL);
CLRBIT(PORTC,IO_SDA);
ShortDelay();
IO_SCL0(); // 延时>5uS
IO_SDA0(); // 延时>5uS
IO_SCL1(); // 延时>5uS
IO_SDA1(); // 延时>5uS
if(CHKBIT(PINC,IO_SDA)==0)
{
if(++retry_cnt<200) // 重试停止I2C
{
goto RepeatStop;
}
else
{
return; // I2C错误
}
}
}
//*****************************************************************************
// 函数名称 : void AckI2c(bit a); *
// 输入输出 : a: 应答控制位,1:应答 0:非应答 *
// 描述 : 应答子函数 *
// 注释 : *
//*****************************************************************************
void AckI2c(INT8U Ack)
{
ShortDelay();
if( Ack == 0 )
IO_SDA0();
else
IO_SDA1(); // 延时>5uS
IO_SCL1(); // 延时>5uS
IO_SCL0(); // 延时>5uS
IO_SDA1(); // 延时>5uS
}
//*****************************************************************************
// 函数名称 : void WriteByteI2c(INT8U c); *
// 输入输出 : c *
// 描述 : 字节数据写函数 *
// 注释 : *
//*****************************************************************************
void WriteByteI2c(INT8U c)
{
INT8U BitCnt;
for( BitCnt = 0 ; BitCnt < 8 ; BitCnt ++ )
{
IO_SCL0(); // 延时>5uS
if( (( c << BitCnt ) & 0x80 ) == 0x80 )
{
IO_SDA1();
}
else
{
IO_SDA0();
}
IO_SCL1(); // 延时>5uS
IO_SCL0(); // 延时>5uS
}
IO_SDA1(); // 延时>5uS
IO_SCL1(); // 延时>5uS
}
//*****************************************************************************
// 函数名称 : INT8U ReadByteI2c(); *
// 输入输出 : c *
// 描述 : 字节数据读函数 *
// 注释 : *
//*****************************************************************************
INT8U ReadByteI2c(void)
{
INT8U retc;
INT8U BitCnt;
IO_SDA1(); // 延时>5uS
for( BitCnt = 0 ; BitCnt < 8 ; BitCnt ++ )
{
IO_SCL0(); // 延时>5uS
IO_SCL1(); // 延时>5uS
retc <<= 1;
if( CHKBIT(PINC,IO_SDA) )
{
retc += 1;
}
}
IO_SCL0(); // 延时>5uS
return( retc );
}
void mIICReadPage(INT8U * DataPointer,INT8U DataLength, INT8U SlaveAddress, INT8U SubAddress)
{
//unsigned char BusStatus;
StartI2c();
WriteByteI2c(SlaveAddress);
AckI2c(0);
// WriteByteI2c(0x00);
//SlaveAck();
WriteByteI2c(SubAddress);
AckI2c(0);
StartI2c();
WriteByteI2c(++SlaveAddress);
AckI2c(0);
if ((--DataLength)!=0)
{
for(;DataLength>0;DataLength--)
{
*DataPointer++=ReadByteI2c();
AckI2c(0);
}
}
*DataPointer=ReadByteI2c();
AckI2c(1);
StopI2c();
}
void mIICWritePage(INT8U * DataPointer, INT8U DataLength,INT8U SlaveAddress, INT8U SubAddress)
{
StartI2c();
WriteByteI2c(SlaveAddress);
AckI2c(0);
WriteByteI2c(SubAddress);
AckI2c(0);
for(;DataLength>0;--DataLength)
{
WriteByteI2c(* DataPointer++);
AckI2c(0);
}
StopI2c();
}
#ifdef _USE_LCD_DISPLAY
//*****************************************************************************
// 函数名称 : void Write6024(void) *
// 输入输出 : *
// 描述 : 向HL6024发送多字节数据 *
// 注释 : *
//*****************************************************************************
void Write6024(void)
{
INT8U cnt;
StopI2c ();
StartI2c();
for(cnt=0;cnt<17;cnt++) // 12 RAM 字节 + 5控制字节 共17字节
{
WriteByteI2c(GeneralVar.Buff[cnt]); // 连续写入控制字节和数据
}
StopI2c ();
}
#endif
//*****************************************************************************
// 函 数 : void EEPMove(INT16U sourse,INT16U taget,INT8U cnt) *
// *
// 功 能 : EEPROM 数据搬移程序 *
// 注 释 : *
//*****************************************************************************
void EEPMove(INT16U sourse,INT16U taget,INT8U cnt)
{
CopyEEPToRam(sourse,GeneralVar.Buff,cnt);
CopyRamToEEP(taget,GeneralVar.Buff,cnt);
}
//*****************************************************************************
// 函 数 : void EEPClear(INT16U start,INT8U cnt) *
// *
// 功 能 : EEPROM 清零 *
// 注 释 : *
//*****************************************************************************
void EEPClear(INT16U start,INT8U cnt)
{
INT8U i;
GeneralVar.Buff[0] = 0;
for(i=0;i<cnt;i++)
{
CopyRamToEEP(start+i,GeneralVar.Buff,1);
}
}
//*****************************************************************************
// 函 数 : void RamFill(INT8U *p,INT8U filldata,INT8U char cnt) *
// *
// 功 能 : EEPROM 清零 *
// 注 释 : *
//*****************************************************************************
void RamFill(INT8U *p,INT8U filldata,INT8U cnt)
{
for(;cnt>0;cnt--)
{
*p = filldata;
p++;
}
}
/*
***************************************************************************************************
函数名称 : void WriteEEprom(INT16U StrtAdd,INT8U *BuffP,INT8U Num)
输入输出 : StrtAdd: *BuffP Num
描 述 : 写入数据到内部EEPROM
注 释 : 本函数主要是把要写的数据放入缓冲区
***************************************************************************************************
河南V1.1改动:EEP写增加编程状态和写保护状态区域限制.
*/
void CopyRamToEEP(INT16U StrtAdd,INT8U *BuffP,INT8U Num)
{
// #ifdef _USE_M8
// _CLI(); // 全局中断禁止
// for(;Num>0;Num--)
// {
// while(CHKBIT(EECR,EEWE)); // 等待写完
// EEAR = StrtAdd; // 写入EEP起始地址
// EEDR = *BuffP; // 待写数据放入缓冲区
// if((StrtAdd >= 0x80)&&(StrtAdd <= 0xFF)) // 编程区域EEP检测编程标志
// {
// if(ComVar.ProgEn != 0xAA) // 编程状态检测
// {
// return;
// }
// }
/*
else
{
if(GeneralVar.WP_AA != 0xAA) // 写保护检测
{
return;
}
}
// */
// SETBIT(EECR,EEMWE); // 置位写EEP控制位
// SETBIT(EECR,EEWE);
// BuffP ++;
// StrtAdd ++;
// }
// EEAR = 0; // 清零EEP地址寄存器
// while(CHKBIT(EECR,EEWE)); // 等待写完
// _SEI(); // 全局中断允许
//---------------------------------------------------------------------------------------------
// #else
_CLI(); // 全局中断禁止
for(;Num>0;Num--)
{
while(CHKBIT(EECR,EEPE)); // 等待写完
EEAR = StrtAdd; // 写入EEP起始地址
EEDR = *BuffP; // 待写数据放入缓冲区
if((StrtAdd >= 0x80)&&(StrtAdd <= 0xFF)) // 编程区域EEP检测编程标志
{
if(ComVar.ProgEn != 0xAA) // 编程状态检测
{
return;
}
}
/*
else
{
if(GeneralVar.WP_AA != 0xAA) // 写保护检测
{
return;
}
}
*/
SETBIT(EECR,EEMPE); // 置位写EEP控制位
SETBIT(EECR,EEPE);
BuffP ++;
StrtAdd ++;
}
EEAR = 0; // 清零EEP地址寄存器
while(CHKBIT(EECR,EEPE)); // 等待写完
_SEI(); // 全局中断允许
//#endif
}
//*****************************************************************************
// 函数名称 : void CopyEEPToRam(INT16U StrtAdd,INT8U *BuffP,INT8U Num) *
// 输入输出 : StrtAdd: *BuffP Num *
// 描述 : 从内部EEPROM读出Num个字节的数据 *
// 注释 : *
//*****************************************************************************
void CopyEEPToRam(INT16U StrtAdd,INT8U *BuffP,INT8U Num)
{
EEAR = StrtAdd; // 将起始数据在EEP地址写入寄存器
for(;Num>0;Num--)
{
SETBIT(EECR,EERE); // 置位EEP读控制位
*BuffP = EEDR; // 读出一个字节的数据
BuffP ++;
EEAR ++;
}
EEAR = 0; // 清零EEP地址寄存器
}
//*****************************************************************************
// 函数 : void Delay10ms(INT8U Cnt) *
// *
// 功能 : 长时间定时程序 *
// 注释 : 定时时间 Cnt×1000 cycle *
//*****************************************************************************
void Delayms(INT8U cnt)
{
INT8U j;
for (;cnt>0;cnt--)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -