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

📄 pub_func.c

📁 单相多功能代码,计量芯片采用ADE7737做为计量,SPI通讯,仅供参考,不得用于商业
💻 C
字号:
#include "pub_func.h"
#include "i2c.h"

void _delay(unsigned short t)
{
    while(t--);
}

/* clear watch-dog
*/
void _clr_wdt(void)
{
}

/* judge data
*/
unsigned char is_data(unsigned char *buff,unsigned char data,unsigned char len)
{
    unsigned char ii;

    for(ii=0;ii<len;ii++)
    {
        if(buff[ii]!=data)
        return ERROR;
    }
    return OK;
}

/* judge data
*/
unsigned char is_equal(unsigned char *buff1,unsigned char *buff2,unsigned char len)
{
    unsigned char ii;

    for(ii=0;ii<len;ii++)
    {
        if(buff1[ii]!=buff2[ii])
        return ERROR;
    }
    return OK;
}

/* check sum
*/
unsigned char  sys_do_checksum(unsigned char *ptr, unsigned char len)
{
    unsigned char sum = 0,ii;
    
    //length
    for(ii=0;ii<len;ii++)
    {
        sum += *(ptr ++);
    }
    
    return sum;
}

/* fine item
*/
unsigned char find_item(const unsigned char *item_table,unsigned char item)
{
    unsigned char i=0;

    while(*(item_table+i)!=ERROR)
    {
        if(*(item_table+i)==item)
        {
            return i;
        }
        i++;
    }
    return ERROR;
}

/******************************************
* 十六进制转BCD码(1字节转换)
******************************************/
unsigned char Hex2BcdChar(unsigned char hex)
{
    return((hex%10)|(((unsigned char)(hex/10))<<4));
}

/******************************************
* BCD码转十六进制(1字节转换)
******************************************/
unsigned char Bcd2HexChar(unsigned char bcd)
{
    return((bcd>>4)*10+(bcd&0x0F));
}

/******************************************
* 十六进制转BCD码
******************************************/
unsigned short Hex2BcdShort(unsigned short hex)
{
    unsigned short temp;
    unsigned short ret;
    unsigned char ii;

    ret=0;
    for(ii=0;ii<4;ii++)
    {
        ret>>=4;
        temp=hex%10;
        temp<<=12;
        ret|=temp;
        hex=hex/10;
    }
    return(ret);
}


/******************************************
* BCD码转十六进制
******************************************/
unsigned short Bcd2HexShort(unsigned short bcd)
{
    unsigned short temp;
    unsigned short ret;
    unsigned char ii;

    ret=0;
    for(ii=0;ii<4;ii++)
    {
        temp=bcd&0xF000;
        temp>>=12;
        ret=ret*10+temp;
        bcd<<=4;
    }
    return(ret);
}

/******************************************
* 十六进制转BCD码
******************************************/
unsigned long Hex2BcdLong(unsigned long hex)
{
    unsigned long temp;
    unsigned long ret;
    unsigned char ii;

    ret=0;
    for(ii=0;ii<8;ii++)
    {
        ret>>=4;
        temp=hex%10;
        temp<<=28;
        ret|=temp;
        hex=hex/10;
    }
    return(ret);
}

/******************************************
* BCD码转十六进制
******************************************/
unsigned long Bcd2HexLong(unsigned long bcd)
{
    unsigned long temp;
    unsigned long ret;
    unsigned char ii;

    ret=0;
    for(ii=0;ii<8;ii++)
    {
        temp=bcd&0xF0000000;
        temp>>=28;
        ret=ret*10+temp;
        bcd<<=4;
    }
    return(ret);
}

/******************************************
* 读取数据数量信息
*
* 参数说明:
* (1)addr----读取的E2prom地址
* (2)*data----保存读取的值
* (3)dmax----读取的值的最大范围
* (4)defaultval----如果读错了,则取默认值
******************************************/
unsigned char ReadBcdCountInfo(unsigned short addr,unsigned char * data,unsigned char dmax,unsigned char defaultval)
{
    FramRead(addr,data,1);
    // 由BCD码转为16进制
    *data=Bcd2HexChar(*data);

    // 如果不在有效范围内,则强制置为1
    if((*data==0)||(*data>=dmax))
    {
        *data=defaultval;
        return ERROR;
    }
    return OK;
}

/******************************************
* 计算校验和(取反)
******************************************/
unsigned long GetChkSumRvrs(unsigned char *data,unsigned char len)
{
    unsigned long sum=0;

    while(len-->0)
    {
        sum+=*(data+len);
    }
    return(~sum);
}

/******************************************
* 判断一个数组中的数据是否等于某个数字
******************************************/
unsigned char IsEqualSpecialData(unsigned char *src,unsigned char data,unsigned char len)
{
    do{
        if(*src!=data)
        {
            return(ERROR);
        }
        src++;
    }while(--len);
    return(OK);
}

/******************************************
* 比对两个数组中的数据
******************************************/
unsigned char IsEqual(unsigned char *src1,unsigned char * src2,unsigned char len)
{
    do{
        if(*src1!=*src2)
        {
            return(ERROR);
        }
        src1++;
        src2++;
    }while(--len);
    return(OK);
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -