|
現在做的就是,使用eprom芯片,讓數碼管從0~99顯示,工作原理就是,從單片機里寫一個數字給eprom芯片,然后再從eprom芯片里讀剛才單片機給的數字,把這數字在數碼管顯示出來。如此循環下去,就能看到數碼管從0~99顯示了。 現在我就想一次傳輸10個數字給eprom,然后再從eprom里讀出數據來顯示在數碼管里,這樣是沒問題的。但現在我要傳輸多一點數字,比如40個,按照這樣就會出現亂碼了,讀不了40個那么多數字,讀到第13個就開始亂了。請問,這怎么解決,謝謝啦 | #include
#include
#define uchar unsigned char
#define uint unsigned int
sbit SCL=P2^0;
sbit SDA=P2^1;
sbit shi=P2^6;
sbit ge=P2^7;
uchar num[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar table[]={ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
10,11,12,13,14,15,16,17,18,19,
20,21,22,23,24,25,26,27,28,29,
30,31,32,33,34,35,36,37,38,39};
uchar x=13; //一次讀取多少個數字
uchar temp[40];
void delay(uchar w) //delay
{
uchar j;
for(;w>0;w--)
for(j=0;j<125;j--);
}
void delay_nop(void) //機器周期延時函數
{
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
}
void init()//總線初始化
{
SDA=1;
delay_nop();
SCL=1;
delay_nop();
}
void start() //總線起始信號
{
SDA=1;
SCL=1;
delay_nop();
SDA=0;
delay_nop();
SCL=0;
}
void stop() //總線停止信號
{
SDA=0;
SCL=1;
delay_nop();
SDA=1;
delay_nop();
SCL=0;
}
void ack() //總線應答信號
{
SDA=0;
SCL=1;
delay_nop();
SCL=0;
SDA=1;
}
void noack() //總線非應答信號
{
SDA=1;
SCL=1;
delay_nop();
SCL=0;
SDA=0;
}
bit detectack() //檢測ACK信號
{
bit b_ack;
SDA=1;
SCL=1;
delay_nop();
b_ack=SDA;
SCL=0;
return b_ack;
}
void write(uchar input) //向IC總線發送一個字節數據
{
uchar i;
for(i=0;i<8;i++)
{
if(input & 0x80)
SDA=1;
else
SDA=0;
SCL=1;
delay_nop();
SCL=0;
delay_nop();
input=input<<1;
}
}
uchar read(void) //向IC總線接收一個字節數據
{
uchar tempdata=0,i;
SDA=1;
for(i=0;i<8;i++)
{
tempdata=tempdata<<1;
tempdata=tempdata | ((uchar) SDA);
SCL=1;
delay_nop();
SCL=0;
}
return tempdata;
}
void write_str(uchar add,uchar *str,uchar num) //向IC器件指定地址寫N節數據
{
uchar i;
start();
write(0xa0);
while(detectack());
write(add);
while(detectack());
for(i=0;i
{
write(*str);
while(detectack());
str++;
/*if(i>13)
{
write(add++);
while(detectack());
}*/
}
stop();
delay(20);
}
uchar read_str(uchar add,uchar *str,uchar num)//從指定IC器件的指定地址讀N字節 數據
{
uchar i;
//uchar temp;
start();
write(0xa0);
while(detectack());
write(add);
while(detectack());
start();
write(0xa1);
while(detectack());
for(i=0;i
{
*str=read();
ack();
str++;
}
*str=read();
noack();
stop();
delay(20);
return str;
}
void main() //主函數
{
//write_str(uchar add,uchar *str,uchar num) 向IC器件指定地址寫N節數據
// read_str(uchar add,uchar *str,uchar num) 從指定IC器件的指定地址讀N字節 數據
uchar i,j; //uchar num[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
uchar a,b;
init(); //初始化總線
while(1)
{
write_str(2,table,x); //向IC器件寫入 table[]
delay(20);
read_str(2,temp,x); //從IC器件讀取 table[]
delay(20);
for(i=0;i<13;i++)
for(j=0;j<150;j++) //停留
{
a=(temp/10);
b=(temp%10);
P0=num[a];
shi=1; //十位顯示
delay(300);
shi=0;
P0=num;
ge=1; //個位顯示
delay(300);
ge=0; shi=0;
}
}
}
|
|
|