本帖最后由 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();
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>