当前位置:文档之家› 万年历(时钟芯片和液晶显示)

万年历(时钟芯片和液晶显示)

l_tmpdate[0]=l_tmpdate[0]+tp*16;
Write_Ds1302(0x8E,0X00);//关闭写保护
Write_Ds1302(write_add[0],l_tmpdate[0]);
Write_Ds1302(0x8E,0x80);//打开写保护
}
write_com(0x80+0x40+11);
}
void write_lcd()//写时间函数
{
static uchar i,temp[2];
switch(i)
{
case 0: write_com(0x80+0x40+0x0b);break;//秒
case 1: write_com(0x80+0x40+8);break;//分
case 2: write_com(0x80+0x40+5);break;//时
}//写time0
write_com(0x80+0x40);
for(num=0;num<13;num++)
{
write_data(time1[num]);
delay(5000);
}//写time1
}
void Write_Ds1302_Byte(uchar temp) //写一个字节
{
uchar i;
void Write_Ds1302(uchar add,uchar dat )//向寄存器写数据
{
RST=0;
_nop_();
SCK=0;
_nop_();
RST=1;//启动
_nop_();
Write_Ds1302_Byte(add); //发送地址
Write_Ds1302_Byte(dat); //发送数据
write_com(0x0f);//显示光标并且闪烁
}
if(setn==4)
{
write_com(0x80+15);
write_com(0x0f);
}
if(setn==5)
{
write_com(0x80+12);
write_com(0x0f);
}
if(setn==6)
{
write_com(0x80+9);
if(set==0)
{
//flag=1;//时间停止
delay(5000);//去键盘按下抖动
if(set==0)
{
delay(500);
while(!set);
delay(500);//去键盘抬起时抖动
while(!set);
delay(500);
flag=1;
setn++;
if(setn==1)
sbit set=P1^0;//定义按键端口
sbit s1=P1^1;
sbit s2=P1^2;
sbit s3=P1^3;
void keyscan1();void keyscan();
/************液晶口定义*******/
sbit RS=P2^0;//RS为数据/指令选择1/0
sbit RW=P2^1;//读写
Write_Ds1302(0x8E,0x80);//打开写保护
flag=0;//时钟正常运行
write_com(0x0c);//光标停止闪烁
}
}
}
if(setn!=0)//更改时间
{
if(s1==0)//增加时间
{
delay(5000);
if(s1==0)
{
while(!s1);
delay(5000);//去键盘抬起时抖动
extern uchar data dis_buf2[16];
void delay(uint z)
{
while(--z);
}
void write_com(uchar com)//液晶写命令函数
{
RS=0;//写命令使能
RW=0;//写
delay(5000);
/****在高脉冲下命令输入*****/
E=0;
case 3: write_com(0x80+0x0b);break;//日
case 4: write_com(0x80+8);break;//月
case 5: write_com(0x80+0x0e);break;//星期
case 6: write_com(0x80+5);break;//年
}
temp[0]=l_tmpdate[i]/16;//数据的转换
l_tmpdate[1]++;
if(l_tmpdate[1]==60)
l_tmpdate[1]=0;
{
tp=l_tmpdate[1]/10;
l_tmpdate[1]=l_tmpdate[1]%10;
l_tmpdate[1]=l_tmpdate[1]+tp*16;
}
uchar Read_Ds1302(uchar address )//从寄存器读数据
{
uchar date;
RST=0;
_nop_();
SCK=0;
_nop_();
RST=1;
_nop_();
Write_Ds1302_Byte(address);
date=Read_Ds1302_Byte();
RST=0;
void Set_RTC(void) //设定日历
{
uchar i,*p,tmp;
for(i=0;i<7;i++)
{ //BCD处理,将十六进制转换成十进制
tmp=l_tmpdate[i]/10;
l_tmpdate[i]=l_tmpdate[i]%10;
l_tmpdate[i]=l_tmpdate[i]+tmp*16;
_nop_(); //以下为DS1302复位的稳定时间
RST=0;
SCK=0;
_nop_();
SCK=1;
_nop_();
SDA=0;
_nop_();
SDA=1;
_nop_();
return (date);
}
/*********************************************************/
}
Write_Ds1302(0x8E,0x00);//关闭写保护
p=write_add;//传要写的寄存器地址
for(i=0;i<7;i++) //7次写入秒分时日月周年
{
Write_Ds1302(*p,l_tmpdate[i]);
p++;
}
Write_Ds1302(0x8E,0x80);//打开写保护
write_com(0x06);//光标移动设置整屏不移动
write_com(0x0c);//屏幕开、光标不闪(0)不显示(0)
delay(5000);
write_com(0x80);
for(num=0;num<16;num++)
{
write_data(time0[num]);
delay(5000);
write_com(0x0f);
}
if(setn==7)
{
write_com(0x80+6);
write_com(0x0f);
}
if(setn==8)
{
setn=0;
Write_Ds1302(0x8E,0X00);//关闭写保护
Write_Ds1302(write_add[0],l_tmpdate[0]); //写秒
RST=0; //恢复
}
uchar Read_Ds1302_Byte()//读一个字节
{
uchar i,temp=0x00;
for (i=0;i<8;i++) //循环8次读取数据
{
if(SDA)
temp|=0x80; //每次传输低字节
SCK=0;
temp>>=1; //右移一位
SCK=1;
}
return(temp);
{
write_com(0x80+0x40+12);//将光标移动到秒个位
write_com(0x0f);//显示光标并且闪烁
}
if(setn==2)
{
write_com(0x80+0x40+9);//将光标移动到分个位
write_com(0x0f);//显示光标并且闪烁
}
if(setn==3)
{
write_com(0x80+0x40+6);//将光标移动到时个位
{
write_data(dis_buf2[j]);
}
}
delay(500);
while(!s3);
delay(500);//去键盘抬起时抖动
while(!s3);
delay(500);
init();
Read_RTC();
write_lcd();
}
}
void keyscan()
{
uchar tem[2],tp,flag;//存储要更改的时间数据
P0=com;
delay(500);
E=1;
delay(500);
E=0;
}
void write_data(uchar dat)//液晶写数据函数
{பைடு நூலகம்
RS=1;//写数据使能
相关主题