问题中为什么液晶上电只能保存秒,而分和时都不能被保存呢?程序代码如下,写的有点乱,高手别丢砖!
/*按S1为调时间确定键,按S1第一次调时间秒,按S1第二次调时间分,按S1第三次调时间时,按S1第四次打开中断运行时间.按S2调时间加,按S3调时间减.*/
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]="2011-03-21";
uchar code table1[]="00:00:00";
uchar code table2[]="0123456789";
bit write=0;
sbit lcden=P3^4;
sbit lcdrs=P3^5;
sbit rd=P3^7;
sbit sda=P2^0;
sbit scl=P2^1;
sbit dula=P2^6;
sbit wela=P2^7;
sbit s1=P3^0;
sbit s2=P3^1;
sbit s3=P3^2;
sbit beep=P2^3;
uchar num1,num2,s1num;t=0,sec1=0,sec2=0,sec3=0,b1=11,b2=3,b3=21;
uint b;
void keyscan();
void display();
void write_miao();
void write_fen();
void write_shi();
unsigned int keyboar();
void delayns()
{;;}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void di()
{ beep=0;
delay(100);
beep=1;
}
/////////////////////////////////////////////////////////////////////////
void start() //开始信号
{
sda=1;
delayns();
scl=1;
delayns();
sda=0;
delayns();
}
void stop() //停止
{
sda=0;
delayns();
scl=1;
delayns();
sda=1;
delayns();
}
void respons() //应答
{
uchar i;
scl=1;
delayns();
while((sda==1)&&(i<250))i++;
scl=0;
delayns();
}
void init1()
{
sda=1;
delayns();
scl=1;
delayns();
}
void write_byte(uchar date1)
{
uchar i,temp;
temp=date1;
for(i=0;i<8;i++)
{
temp=temp<<1;
scl=0;
delayns();
sda=CY;
delayns();
scl=1;//高电平保持CY送给SDA数据稳定的通信
delayns();
// scl=0;
// delay();
}
scl=0;//数据安全稳定的通信完后,低电平期间使得数据改变进行再次通信
delayns();
sda=1;//数据线为高点平,释放总线,进行下一位的数据传送
delayns();
}
uchar read_byte()
{
uchar i,k;
scl=0;
delayns();
sda=1;
delayns();
for(i=0;i<8;i++)
{
scl=1;
delayns();
k=(k<<1)|sda;
scl=0;
delayns();
}
return k;
}
/*
void write_add(uchar address1,uchar date1)
{ start();
write_byte(0xa0);
respons();
write_byte(address1);
respons();
write_byte(date1);
respons();
stop();
}
uchar read_add(uchar address1)
{ uchar date1;
start();
write_byte(0xa0);
respons();
write_byte(address1);
respons();
start();
write_byte(0xa1);
respons();
date1=read_byte();
stop();
return date1;
} */
/////////////////////////////////////////////////////////////////////////////////
void write_com(uchar com) //写命令
{
lcdrs=0;//选择写命令模式
//rs=0;//rs一直是地
P0=com;//将要写的命令字送到数据总线上
delay(5);//稍做延时以待数据稳定
lcden=1;//使能端给一高脉冲,因为初始化函数中已经将lcden置为0
delay(5);//
lcden=0; //将使能端置为0以完成高脉冲
}
void write_data(uchar date)//写数据
{
lcdrs=1;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void initLCD()
{ rd=0;//软件将矩阵按键第4列一端置低用以分解出独立按键
dula=0; // 数码管关了,防止影响LCD
wela=0; // 数码管关了,防止影响LCD
lcden=0;
write_com(0x38); //设置16*2显示,5*7点阵,8位数据接口
write_com(0x0c);//设置开显示,不显示光标
write_com(0x06);//写一个字符后地址指针自动加1
write_com(0x01);//显示清0,数据指针清0
}
//////////////////////////////////////////////////////////////////
void main()
{ init1();
initLCD();
start();
write_byte(0xa0);
respons();
write_byte(3);
respons();
start();
write_byte(0xa1);
respons();
sec3=read_byte();
stop();
if(sec3>60)
sec3=0;
/////////////////////////////////////////////
delay(100);
start();
write_byte(0xa0);
respons();
write_byte(3);
respons();
start();
write_byte(0xa1);
respons();
sec2=read_byte();
stop();
if(sec2>60)
sec2=0;
/////////////////////////////////////////
delay(100);
start();
write_byte(0xa0);
respons();
write_byte(3);
respons();
start();
write_byte(0xa1);
respons();
sec1=read_byte();
stop();
if(sec1>24)
sec1=0;
/////////////////////////////////////////
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
write_com(0x80);//将数据指针定位到第一行第一个字处,然后写完第一行要显示的字,在每两个字之间做简短延时,这个时间可以自行测试,时间太长会影响写入及显示速度,太短会影响控制器接收数据的稳定性。
for(num1=0;num1<10;num1++) //共11个字符,写11次
{
write_data(table[num1]);
delay(5);
}
write_com(0x80+0x40); //当写第行时需要重新定位数据指针:write_com(0x80+0x40)
for(num2=0;num2<8;num2++)
{
write_data(table1[num2]);
delay(5);
}
while(1)
{ keyscan();
display();
if(write==1)
{ write=0;
start();
write_byte(0xa0);
respons();
write_byte(3);
respons();
write_byte(sec3);//写入数据0xaa
respons();
stop();
////////////////////////////////////
delay(100);
start();
write_byte(0xa0);
respons();
write_byte(3);
respons();
write_byte(sec2);
respons();
stop();
delay(100);
/////////////////////////////////////
start();
write_byte(0xa0);
respons();
write_byte(3);
respons();
write_byte(sec1);
respons();
stop();
}
}
}
void t0()interrupt 1 //中断函数中的程序运行时间不能超过1S,不然就会有累积误差
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
t++;
}
void display()
{ if(t==20)
{ t=0;
sec3++;
write=1;
if(sec3==60)
sec3=0;
write_miao();
if(sec3==0)
{ sec2++;
if(sec2==60)
sec2=0;
write_fen();
if(sec2==0)
{ sec1++;
if(sec1==24)
sec1=0;
write_shi();
if(sec1==0) //如果24小时到了,那么b3加一天
{ b3++;
if(b3==30) //
b3=0;
write_com(0x80+0x09);
write_data(table2[b3/10]);
delay(5);
write_com(0x80+0x08);
write_data(table2[b3%10]);
if(b3==0) //如果30天到了
{ b2++;
if(b2==12); //如果12个月底到了,月份清0显示
b2=0;
write_com(0x80+0x06);
write_data(table2[b2/10]);
delay(5);
write_com(0x80+0x05);
write_data(table2[b2%10]);
if(b2==0)//如果12个月到了
{ b1++;
write_com(0x80+0x03);
write_data(table2[b1/10]);
delay(5);
write_com(0x80+0x02);
write_data(table2[b1%10]);
}
}
}
}
}
}
}
/////////////////////////////////////////////////////////////////////////////////////
void keyscan()
{ if(s1==0)
{ delay(5);
if(s1==0)
{ s1num++; //第一次按键按下后加1,
while(!s1);
di();
if(s1num==1)//关闭定时器,写入新的数据秒
{ TR0=0;
write_com(0x80+0x40+7);
write_com(0x0f);
}
if(s1num==2)
{ write_com(0x80+0x40+4);
write_com(0x0f);
}
if(s1num==3)
{ write_com(0x80+0x40+1);
write_com(0x0f);
}
if(s1num==4)
{ s1num=0;
write_com(0x0c);
TR0=1;
}
}
}
///////////////按S2加////////////////////////////////
if(s1num!=0)
{ if(s2==0)
{ delay(5);
if(s2==0)
{ while(!s2);
di();
if(s1num==1)
{ sec3++;
if(sec3==60)
sec3=0;
write_miao();
}
if(s1num==2)
{ sec2++;
if(sec2==60)
sec2=0;
write_fen();
}
if(s1num==3)
{ sec1++;
if(sec1==24)
sec1=0;
write_shi();
}
}
}
}
////////////////按S3减/////////////////////////////////
if(s1num!=0)
{ if(s3==0)
{ delay(5);
if(s3==0)
{ while(!s3);
di();
if(s1num==1)
{ sec3--;
if(sec3==0)
sec3=60;
write_miao();
}
if(s1num==2)
{ sec2--;
if(sec2==0)
sec2=60;
write_fen();
}
if(s1num==3)
{ sec1--;
if(sec1==0)
sec1=24;
write_shi();
}
}
}
}
}
void write_miao()//写入秒
{ write_com(0x80+0x46);
write_data(table2[sec3/10]);
delay(5);
write_com(0x80+0x47);
write_data(table2[sec3%10]);
delay(5);
}
void write_fen() //写入分
{ write_com(0x80+0x43);
write_data(table2[sec2/10]);
delay(5);
write_com(0x80+0x44);
write_data(table2[sec2%10]);
delay(5);
}
void write_shi() //写入时
{ write_com(0x80+0x40);
write_data(table2[sec1/10]);
delay(5);
write_com(0x80+0x41);
write_data(table2[sec1%10]);
delay(5);
} |