#include<reg52.h>
#include <intrins.h>
unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsigned char code zl[]={"0123456789"};
unsigned char code mm[3]={0x6e,0x5a,0xd8};
unsigned char code nn[3];
unsigned char code mmnn[]={"6e5ad8"};
unsigned char sec=0; //定義計數值,每過1秒,sec加1
unsigned int count; //定時中斷次數
bit write=0; //寫24C08的標志;
//sbit gewei=P2^7; //個位選通定義
//sbit shiwei=P2^6; //十位選通定義
/////////24C08讀寫驅動程序////////////////////
sbit scl=P3^4; // 24c08 SCL
sbit sda=P3^5; // 24c08 SDA
sbit K5=P1^4; //清0按鍵
sbit rs=P2^0;
sbit rw=P2^1;
sbit e=P2^2;
sbit BF=P0^7;
unsigned char bdata bianl;
sbit b0 =bianl^0;
sbit b1 =bianl^1;
sbit b2 =bianl^2;
sbit b3 =bianl^3;
sbit b4 =bianl^4;
sbit b5 =bianl^5;
sbit b6 =bianl^6;
sbit b7 =bianl^7;
clock(unsigned long a)
{unsigned long xdata b;
for(b=0;b<a;++b);
}
/***********************************************/
void delay() //delay 5μs
{ ;; }
/**********************************************/
void delay1(char x)
{
char a,b;
for(a=x;a>0;a--)
for(b=100;b>0;b--);
}
w1(unsigned char a)
{bianl=a;
scl=0;clock(1);sda=b7;clock(1);scl=1;clock(1);;
scl=0;clock(1);sda=b6;clock(1);scl=1;clock(1);;
scl=0;clock(1);sda=b5;clock(1);scl=1;clock(1);;
scl=0;clock(1);sda=b4;clock(1);scl=1;clock(1);;
scl=0;clock(1);sda=b3;clock(1);scl=1;clock(1);;
scl=0;clock(1);sda=b2;clock(1);scl=1;clock(1);;
scl=0;clock(1);sda=b1;clock(1);scl=1;clock(1);;
scl=0;clock(1);sda=b0;clock(1);scl=1;clock(1);;
}
void write2408(unsigned char adress,unsigned char sj)
{
//unsigned int b;
sda=1;clock(1);scl=1;clock(1);sda=0;clock(1);
w1(0xa0);scl=0;clock(1);scl=1;clock(1);scl=0;clock(1);
w1(adress);scl=0;clock(1);scl=1;clock(1);scl=0;clock(1);
w1(sj);scl=0;clock(1);scl=1;clock(1);scl=0;clock(1);
scl=0;clock(1);sda=0;clock(1);scl=1;clock(1);sda=1;clock(1);;
clock(500);
}
unsigned char read(unsigned char adress)
{sda=1;clock(1);scl=1;clock(1);sda=0;clock(1);
w1(0xa0);scl=0;clock(1);scl=1;clock(1);scl=0;clock(1);
w1(adress);scl=0;clock(1);scl=1;clock(1);scl=0;clock(1);
scl=0;clock(1);sda=1;clock(1);scl=1;clock(1);sda=0;clock(1);
w1(0xa1);scl=0;clock(1);scl=1;clock(1);scl=0;clock(1);
scl=0;clock(1);scl=1;clock(1);b7=sda;clock(1);
scl=0;clock(1);scl=1;clock(1);b6=sda;clock(1);
scl=0;clock(1);scl=1;clock(1);b5=sda;clock(1);
scl=0;clock(1);scl=1;clock(1);b4=sda;clock(1);
scl=0;clock(1);scl=1;clock(1);b3=sda;clock(1);
scl=0;clock(1);scl=1;clock(1);b2=sda;clock(1);
scl=0;clock(1);scl=1;clock(1);b1=sda;clock(1);
scl=0;clock(1);scl=1;clock(1);b0=sda;clock(1);
scl=0;clock(1);sda=0;clock(1);scl=1;clock(1);sda=1;clock(1);;
return(bianl);
}
/*init_24c08()
{
scl=1;
clock(1);
sda=1;
clock(1);
} */
/***********************************************************/
/*void LEDshow() //LED顯示函數
{
P2=0xbf;
P0=table[sec/10];
delay1(2);
P2=0x7f;
P0=table[sec%10];
delay1(2);
} */
/***********************************************************/
bit busy()
{
bit wj;
rs=0;
rw=1;
e=1;
_nop_(); _nop_();_nop_();
wj=BF;
_nop_(); _nop_();_nop_();
e=0;
return wj;
}
void wml(unsigned char ml)
{
while(busy()==1);
rs=0;
rw=0;
e=0;
_nop_(); _nop_();_nop_();
P0=ml;
_nop_(); _nop_();_nop_();
e=1;
_nop_(); _nop_();_nop_();
e=0;
}
void wsj(unsigned char sj)
{
while(busy()==1);
rs=1;
rw=0;
e=0;
_nop_(); _nop_();_nop_();
P0=sj;
_nop_(); _nop_();_nop_();
e=1;
_nop_(); _nop_();_nop_();
e=0;
}
void csh()
{
wml(0x38);
delay1(5);
wml(0x38);
delay1(5);
wml(0x38);
delay1(5);
wml(0x0c);
delay1(5);
wml(0x06);
delay1(5);
wml(0x01);
delay1(5);
}
void main(void)
{ csh();
TMOD=0x01; //定時器工作在方式1
ET0=1;
EA=1;
//init_24c08(); //初始化24C08
sec=read(3);//讀出保存的數據賦于sec
TH0=(65536-50000)/256; //對TH0 TL0賦值
TL0=(65536-50000)%256; //使定時器0.05秒中斷一次
TR0=1; //開始計時
while(1)
{
// LEDshow();
wml(0x85);
wsj(zl[sec/10]);
delay1(5);
wsj(zl[sec%10]);
delay1(5);
write2408(6,mm[0]);
nn[0]=read(6);
if(nn[0]==mm[0])
{
wml(0xc5);
wsj(mmnn[0]);
delay1(5);
wsj(mmnn[1]);
delay1(5);
}
if(write==1) //判斷計時器是否計時一秒
{
write=0; //清零
write2408(3,sec); //在24c08的地址2中寫入數據sec
}
if(K5==0){
delay1(10);
if(K5==0){
sec=0;
}
}
}
}
/**************************************************************/
void t0() interrupt 1 //定時中斷服務函數
{
TH0=(65536-50000)/256; //對TH0 TL0賦值
TL0=(65536-50000)%256; //重裝計數初值
count++; //每過50ms tcnt加一
if(count==20) //計滿20次(1秒)時
{
count=0; //重新再計
sec++;
write=1; //1秒寫一次24C08
if(sec==100) //定時100秒,在從零開始計時
{sec=0;}
}
}