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

📄 function.c

📁 本代码以AVR单片机为主控制器
💻 C
📖 第 1 页 / 共 2 页
字号:
/************************** (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 + -