|
我做一個軟件時鐘,要的結(jié)果是當(dāng)板子斷電時吧時鐘存入EEProm 里,當(dāng)上電時要讀取EEprom的數(shù)據(jù),繼續(xù)斷電前的時鐘。
我的時鐘程序做好,沒有問題測試正常,我又寫了一個IIC的驅(qū)動,我測試后也沒有問題,EEPROM的數(shù)據(jù)可以正常讀寫, 但是我把iic程序加入時鐘里面,程序運(yùn)行就達(dá)不到我要的效果。
下面是iic 程序
#include
#include "delay.h"
#define uchar unsigned char
#define uint unsigned int
sbit scl=P2^1 ;
sbit sda=P2^0 ;
uchar shu,dat;
void start()
{
sda=1;
delay(5);
scl=1;
delay(5);
sda=0;
delay(5);
}
void stop()
{
sda=0;
delay(5);
scl=1;
delay(5);
sda=1;
delay(5);
}
void ask()
{
unsigned char i;
scl=1;
delay(5);
if(sda==1&&i<200) i++;
scl=0;
//delay(5)
}
void write_i2c(uchar date1)
{
uchar temp, x;
temp=date1;
for(x=0;x<8;x++)
{
scl=0;
temp=temp<<1;
sda=CY;
scl=1;
delay(5);
}
scl=0;
delay(5);
sda=1;
delay(5);
}
uchar read_i2c()
{
uchar m,dat;
scl=0;
delay(5);
sda=1;
delay(5);
for(m=0;m<8;m++)
{
scl=1;
delay(5);
dat=(dat<<1)|sda;
scl=0;
delay(5);
}
return dat;
}
void write_datei2c(unsigned char address,unsigned char date)
{
start();
write_i2c(0xa0);
ask();
write_i2c(address);
ask();
write_i2c(date);
ask();
stop();
}
uchar read_datei2c(uchar address)
{
start();
write_i2c(0xa0);
ask();
write_i2c(address);
ask();
start();
write_i2c(0xa1);
ask();
read_i2c();
stop();
shu=dat;
return shu;
}
下面是時鐘程序的調(diào)用
void main()
{
init();
// write_sfm(5,30,20);
// delay(20);
shi=23;
fen=59;
miao=50;
shi=read_datei2c(0x20);
//fen=read_datei2c(0x21);
//miao=read_datei2c(0x22);
while(1)
{
delay(5);
if(t==20)
{
t=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)
{
shi=0;
}
write_sfm(shi,fen,miao);
}
write_sfm(shi,fen, miao);
}
write_sfm(shi,fen,miao);
}
keyscan();
write_datei2c(0x20,shi);
// write_datei2c(0x21,fen);
// write_datei2c(0x22,miao);
naoling();
guannaozhong();
}
}
|
|