#include <reg51.h>
#include <intrins.h>
#define OP_READ 0xal
#define OP_WRITE 0xa0
typedef unsigned char u8;
typedef unsigned int u16;
sbit SDA=P2^0;
sbit SCL=P2^1;
sbit DS1302=P2^4;
sbit LCD1602=P2^5;
u8 code display[]=
{
0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,
0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE,0xFF
}
void delay1ms()
{
u8 i, j;
i = 12;
j = 168;
do
{
while (--j);
} while (--i);
}
void delaynms(u8 n)
{
u8 i;
for(i=0;i<n;i++)
delay1ms();
void start()//开始位
{
SDA=1;//sda初始化要求是高电平
SCL=1;//数据开始传送scl要高电平
_nop_();
_nop_();
_nop_();
_nop_();
SDA=0;//sda下降意味着开始
_nop_();
_nop_();
_nop_();
_nop_();
SCL=0;//意味着数据开始传输
}
void stop()//停止位
{
SDA=0;//sda初始化要求是低电平
SCL=1;//数据开始传送scl要高电平
_nop_();
_nop_();
_nop_();
_nop_();
SDA=1;//sda上升认为是结束信号
_nop_();
_nop_();
_nop_();
_nop_();
SCL=0;
SDA=0;
}
unsigned char readdate()
//从AT24C 移入数据到MCU
{
u8 i;
u8 x;
for(i=0;i<8;i++)
{
SCL=1;
x<<=1;//将x中的各二进制左移一位
X|=(u8)SDA;//将sda中的数据按位或存到x中
SCL=0;//在scl下降沿读出数据
}
return(x);
}
bit writecurrent(u8 y)
{
u8 i;
bit ack_bit;
for(i=0;i<8;i++)
{
SDA=(bit)(y&0x80);
_nop_();
SCL=1;
_nop_();
_nop_();
SCL=0;
y<<=1;
}
SDA=1;
_nop_();
_nop_();
SCL=1;
_nop_();
_nop_();
_nop_();
_nop_();
ack_bit=SDA;
SCL=0;
return ack_bit;
}
void writeset(u8 add,u8 dat)
{
start();
writecurrent(OP_WRITE);
writecurrent(add);
writecurrent(dat);
stop();
delaynms(20);
}
u8 readset(u8 set_addr)
{
start();
writecurrent(OP_WRITE);
writecurrent(set_addr);
return(readcurrent());
}
main (void)
{
u8 i;
DS1302=0;
LCD1602=0;
SDA=1;
SCL=1;
for(i=0;i<16;i++)
{
writeset(i,display[i]);
}
for(i=0;i<16;i++)
{
P1=readset(i);
delaynms(200);
delaynms(200);
}
}
|