分享刚刚调试成功的RX8025T的读写代码

2020-01-13 18:22发布

本帖最后由 wxdn 于 2019-5-22 04:46 编辑

调试了好久没有调出来,实在是没有办法,用STC8的内置IIC,一次通过了,后来才在STC15里面用端口模拟出来,分享给大家。
/**********************************************************************
主芯片:STC15W4K32S4   QFP-48  芯片供电:3.30V  时钟:内置11.0592M  工程建立日期:2019.05.22                       
**********************************************************************/
#include"RX8025.h"
#include "STC15F2K60S2.H"
#include"delays.h"
sbit scl  = P2^4;//
sbit sda  = P2^5;//
/*                 秒        分钟      小时      日       月      星期    */
unsigned char TIM_Second,TIM_Minute,TIM_Hour,TIM_Date,TIM_Month,TIM_Week;
unsigned int TIM_Year; //年

void Delay_us(unsigned char i)
{
    while(i--);
}

void start(void)
{
    scl=1;
        Delay_us(5);
        sda=0;   
    Delay_us(5);
        scl=0;
}

void stop(void)
{
    sda=0;
    Delay_us(5);
    scl=1;
    Delay_us(5);
    sda=1;
    Delay_us(5);
}

void iicinit(void)
{
        scl=1;
        Delay_us(5);
        sda=1;       
}

unsigned char iicwr_byte(unsigned char dat)//写数据
{
        unsigned char i;
        sda=1;       
        for(i=0;i<8;i++)
        {
                scl=0;
                Delay_us(2);
                if(dat&0x80)
                {
                        sda=1;
                }
                else
                {
                        sda=0;
                }

                dat<<=1;               
                scl=1;
                Delay_us(5);
        }
        scl=0;
        Delay_us(5);
        sda=1;
        scl=1;
        Delay_us(5);
        scl=0;
        i=sda;
        return i;
}

unsigned char iicre_byte(unsigned char x)//读数据 x:1为ACK,x:0为NACK
{
        unsigned char i,dat;
        sda=1;
        for(i=0;i<8;i++)
        {
                scl=0;
                Delay_us(2);
                dat<<=1;
                dat|=sda;
                scl=1;
                Delay_us(5);
        }
        scl=0;       
        if(x)
        {
                sda=0;       
        }
        else
        {
                sda=1;
        }
        Delay_us(5);
        scl=1;
        Delay_us(5);
        scl=0;
        return dat;
}

void READ_TIM(void)
{
        start();
        iicwr_byte(0x64);
        Delay_us(50);
        iicwr_byte(0x00);
        Delay_us(50);
        start();                  
        iicwr_byte(0x65);
        Delay_us(50);
        TIM_Second=iicre_byte(1);
        Delay_us(50);
        TIM_Minute=iicre_byte(1);
        Delay_us(50);
        TIM_Hour=iicre_byte(0);
        Delay_us(50);
        stop();                       
}

void READ_Date(void)
{
        start();                 
        iicwr_byte(0x64);  
        Delay_us(50);
        iicwr_byte(0x03);
        Delay_us(50);
        start();                  
        iicwr_byte(0x65);  
        Delay_us(50);
        TIM_Week=iicre_byte(1);
        Delay_us(50);
        TIM_Date=iicre_byte(1);
        Delay_us(50);
        TIM_Month=iicre_byte(0);
        Delay_us(50);
        stop();
}
void SET_YEAR(unsigned char YE)
{
        start();                  
        iicwr_byte(0x64);  
        Delay_us(50);
        iicwr_byte(0x06);
        Delay_us(50);
        iicwr_byte(YE);
        Delay_us(50);
        stop();
}
void SET_DAY(unsigned char M,unsigned char D)
{
        start();                  
        iicwr_byte(0x64);  
        Delay_us(50);
        iicwr_byte(0x04);  
        Delay_us(50);
        iicwr_byte(D);  
        Delay_us(50);
        iicwr_byte(M);  
        Delay_us(50);
        stop();
}
void SET_WEEK(unsigned char W)
{
        start();                  
        iicwr_byte(0x64);  
        Delay_us(50);
        iicwr_byte(0x03);  
        Delay_us(50);
        iicwr_byte(W);
        Delay_us(50);
        stop();
}
void SET_TIME(unsigned char H,unsigned char M,unsigned char S)
{
        start();                  
        iicwr_byte(0x64);
        Delay_us(50);
        iicwr_byte(0x00);
        Delay_us(50);
        iicwr_byte(S);  
        Delay_us(50);
        iicwr_byte(M);
        Delay_us(50);
        iicwr_byte(H);
        Delay_us(50);
        stop();
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。