#include<stc15f2k60s2.h>
#include<intrins.h>
#define uchar unsigned char
uchar TAB[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0xaa,0xff};
uchar YI,ER,SAN,SI,WU,LIU,QI,BA;
#define DELAY_TIME 5
#define SlaveAddrW 0xA0
#define SlaveAddrR 0xA1
sbit SCL=P2^0;
sbit SDA=P2^1;
void IIC_Delay(unsigned char i);
void IIC_Stop(void);
void Delay1ms() //@11.0592MHz
{
unsigned char i, j;
_nop_();
_nop_();
_nop_();
i = 11;
j = 190;
do
{
while (--j);
} while (--i);
}
void IIC_Delay(unsigned char i) //IIC通信延時程序
{
do{_nop_();}
while(i--);
}
void IIC_Start(void) //iic啟動程序
{
SDA = 1;
SCL = 1;
IIC_Delay(DELAY_TIME);
SDA = 0;
IIC_Delay(DELAY_TIME);
SCL = 0;
}
void IIC_Stop(void) //iic停止
{
SDA = 0;
SCL = 1;
IIC_Delay(DELAY_TIME);
SDA = 1;
IIC_Delay(DELAY_TIME);
}
void IIC_SendAck(bit ackbit) //iic響應
{
SCL = 0;
SDA = ackbit; // 0:應答,1:非應答
IIC_Delay(DELAY_TIME);
SCL = 1;
IIC_Delay(DELAY_TIME);
SCL = 0;
SDA = 1;
IIC_Delay(DELAY_TIME);
}
bit IIC_WaitAck(void) //iic等待應答
{
bit ackbit;
SCL = 1;
IIC_Delay(DELAY_TIME);
ackbit = SDA;
SCL = 0;
IIC_Delay(DELAY_TIME);
return ackbit;
}
void IIC_SendByte(unsigned char byt) //發送數據
{
unsigned char i;
for(i=0; i<8; i++)
{
SCL = 0;
IIC_Delay(DELAY_TIME);
if(byt & 0x80) SDA = 1;
else SDA = 0;
IIC_Delay(DELAY_TIME);
SCL = 1;
byt <<= 1;
IIC_Delay(DELAY_TIME);
}
SCL = 0;
}
unsigned char IIC_RecByte(void) //iic讀取字節
{
unsigned char i, da;
for(i=0; i<8; i++)
{
SCL = 1;
IIC_Delay(DELAY_TIME);
da <<= 1;
if(SDA) da |= 1;
SCL = 0;
IIC_Delay(DELAY_TIME);
}
return da;
}
void iicwrite(uchar add,uchar dat)
{
IIC_Start();
// IIC_SendByte(0xa0); //啟動寫模式
IIC_SendByte(0x90); //AD轉換
IIC_SendAck(IIC_WaitAck());
IIC_SendByte(add);
IIC_SendAck(IIC_WaitAck());
IIC_SendByte(dat);
IIC_SendAck(IIC_WaitAck());
IIC_Stop();
}
uchar iicread(uchar add)
{
uchar temp;
IIC_Start();
//IIC_SendByte(0xa0);
IIC_SendByte(0x90);
IIC_SendAck(IIC_WaitAck());
IIC_SendByte(add);
IIC_Stop();
IIC_Start();
IIC_SendByte(0xa1); //啟動讀模式
//IIC_SendByte(0x91);
IIC_SendAck(IIC_WaitAck());
temp=IIC_RecByte(); //收回參數
IIC_Stop();
return temp;
}
void allinit()
{
P2=0X80;
P0=0XFF;
P2=0XA0;
P0=0X00;
P2=0XC0;
P0=0XFF;
P2=0XF0;
P0=0XFF;
}
void display1()
{
P2=0XC0;
P0=0X01;
P2=0XFF;
P0=TAB[YI];
Delay1ms();
P2=0XC0;
P0=0X02;
P2=0XFF;
P0=TAB[ER];
Delay1ms();
}
void display2()
{
P2=0XC0;
P0=0X04;
P2=0XFF;
P0=TAB[SAN];
Delay1ms();
P2=0XC0;
P0=0X08;
P2=0XFF;
P0=TAB[SI];
Delay1ms();
}
void display3()
{
P2=0XC0;
P0=0X10;
P2=0XFF;
P0=TAB[WU];
Delay1ms();
P2=0XC0;
P0=0X20;
P2=0XFF;
P0=TAB[LIU];
Delay1ms();
}
void display4()
{
P2=0XC0;
P0=0X40;
P2=0XFF;
P0=TAB[QI];
Delay1ms();
P2=0XC0;
P0=0X80;
P2=0XFF;
P0=TAB[BA];
Delay1ms();
}
void main()
{
uchar num;
allinit();
YI=11,ER=11;SAN=11;SI=11;WU=11;LIU=0;QI=0;BA=0;
iicwrite(0x00,0);
num=iicread(0x00);
//iicwrite(0x00,num+1); //AT24C02
while(1)
{
num=iicread(0x03);
LIU=num/100;QI=num%100/10;BA=num%10;
display1();
display2();
display3();
display4();
}
}
|