?? i2c時(shí)鐘芯片程序.txt
字號(hào):
·PCF8583時(shí)鐘芯片程序(轉(zhuǎn)) -|落魂 發(fā)表于 2007-3-29 16:57:00
I2C時(shí)鐘芯片程序
/*****************************************
File: iic.h
Description:適于24MHz 晶振
Author: kassey@126.com
Date: July,7th,2005
*****************************************/
#i nclude <reg52.h> /*頭文件的包含*/
#i nclude <intrins.h>
#define _Nop() _nop_() /*定義空指令*/
/* 常,變量定義區(qū) */
/*端口位定義*/
sbit SDA=P1^0; /*模擬I2C數(shù)據(jù)傳送位*/
sbit SCL=P1^1; /*模擬I2C時(shí)鐘控制位*/
/*狀態(tài)標(biāo)志*/
bit ack; /*應(yīng)答標(biāo)志位*/
/*******************************************************************
起動(dòng)總線函數(shù)
函數(shù)原型: void Start_I2c();
功能: 啟動(dòng)I2C總線,即發(fā)送I2C起始條件.
********************************************************************/
void Start_I2c()
{
SDA=1; /*發(fā)送起始條件的數(shù)據(jù)信號(hào)*/
_Nop();
_Nop();
SCL=1;
_Nop(); /*起始條件建立時(shí)間大于4.7us,延時(shí)*/
_Nop();
_Nop();
_Nop();
_Nop();
_Nop(); /*起始條件建立時(shí)間大于4.7us,延時(shí)*/
_Nop();
_Nop();
_Nop();
_Nop();
SDA=0; /*發(fā)送起始信號(hào)*/
_Nop(); /* 起始條件鎖定時(shí)間大于4μs*/
_Nop();
_Nop();
_Nop();
_Nop();
_Nop(); /*起始條件建立時(shí)間大于4.7us,延時(shí)*/
_Nop();
_Nop();
_Nop();
_Nop();
SCL=0; /*鉗住I2C總線,準(zhǔn)備發(fā)送或接收數(shù)據(jù) */
_Nop();
_Nop();
_Nop();
_Nop();
}
/*******************************************************************
結(jié)束總線函數(shù)
函數(shù)原型: void Stop_I2c();
功能: 結(jié)束I2C總線,即發(fā)送I2C結(jié)束條件.
********************************************************************/
void Stop_I2c()
{
SDA=0; /*發(fā)送結(jié)束條件的數(shù)據(jù)信號(hào)*/
_Nop(); /*發(fā)送結(jié)束條件的時(shí)鐘信號(hào)*/
_Nop(); /*發(fā)送結(jié)束條件的時(shí)鐘信號(hào)*/
SCL=1; /*結(jié)束條件建立時(shí)間大于4μs*/
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
SDA=1; /*發(fā)送I2C總線結(jié)束信號(hào)*/
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
}
/*******************************************************************
字節(jié)數(shù)據(jù)傳送函數(shù)
函數(shù)原型: void SendByte(uchar c);
功能: 將數(shù)據(jù)c發(fā)送出去,可以是地址,也可以是數(shù)據(jù),發(fā)完后等待應(yīng)答,并對(duì)
此狀態(tài)位進(jìn)行操作.(不應(yīng)答或非應(yīng)答都使ack=0 假)
發(fā)送數(shù)據(jù)正常,ack=1; ack=0表示被控器無(wú)應(yīng)答或損壞。
********************************************************************/
void SendByte(uchar c)
{
uchar BitCnt;
for(BitCnt=0;BitCnt<8;BitCnt++) /*要傳送的數(shù)據(jù)長(zhǎng)度為8位*/
{
if((c<<BitCnt)&0x80)SDA=1; /*判斷發(fā)送位*/
else SDA=0;
_Nop();
_Nop();
SCL=1; /*置時(shí)鐘線為高,通知被控器開(kāi)始接收數(shù)據(jù)位*/
_Nop();
_Nop(); /*保證時(shí)鐘高電平周期大于4μs*/
_Nop();
_Nop();
_Nop();
_Nop();
_Nop(); /*保證時(shí)鐘高電平周期大于4μs*/
_Nop();
_Nop();
_Nop();
SCL=0;
}
_Nop();
_Nop();
_Nop();
_Nop();
SDA=1; /*8位發(fā)送完后釋放數(shù)據(jù)線,準(zhǔn)備接收應(yīng)答位*/
_Nop();
_Nop();
_Nop();
_Nop();
SCL=1;
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
if(SDA==1)ack=0;
else ack=1; /*判斷是否接收到應(yīng)答信號(hào)*/
SCL=0;
_Nop();
_Nop();
_Nop();
_Nop();
}
/*******************************************************************
字節(jié)數(shù)據(jù)傳送函數(shù)
函數(shù)原型: uchar RcvByte();
功能: 用來(lái)接收從器件傳來(lái)的數(shù)據(jù),并判斷總線錯(cuò)誤(不發(fā)應(yīng)答信號(hào)),
發(fā)完后請(qǐng)用應(yīng)答函數(shù)。
********************************************************************/
uchar RcvByte()
{
uchar retc;
uchar BitCnt;
retc=0;
SDA=1; /*置數(shù)據(jù)線為輸入方式*/
for(BitCnt=0;BitCnt<8;BitCnt++)
{
_Nop();
_Nop();
SCL=0; /*置時(shí)鐘線為低,準(zhǔn)備接收數(shù)據(jù)位*/
_Nop();
_Nop(); /*時(shí)鐘低電平周期大于4.7μs*/
_Nop();
_Nop();
_Nop();
_Nop();
_Nop(); /*時(shí)鐘低電平周期大于4.7μs*/
_Nop();
_Nop();
_Nop();
SCL=1; /*置時(shí)鐘線為高使數(shù)據(jù)線上數(shù)據(jù)有效*/
_Nop();
_Nop();
_Nop();
_Nop();
retc=retc<<1;
if(SDA==1)retc=retc+1; /*讀數(shù)據(jù)位,接收的數(shù)據(jù)位放入retc中 */
_Nop();
_Nop();
_Nop();
_Nop();
}
SCL=0;
_Nop();
_Nop();
_Nop();
_Nop();
return(retc);
}
/********************************************************************
應(yīng)答子函數(shù)
原型: void Ack_I2c(bit a);
功能:主控器進(jìn)行應(yīng)答信號(hào),(可以是應(yīng)答或非應(yīng)答信號(hào))
********************************************************************/
void Ack_I2c(bit a)
{
if(a==0)SDA=0; /*在此發(fā)出應(yīng)答或非應(yīng)答信號(hào) */
else SDA=1;
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
_Nop();
SCL=1;
_Nop();
_Nop(); /*時(shí)鐘低電平周期大于4μs*/
_Nop();
_Nop();
_Nop();
_Nop();
_Nop(); /*時(shí)鐘低電平周期大于4μs*/
_Nop();
_Nop();
_Nop();
SCL=0; /*清時(shí)鐘線,鉗住I2C總線以便繼續(xù)接收*/
_Nop();
_Nop();
_Nop();
_Nop();
}
/*******************************************************************
向有子地址器件發(fā)送字節(jié)數(shù)據(jù)函數(shù)
函數(shù)原型: bit ISendByte(uchar sla,ucahr c);
功能: 從啟動(dòng)總線到發(fā)送地址,數(shù)據(jù),結(jié)束總線的全過(guò)程,從器件地址sla.
如果返回1表示操作成功,否則操作有誤。
注意: 使用前必須已結(jié)束總線。
********************************************************************/
bit ISendByte(uchar sla,uchar suba,uchar c)
{
Start_I2c(); /*啟動(dòng)總線*/
SendByte(sla); /*發(fā)送器件地址*/
if(ack==0)return(0);
SendByte(suba); /*發(fā)送器件地址*/
if(ack==0)return(0);
SendByte(c); /*發(fā)送數(shù)據(jù)*/
if(ack==0)return(0);
Stop_I2c(); /*結(jié)束總線*/
return(1);
}
/*******************************************************************
向有子地址器件讀字節(jié)數(shù)據(jù)函數(shù)
函數(shù)原型: bit IRcvByte(uchar sla,ucahr *c);
功能: 從啟動(dòng)總線到發(fā)送地址,讀數(shù)據(jù),結(jié)束總線的全過(guò)程,從器件地
址sla,返回值在c.
如果返回1表示操作成功,否則操作有誤。
注意: 使用前必須已結(jié)束總線。
********************************************************************/
uchar IRcvByte(uchar sla,uchar suba)
{
uchar c;
Start_I2c(); /*啟動(dòng)總線*/
SendByte(sla); /*發(fā)送器件地址*/
if(ack==0)return(0);
SendByte(suba); /*發(fā)送子器件地址*/
if(ack==0)return(0);
Start_I2c();
SendByte(sla+1); /*發(fā)讀器件地址*/
if(ack==0)return(0);
c=RcvByte(); /*讀取數(shù)據(jù)*/
Ack_I2c(1); /*發(fā)送非就答位*/
Stop_I2c(); /*結(jié)束總線*/
return c;
}
/* 完畢 */
#i nclude<iic.h>
#i nclude<lcd.h>
#define PCF8583 0xa0
#define PCF8583_Ctr 0x00
#define Sen 0x02
#define Min 0x03
#define Hour 0x04
sbit SA=P1^2;sbit SB=P1^3;sbit SC=P1^4;
/*
111 null
110 cs1,TLC5620
101 cs2
100 ad0820
011 da7528
010 ram
001 rom
000 8155
*/
#define GAL(sa,sb,sc) {SA=sa;SB=sb;SC=sc;}
void main()
{
uchar sen;
uchar min;
uchar hour;
GAL(0,0,0);
COM=0x02;
LCDInittest();
ISendByte(PCF8583,PCF8583_Ctr,0x00);
/*************************************************************************
NOTE: 向分0x03,向秒0x02寫入0 ,向hour寫入0x00;
*************************************************************************/
ISendByte(PCF8583,Sen,0x00);
ISendByte(PCF8583,Min,0x19);
ISendByte(PCF8583,Hour,0x10);
PutStr(0,0," 北京時(shí)間: ");
PutStr(1,1,"時(shí)");
PutStr(1,3,"分");
PutStr(1,5,"秒");
PutStr(3,0,"西安火車站歡迎您");
while(1)
{
sen=IRcvByte(PCF8583,Sen);
min=IRcvByte(PCF8583,Min);
hour=IRcvByte(PCF8583,Hour);
SendCMD(0x90);
SendData(((hour>>4)&0x0f)+0x30);
SendData((hour&0x0f)+0x30);
SendCMD(0x92);
SendData(((min>>4)&0x0f)+0x30);
SendData((min&0x0f)+0x30);
SendCMD(0x94);
SendData(((sen>>4)&0x0f)+0x30);
SendData((sen&0x0f)+0x30);
}
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -