#include<reg52.h>#define uchar unsigned charsfr p0=0x80;unsigned char code dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9 unsigned char code dofly_DuanMa1[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码unsigned char TempData1[8]; unsigned char TempData2[8]; unsigned char i1,t3,t4;sbit sda=P2^0;sbit scl=P2^1; void Timer0_isr(); sbit LATCH1=P2^2;//定义锁存使能端口 段锁存sbit LATCH2=P2^3;// uchar a; unsigned char t3,i,t4;void delay(){ ;; } void start() //开始信号{ sda=1; delay(); scl=1; delay(); sda=0; delay();}
void stop() //停止{ sda=0; delay(); scl=1; delay(); sda=1; delay();}
void respons() //应答{ uchar i; scl=1; delay(); while((sda==1)&&(i<250))i++; scl=0; delay();}
void init(){ sda=1; delay(); scl=1; delay();}
void write_byte(uchar date){ uchar i,temp; temp=date;
for(i=0;i<8;i++) { temp=temp<<1; scl=0; delay(); sda=CY; delay(); scl=1; delay(); // scl=0; // delay(); } scl=0; delay(); sda=1; delay();}
uchar read_byte(){ uchar i,k; scl=0; delay(); sda=1; delay(); for(i=0;i<8;i++) { scl=1; delay(); k=(k<<1)|sda; scl=0; delay(); } return k;}
void delay1(uchar x){ uchar a,b; for(a=x;a>0;a--) for(b=100;b>0;b--);}
void write_add(uchar address,uchar date){ start(); write_byte(0xa0); respons(); write_byte(address); respons(); write_byte(date); respons(); stop();}
uchar read_add(uchar address){ uchar date; start(); write_byte(0xa0); respons(); write_byte(address); respons(); start(); write_byte(0xa1); respons(); date=read_byte(); stop(); return date;}void Timer0_isr(void) { TMOD|=0x01; TH0=(65536-50000)/256; TL0=(65536-50000)%256; EA=1; ET0=1; TR0=1; }void main(){ Timer0_isr(); init(); for(i=0;i<10;i++) { uchar i,t1,t2;
t1++; write_add(23+t1,dofly_DuanMa[t1]); if(t1==10) { write_add(23+t2,dofly_DuanMa1[t2]); t1=0; t2++; if(t2==10) t2=0; } delay1(100); } while(1)
{
p0=read_add(23+i1); LATCH1=1; LATCH1=0; p0=0xfd; LATCH2=1; LATCH2=0; AT24C02存储芯片在数码管上显示 delay1(50); p0=read_add(33+t3); 为什么这里不能进位了,改成23+T3就可以了。 LATCH1=1; LATCH1=0; p0=0xfe; LATCH2=1; LATCH2=0; delay1(50); } } void Timer0_isr1(void) interrupt 1 { uchar t4; TH0=(65536-50000)/256;//重新赋值 2ms TL0=(65536-50000)%256; t4++; if(t4==20) { t4=0; i1++; } if(i1==10) { i1=0; t3++; } if(t3==10) { t3=0; } }
for语句中i是从0到9总共十次,
t1如果从0开始,只能加到9,永远到不了10,
所以if(t1==10)中的write_add()不会执行。
所以在24C02中,只有add(23)~add(23+9)保存了数据,
所以你在后面读add(33)和之后的数据是读不出来的。
另外:
1、你的变量定义很乱,全局变量只要void Timer0_isr1(void) interrupt 1 中的三个就够了,其他的都定义为局部变量比较合适。
2、既然是存储0~9的段码,那么24C02存入一次就足够了,不需要重复储存。
3、建议你除了’0’ ’1’ ’2’ ’3’ ’4’ ’5’ ’6’ ’7’ ’8’ ’9’以外,加上’A’ ’B’ ’C’ ’D’ ’E’ ’F’ ’-’ ’.’这些符号的段码值,这样更方便使用数码管显示。
4、如果显示不清楚 或 数码管闪烁的厉害 ,可以修改每位数码管显示的时间长度。