這個代碼是想用I2C總線,先把數據存到E2PROM中,然后通過I2C總線的讀功能把數據送到P0口,從而點亮數碼管,想法就是這,但是把代碼燒到51單片機中,結果卻出不來
跪求各位大俠幫忙,小弟在這里感激不盡!!!!!!!!!!!!!
#include<reg52.h>
char code table[]= {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x04,
0x00,0x46,0x40,0x06,0x0d};
sbit dula=P2^6;
sbit wela=P2^7;
sbit sda=P2^0; //數據線
sbit scl=P2^1; //時鐘線
char aa ,bb,temp,shi,ge;
void delay() //延時5微秒
{; ;}
void delay1(int z)
{
int x,y;
for(x=0;x<z;x++)
for(y=0;y<110;y++);
}
void start() //起始信號
{
sda=1;
delay();
scl=1;
delay();
sda=0;
delay();
}
void stop() //終止信號
{
sda=0;
delay();
scl=1;
delay();
sda=1;
delay();
}
void respons() //應答信號
{
char i;
scl=1;
delay();
while((sda==1)&&(i<250)) //等待應答 如果有應答或者一段時間后沒有應答就跳出
i++;
scl=0;
delay();
}
void init() //初始化
{
aa=0;
bb=0;
temp=0;
sda=1; //把總線打開
scl=1;
TMOD=0X01; //打開計數器0
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;
EA=1;
ET0=1;
}
void write_byte(char date) //讀取一個字節
{
char i,temp;
temp=date;
scl=0;
delay();
for(i=0;i<8;i++) //移動八位是一個字節
{
temp=temp<<1; //左移移位后 將最高位移到了CY當中
sda=CY; //將最高位送出去
delay();
scl=1;
delay();
scl=0;
delay();
}
sda=1; //釋放總線
delay();
}
char read_byte() //讀字節
{
char i,j,k;
scl=0;
delay();
sda=1;
delay();
for(i=0;i<8;i++)
{
scl=1;
delay();
j=sda;
k=(k<<1)|j;//將j給k八次 剛好k里面存著八個數據
scl=0;
delay();
}
return k;
}
void write_add(char address,char date) //在制定的位置寫數據
{
start();
write_byte(0xa0);//這是器件的地址 前四位固定 后三位是0 最后一個是0 表示往里面寫數據
respons();//寫完后等待應答
write_byte(address);//寫地址 器件內部存儲的地址
respons();
write_byte(date);//往里面寫數據
respons();
stop();
}
char read_add(char address)
{
char date;
start();
write_byte(0xa0);
respons();
write_byte(address);
respons();
start();
write_byte(0xa1);
respons();
date=read_byte();
stop();
return date;
}
void display(int shi,int ge)
{
/* P0=0X00;
P1=0x0e;
P0=table[bai];
delay(z); */
/* wela=1;
P0=0xfd;
wela=0;
delay1(1); */
//dula=1;
write_add(bb,table[shi]);
delay1(100);
dula=1;
P0=read_add(bb++);
dula=0;
delay1(1);
wela=1;
P0=0xfd;
wela=0;
delay1(1);
/* wela=1;
P0=0xfe;
wela=0;
delay1(1); */
//dula=1;
write_add(bb,table[ge]);
delay1(100);
dula=1;
P0=read_add(bb++);
dula=0;
wela=1;
P0=0xfe;
wela=0;
delay1(1);
}
void main()
{
init();
/* wela=1;
P0=0xfc;
wela=0; */
while(1)
{
if(aa==20)
{
aa=0;
temp++;
if(temp==100)
temp=0;
shi=temp/10;
ge=temp%10;
}
display( shi, ge);
/* write_add(23,table[]);
delay1(100);
P1=read_add(23); */
}
// while(1);
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
aa++;
}
已經解決了
謝謝大家了 大家么事可以看哈!
可以斷電存儲!!!!!!
#include<reg52.h>
char code table[]= {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f } ;
sbit dula=P2^6;
sbit wela=P2^7;
sbit sda=P2^0; //數據線
sbit scl=P2^1; //時鐘線
char aa ,bb,cc,temp,shi,ge,tt;
int read_add(char);
char read_byte();
void delay() //延時5微秒
{; ;}
void delay1(int z)
{
int x,y;
for(x=0;x<z;x++)
for(y=0;y<110;y++);
}
void start() //起始信號
{
sda=1;
delay();
scl=1;
delay();
sda=0;
delay();
}
void stop() //終止信號
{
sda=0;
delay();
scl=1;
delay();
sda=1;
delay();
}
void respons() //應答信號
{
char i;
scl=1;
delay();
while((sda==1)&&(i<250)) //等待應答 如果有應答或者一段時間后沒有應答就跳出
i++;
scl=0;
delay();
}
void init() //初始化
{
aa=0;
bb=0;
cc=1;
tt=read_add(23);
temp=tt;
ge= tt%10;
shi=tt/10;
// temp=0;
//sda=1; //把總線打開
// scl=1;
TMOD=0X01; //打開計數器0
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;
EA=1;
ET0=1;
}
void write_byte(char date) //讀取一個字節
{
char i,temp;
temp=date;
scl=0;
delay();
for(i=0;i<8;i++) //移動八位是一個字節
{
temp=temp<<1; //左移移位后 將最高位移到了CY當中
sda=CY; //將最高位送出去
delay();
scl=1;
delay();
scl=0;
delay();
}
sda=1; //釋放總線
delay();
}
char read_byte() //讀字節
{
char i,j,k;
scl=0;
delay();
sda=1;
delay();
for(i=0;i<8;i++)
{
scl=1;
delay();
j=sda;
k=(k<<1)|j;//將j給k八次 剛好k里面存著八個數據
scl=0;
delay();
}
return k;
}
void write_add(char address,char date) //在制定的位置寫數據
{
start();
write_byte(0xa0);//這是器件的地址 前四位固定 后三位是0 最后一個是0 表示往里面寫數據
respons();//寫完后等待應答
write_byte(address);//寫地址 器件內部存儲的地址
respons();
write_byte(date);//往里面寫數據
respons();
stop();
}
int read_add(char address)
{
char date;
start();
write_byte(0xa0);
respons();
write_byte(address);
respons();
start();
write_byte(0xa1);
respons();
date=read_byte();
stop();
return date;
}
void display(int shi,int ge)
{
/* P0=0X00;
P1=0x0e;
P0=table[bai];
delay(z); */
// dula=0;
dula=1;
P0=table[ge]; //送數字8到段碼端口
// dula=1;
dula=0;
wela=0;
P0=0xfd; //數碼管位選
wela=1;
wela=0;;
//dula=1;
// write_add(bb,table[shi]);
// delay1(100);
// dula=1;
// P0=table[shi];
// dula=0;
// write_add(bb,table[shi]);
// delay1(100);
delay1(1);
/* wela=1;
P0=0xfd;
wela=0;
delay1(1); */
// dula=0;
dula=1;
P0=table[shi]; //送數字8到段碼端口
// dula=1;
dula=0;
wela=0;
P0=0xfe; //數碼管位選
wela=1;
wela=0;
//dula=1;
// write_add(bb,table[ge]);
// delay1(100);
// dula=1;
// dula=0;
// write_add(cc,table[ge]);
delay1(1);
/* wela=1;
P0=0xfe;
wela=0;
delay1(1); */
}
void main()
{
init();
/* wela=1;
P0=0xfc;
wela=0; */
while(1)
{
if(aa==20)
{
aa=0;
temp++;
write_add(23,temp);
if(temp==100)
temp=0;
shi=temp/10;
ge=temp%10;
}
display( shi, ge);
/* write_add(23,table[]);
delay1(100);
P1=read_add(23); */
}
// while(1);
}
void timer0() interrupt 1
{ A
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
aa++;
}
歡迎光臨 (http://www.zg4o1577.cn/bbs/) | Powered by Discuz! X3.1 |