?? rtc._h
字號:
#ifndef uchar
#define uchar unsigned char
#define uint unsigned int
#endif
#define SD2303 0x64 //SD2303器件IIC識別碼
uchar F_Flag;
uchar time[15]={2,0,0,4,1,2,2,7,1,1,7,3,0,5,0};
uchar Set_Time[7]={0x50,0x30,0x17,0x01,0x27,0x12,0x04};
// 2004-12-27 Monday 17-30-50
uchar SD2303_Controller1=0x00;//禁止中斷
uchar SD2303_Controller2=0x20;//24小時制;
void NOPNOP(uchar i)
{for(;i!=0;i--) NOP();}
//sbit SCL=PC^0; //定義SD2303IIC時鐘線
void SetSCL(uchar i)
{if(i==1) PORTC=PORTC|0x01;
else PORTC=PORTC&0xfe;}
//sbit SDA=PC^1; //定義SD2303IIC數據線
void SetSDA(uchar i)
{if(i==1) PORTC=PORTC|0x02;
else PORTC=PORTC&0xfd;}
//sbit INTRB=PD^6; //定義SD2303中斷線A
//sbit INTRA=P1^7; //定義SD2303中斷線B
void Start() //IIC總線開始
{SetSDA(1);//SDA=1; //條件:SCL高電平時SDA的下降沿
SetSCL(1);//SCL=1;
NOPNOP(50);//while(SCL==0){;} //等待時鐘信號變成高電平以確??偩€開始
//_nop_();
//_nop_();
SetSDA(0);//SDA=0;
NOPNOP(50);
//_nop_();
//_nop_();
//_nop_();
//_nop_();
SetSCL(0);// SCL=0; //拉低時鐘信號線
}
void Stop() //IIC總線結束
{SetSDA(0);//SDA=0; //條件:SCL為高電平時SDA的上升沿
SetSCL(1);//SCL=1;
NOPNOP(50);//while(SCL==0){;} //等待時鐘信號變成低電平以確??偩€結束
// _nop_();
// _nop_();
SetSDA(1);//SDA=1;
NOPNOP(50);
//_nop_();
//_nop_();
//_nop_();
//_nop_();
SetSCL(0);//SCL=0;
}
void Ack() //IIC總線應答
{SetSDA(0);//SDA=0; //應答方式:讀完一個字節后將SDA線拉低,即應答0
SetSCL(1);//SCL=1;
NOPNOP(50);
//_nop_();
//_nop_();
//_nop_();
//_nop_();
SetSCL(0);//SCL=0;
SetSDA(1);//SDA=1;
}
void Nack() //IIC總線應答
{SetSDA(1);//SDA=1; //應答方式:讀完所要求的字節數據后將SDA線拉高,即
SetSCL(1);//SCL=1; //應答1,為結束IIC總線操作做準備
NOPNOP(50);
//_nop_();
//_nop_();
//_nop_();
//_nop_();
SetSCL(0);//SCL=0;
SetSDA(0);//SDA=0;
}
void Check_Ack() //檢查IIC器件應答情況
{SetSDA(1);//SDA=1;
SetSCL(1);//SCL=1;
F_Flag=0;//F0=0;
DDRC=DDRC&0xfd; //設置SDA為輸入
//if(SDA==0)
if((PINC&0x02)==0)
{
SetSCL(0);//SCL=0;
NOPNOP(50);
//_nop_();
//_nop_();
//_nop_();
//_nop_();
}
else
{
F_Flag=1;//F0=1;
SetSCL(0);//SCL=0;
NOPNOP(50);
//_nop_();
//_nop_();
//_nop_();
//_nop_();
}
DDRC=DDRC|0x02; //重新設置SDA為輸出
}
void Write_Bit0() //寫1bit數據:0
{SetSDA(0);//SDA=0;
SetSCL(1);//SCL=1;
NOPNOP(50);
//_nop_();
//_nop_();
//_nop_();
//_nop_();
SetSCL(0);//SCL=0;
}
void Write_Bit1() //寫1bit數據:1
{SetSDA(1);//SDA=1;
SetSCL(1);//SCL=1;
NOPNOP(50);
//_nop_();
//_nop_();
//_nop_();
//_nop_();
SetSCL(0);//SCL=0;
SetSDA(0);//SDA=0;
}
void Write_Byte(uchar Data) //寫一字節數據:Data:要寫入的數據
{uchar i;
for(i=0;i<8;i++)
{if((Data&0x80)>0) //傳輸位從高位到低位,先傳最高位
Write_Bit1();
else
Write_Bit0();
Data<<=1; //數據左移
}
}
uchar Read_Byte() //讀一字節數據:返回值即讀的數據
{uchar nn=0xff; //nn:初始化為0xff,讀入的數據也放在此
uchar j;
for (j=0;j<8;j++)
{SetSDA(1);//SDA=1;
SetSCL(1);//SCL=1;
DDRC=DDRC&0xfd;//設置SDA為輸入線
//if(SDA==0) //數據讀出,若是0則移位;若是1則與0x01或
if((PINC&0x02)==0)
{nn<<=1;
nn=(nn&0xfe);
SetSCL(0);}//SCL=0;}
else
{nn<<=1;
nn=(nn|0x01);
SetSCL(0);}//SCL=0;}
}
DDRC=DDRC|0x02;//設置SDA為輸出線
return(nn); //返回讀出的字節
}
//********************寫N個字節子程序************************//
//函數參數說明:
//Slave:IIC器件地址,如上文定義的SD2303
//Address:起始地址
//Array:讀數據存放的數組
//Number:讀取的字節數
void Write_Nbyte(uchar Slave,uchar Address,uchar *Array,uchar Number)
{uchar k;
writ:do //開始->寫IIC器件地址->檢查應答位
{Start();
Write_Byte(Slave);
Check_Ack();
}while(F_Flag==1);//while(F0==1);
do
{Write_Byte(Address<<4); //送起始地址->檢查應答位
Check_Ack();
}while(F_Flag==1);//while(F0==1);
for(k=0;k<Number;k++) //寫Number個數據
{Write_Byte(*Array);
Array++;
Check_Ack(); //檢查應答位
//if(F0==1) goto writ;
} //若任意一個應答位不對,重新開始整個過程
Stop(); //停止信號
}
//***********寫一個字節******************************//
void Write_1byte(uchar Slave,uchar Address,uchar Data)
{writ:do //開始->寫IIC器件地址->檢查應答位
{Start();
Write_Byte(Slave);
Check_Ack();
}while(F_Flag==1);//while(F0==1);
do
{Write_Byte(Address<<4); //送起始地址->檢查應答位
Check_Ack();
}while(F_Flag==1);//while(F0==1);
Write_Byte(Data);
Check_Ack(); //檢查應答位
// if(F0==1) goto writ; //若應答位不對,重新開始整個過程
Stop(); //停止信號
}
//***************讀N個字節子程序*********************//
//函數參數說明:
//Slave:IIC器件地址,如上文定義的SD2303
//Address:起始地址
//Array:讀數據存放的數組
//Number:讀取的字節數
void Read_Nbyte(uchar Slave,uchar Address,uchar *Array,uchar Number)
{uchar data0,x;
//第一步:開始信號->寫IIC器件地址->檢查應答位
do{Start();Write_Byte(Slave);Check_Ack();}while(F_Flag==1);//while(F0==1);
//第二步:寫起始地址->檢查應答位
do {Write_Byte(Address<<4);Check_Ack();}while(F_Flag==1);// while(F0==1);
//第三步:開始信號->寫IIC器件地址+1(表示讀)->檢查應答位
do{Start();Write_Byte(Slave+1);Check_Ack();}while(F_Flag==1);//while(F0==1);
//第四步:讀N字節,每讀完一字節發一個Ack應答,最后一字節發Nack
for(x=0;x<Number;x++)
{data0=Read_Byte();*Array=data0;Array++;
if(x<(Number-1)) { Ack(); }}
Nack();
//第五步:發停止信號,結束讀操作
Stop();
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -