// 液晶1062+DS1302(带电池)+按键调整
#include <reg51.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
extern uint display_18b20[5];
extern uchar a,b,c;
extern read_18b20();
sbit SCK=P3^6;
sbit SDA=P3^4;
sbit RST=P3^5;
sbit S1=P1^1;
sbit S2=P1^2;
sbit S3=P1^3;
sbit SM=P1^6;
sbit SN=P1^5;
sbit busy=P0^7;
sbit lcd_rs=P2^6;
sbit lcd_rw=P2^5;
sbit lcd_ep=P2^7;
bit BUSY;
bit FLAG;
uchar m=0,num,l;
//uchar l_tmpdate[7]={55,59,23,31,8,7,10};//输入 秒 分 时 日 月 星期 年
uchar l_tmpdisplay[8];
uchar tmpdate2[7];
uchar tmpdate3[7];
uchar code read_rtc_address[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};// 读取 秒 分 时 日 月 星期 年 的地址
uchar code write_rtc_address[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};
uchar dat3[]={" I Love C51"};
uchar code dat4[]={"xiaobaiToT hebut"};
uchar dat1[]={"20 - - - "};
uchar dat2[]={" - - hebut"};
uchar display[];
//uchar displaypos[]={0x47,0x48,0x44,0x45,0x41,0x42,0x09,0x0a,0x06,0x07,0x0d,0x0e,0x03,0x04};
uchar code ta[7][5]={"MON","TUE","WEN","TUR","FRI","SAT","SUN"};
uint count;
uchar slnum;
uchar miao,fen,shi,xingqi,ri,yue,nian;
void delaynop(void)
{
_nop_();_nop_();_nop_();_nop_();
}
void delay(uint ms)
{
uchar x;
while(ms--)
{
for(x=0;x<255;x++){;}
}
}
void wait(void)
{
lcd_rs=0;
lcd_rw=1;
lcd_ep=1;
delaynop();
while(busy==1);
lcd_ep=0;
}
void lcd_wcmd(uchar cmd)
{
wait();
lcd_rs=0;
lcd_rw=0;
lcd_ep=0;
_nop_();_nop_();_nop_();_nop_();
P0=cmd;
_nop_();_nop_();_nop_();_nop_();
lcd_ep=1;
_nop_();_nop_();_nop_();_nop_();
lcd_ep=0;
}
void lcd_wdat(uchar dat)
{
wait();
lcd_rs=1;
lcd_rw=0;
lcd_ep=0;
P0=dat;
delaynop();
lcd_ep=1;
delaynop();
lcd_ep=0;
}
void lcd_pos(uchar pos)
{
lcd_wcmd(pos|0x80);
}
void lcd_init()
{
wait();
lcd_wcmd(0x38);
wait();
lcd_wcmd(0x0c);
wait();
lcd_wcmd(0x06);
wait();
lcd_wcmd(0x01);
}
/*void flush(void)
{
uchar m;
for(m=0;m<3;m++)
{
lcd_wcmd(0x08);
delay(200);
lcd_wcmd(0x0c);
delay(200);
}
}*/
void Write_Ds1302_Byte(uchar temp)
{
uchar i;
for(i=0;i<8;i++)
{
SCK=0;
SDA=temp&0x01;
temp>>=1;
SCK=1;
}
}
void Write_Ds1302(uchar address,uchar dat)
{
RST=0;
_nop_();
SCK=0;
_nop_();
RST=1;
_nop_();
Write_Ds1302_Byte(address);
Write_Ds1302_Byte(dat);
RST=0;
}
uchar Read_Ds1302_Byte(void)
{
uchar i,temp=0;
for(i=0;i<8;i++)
{
SCK=0;
temp>>=1;
if(SDA)
temp|=0x80;
SCK=1;
SCK=0;
}
return(temp);
}
uchar Read_Ds1302(uchar address)
{
uchar dat;
RST=0;
_nop_();
SCK=0;
_nop_();
RST=1;
_nop_();
Write_Ds1302_Byte(address);
dat=Read_Ds1302_Byte();
RST=0;
_nop_();//去掉无影响~~~
RST=0;
_nop_();
SCK=0;
_nop_();
SCK=1;
_nop_();
SDA=0;
_nop_();
SDA=1;
_nop_();
return(dat);
}
void Read_rtc(void)
{
uchar i,*p;
p=read_rtc_address;
for(i=0;i<7;i++)
{
tmpdate3[i]=Read_Ds1302(*p);
p++;
}
}
/*void Set_rtc(void)
{
uchar i,tmp,*p,a;
for(i=0;i<7;i++)
{
tmp=l_tmpdate[i]/10;
a=l_tmpdate[i]%10;
tmpdate2[i]=a+tmp*16;
}
Write_Ds1302(0x8e,0x00);
p=write_rtc_address;
for(i=0;i<7;i++)
{
Write_Ds1302(*p,tmpdate2[i]);
p++;
}
Write_Ds1302(0x8e,0x80);
}*/
void write_lcd_rtc()
{
uchar temp[2],i;
switch(l)
{
case 0: lcd_pos(0x47);break;//秒
case 1: lcd_pos(0x44);break;//分
case 2: lcd_pos(0x41);break;//时
case 3: lcd_pos(0x09);break;//日
case 4: lcd_pos(0x06);break;//月
case 5: lcd_pos(0x0d);break;//星期
case 6: lcd_pos(0x03);break;//年
}
if(l!=5)
{
temp[0]=tmpdate3[l]/16;//数据的转换
temp[1]=tmpdate3[l]&0x0f;
lcd_wdat(0x30+temp[0]);
delay(1);
lcd_wdat(0x30+temp[1]);
}
if(l==5)
{
xingqi=tmpdate3[l]&0x0f;
i=0;
lcd_pos(0x0c);
while(ta[xingqi-1][i]!='\0')
{
lcd_wdat(ta[xingqi-1][i]);
i++;
}
}
l++;
if(l==7)
l=0;
}
void lcd_sfm(uchar add,uchar dat)
{
lcd_pos(add);
delay(1);
lcd_wdat(dat/10+0x30);
delay(1);
lcd_wdat(dat%10+0x30);
delay(1);
}
uchar chang_date16_10(uchar dat)
{
uchar a1,a2,temp;
a1=dat/16;
a2=dat%16;
temp=a1*10+a2;
return(temp);
}
uchar chang_date10_16(uchar dat)
{
uchar a1,a2,temp;
a1=dat/10;
a2=dat%10;
temp=a1*16+a2;
return(temp);
}
void write_lcd_18b20()
{
delay(1);
//lcd_wcmd(0x04);
//delay(1);
lcd_pos(0x49);
// delay(1);
if(a==1) lcd_wdat(0x2d);
else
lcd_wdat(0x20);
delay(1);
//if(b==1) lcd_wdat(0x20);
//else
//lcd_wdat(display_18b20[3]+0x30);
//delay(3);
if(c==1) lcd_wdat(0x20); //温度位顶到了屏幕的最右端 故舍掉百位 (温度也不会到百位)
else
lcd_wdat(display_18b20[2]+0x30);
// delay(1);
lcd_wdat(display_18b20[1]+0x30);
// delay(1);
lcd_wdat(0x2e);
//delay(1);
lcd_wdat(display_18b20[0]+0x30);
//delay(1);
lcd_wdat(display_18b20[4]+0x30);
//delay(1);
a=0;
b=0;
c=0;
}
/*******************键盘调整部分*******************/
key_scan()//键盘扫描
{
uchar i;
SM=0;
if(S1==0)
{
delay(2);
if(S1==0)
{
while(!S1);
FLAG=1;// 计时停止
slnum++;
if(slnum==1)//秒位 光标闪现
{
lcd_pos(0x48);
miao=chang_date16_10(tmpdate3[0]);
lcd_wcmd(0x0d);
}
if(slnum==2)//分位 光标闪现
{
lcd_pos(0x45);
fen=chang_date16_10(tmpdate3[1]);
lcd_wcmd(0x0d);
}
if(slnum==3)//时位 光标闪现
{
lcd_pos(0x42);
shi=chang_date16_10(tmpdate3[2]);
lcd_wcmd(0x0d);
}
if(slnum==4)//星期位 光标闪现
{
lcd_pos(0x0d);
xingqi=chang_date16_10(tmpdate3[5]);
lcd_wcmd(0x0d);
}
if(slnum==5)//日 光标闪现
{
lcd_pos(0x0a);
ri=chang_date16_10(tmpdate3[3]);
lcd_wcmd(0x0d);
}
if(slnum==6)// 月 光标闪现
{
lcd_pos(0x07);
yue=chang_date16_10(tmpdate3[4]);
lcd_wcmd(0x0d);
}
if(slnum==7)// 年光标闪现
{
lcd_pos(0x04);
nian=chang_date16_10(tmpdate3[6]);
lcd_wcmd(0x0d);
}
if(slnum==8)// 光标归位
{
slnum=0;
lcd_wcmd(0x0c);
FLAG=0;//计时开始
Write_Ds1302(0x8e,0x00);
Write_Ds1302(0x80,chang_date10_16(miao));
Write_Ds1302(0x82,chang_date10_16(fen));
Write_Ds1302(0x84,chang_date10_16(shi));
Write_Ds1302(0x8a,chang_date10_16(xingqi));
Write_Ds1302(0x86,chang_date10_16(ri));
Write_Ds1302(0x88,chang_date10_16(yue));
Write_Ds1302(0x8c,chang_date10_16(nian));
Write_Ds1302(0x8e,0x80);
}
}
}
if(slnum!=0)//计数调整按键
{
if(S2==0)//加计数调整
{
delay(5);
if(S2==0)
{
while(!S2);
if(slnum==1)//秒 加调整 以下为进位(未加,加进位后作用不大)
{
miao++;
if(miao==60)
{
miao=0;
}
lcd_sfm(0x47,miao);
lcd_pos(0x48);
}
if(slnum==2)//分 加调整 以下为进位(未加)
{
fen++;
if(fen==60)
{
fen=0;
}
lcd_sfm(0x44,fen);
lcd_pos(0x45);
}
if(slnum==3)//时 加调整 以下为进位(未加)
{
shi++;
if(shi==24)
{
shi=0;
}
lcd_sfm(0x41,shi);
lcd_pos(0x42);
}
if(slnum==4)//星期 加调整 以下为进位(未加)
{
xingqi++;
if(xingqi==8)
{
xingqi=1;
}
i=0;
lcd_pos(0x0c);
while(ta[xingqi-1][i]!='\0')
{
lcd_wdat(ta[xingqi-1][i]);
i++;
}
lcd_pos(0x0d);
}
if(slnum==5)//日 加调整 以下为进位
{
ri++;
if(ri==32)
{
ri=1;
}
lcd_sfm(0x09,ri);
lcd_pos(0x0a);
}
if(slnum==6)//月 加调整 以下为进位(未加)
{
yue++;
if(yue==13)
{
yue=1;
}
lcd_sfm(0x06,yue);
lcd_pos(0x07);
}
if(slnum==7)//年 加调整 以下为进位(未加)
{
nian++;
lcd_sfm(0x03,nian);
lcd_pos(0x04);
}
}
}
if(S3==0)//减计数调整
{
delay(5);
if(S3==0)
{