#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define cmd 0
#define dat 1
sbit rs=P2^7;
sbit rw=P2^6;
sbit e=P2^5;
sbit sclk=P3^7;
sbit sda=P3^2;
sbit rst=P2^4;
sbit dq= P3^5;
sbit p20=P2^0;
sbit p21=P2^1;
sbit p22=P2^2;
sbit p23=P2^3;
uchar num1,aa,temp1,num2,temp2;
uchar code table0[]={0xff,0xfe,0xfc,0xf8,0xf0,0xe0,
0xc0,0x80,0x00, 0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0x7e,0x3c,0x18
, 0x00,0x18,0x3c,0x7e,0xff,0xe7,0xdb,0xbd,0x7e,0x8f,0xf1,0x0f,0xf0};
uchar temp_value; //温度值
uchar TempBuffer[5],week_value[2];
uchar k,num,temp,miao,shi,fen,day,month,year,week;
uchar code table[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};//LCD1602显示码;
uchar code table1[]={12,42,12,9,8,9,8};//09年5月8日23点59分55秒,设置初始值;
uchar code table2[]={0x80,0x82,0x84,0x86,0x88,0x8c,0x8a};//秒、分、时、日、月、年地址
uchar code table3[]=" : : ";
uchar code table4[]="20 - - ";
void delay(uint z)
{
uint x,y;
for (x=z;x>0;x--)
for (y=110;y>0;y--);
}
void Delay1ms(unsigned int count)
{
unsigned int i,j;
for(i=0;i<count;i++)
for(j=0;j<120;j++);
}
/*在DS1302中读出数据后,将BCD码转换成十进制的函数;*/
bcd_hex(uchar g)
{
uchar j;
j=g&0x0f;
g>>=4;
g&=0x0f;
g*=10;
j+=g;
return(j);
}
/*lcd写操作;*/
void write_com(uchar com)
{
rs=0;
rw=0;
P0=com;
delay(5);
e=1;
delay(5);
e=0;
}
void write_date(uchar date)
{
rs=1;
rw=0;
P0=date;
delay(5);
e=1;
delay(5);
e=0;
}
void write_add_date(uchar add,uchar date)
{
write_com(0x80+add);
write_date(date);
}
void write_com_com(uchar add,uchar com)
{
write_com(0x80+add);
write_com(com);
}
/*DS1302写操作;*/
void ds_write_byte(uchar temp1)
{
uchar i;
for (i=0;i<8;i++)
{
sclk=0;
sda=temp1&0x01;
temp1>>=1;
sclk=1;
}
}
void ds_write(uchar add,uchar date)
{
rst=0;
_nop_();
sclk=0;
_nop_();
rst=1;
_nop_();
ds_write_byte(add);
_nop_();
ds_write_byte(date);
rst=0;
}
/*DS1302读操作;*/
ds_read(uchar add)
{
uchar i,temp=0x00;
rst=0;
_nop_();
sclk=0;
_nop_();
rst=1;
_nop_();
ds_write_byte(add);
for (i=0;i<8;i++)
{
if (sda)
temp|=0x80;
sclk=0;
temp>>=1;
sclk=1;
}
rst=0;
_nop_(); //以下为DS1302复位的稳定时间,这里若将_nop_()改成delay(1),会显示乱码;
rst=0;
sclk=0;
_nop_();
sclk=1;
_nop_();
sda=0;
_nop_();
sda=1;
_nop_();
return(temp);
}
void init()
{
uchar i;
write_com(0x3f);//功能设置
write_com(0x01);//清屏
write_com(0x0c);//显示开关控制
write_com(0x06);//输入方式
write_com(0x80+0x40+1);//指针
for (i=0;i<7;i++)
{
write_date(table3[i]);
}
write_com(0x80+0);
for (i=0;i<10;i++)
{
write_date(table4[i]);
}
}
/*初始值的设置函数;*/
void set()
{ unsigned char Second=ds_read(0x81);
if(Second&0x80) //判断时钟芯片是否
{ uchar i,val,aa,bb;
ds_write(0x90,0xa5);
ds_write(0x8e,0x00);
ds_write(0xc8,0x08);
for (i=0;i<8;i++)
{
bb=table2[i];
aa=table1[i];
val=aa/10;
aa=aa%10;
aa=aa+val*16;
ds_write(bb,aa);
} }
ds_write(0x90,0xa5);
ds_write(0x8e,0x80);
}
/*显示函数;*/
void display()
{
uchar a,b,c,d,e,f,a1,b1,c1,d1,e1,f1,g,g1;
a=ds_read(0x81);
a1=bcd_hex(a);
write_add_date(0x40+7,table[a1/10]);
write_add_date(0x40+8,table[a1%10]);
b=ds_read(0x83);
b1=bcd_hex(b);
write_add_date(0x40+4,table[b1/10]);
write_add_date(0x40+5,table[b1%10]);
c=ds_read(0x85);
c1=bcd_hex(c);
write_add_date(0x40+1,table[c1/10]);
write_add_date(0x40+2,table[c1%10]);
d=ds_read(0x87);
d1=bcd_hex(d);
write_add_date(8,table[d1/10]);
write_add_date(9,table[d1%10]);
e=ds_read(0x89);
e1=bcd_hex(e);
write_add_date(5,table[e1/10]);
write_add_date(6,table[e1%10]);
f=ds_read(0x8d);
f1=bcd_hex(f);
write_add_date(2,table[f1/10]);
write_add_date(3,table[f1%10]);
g=ds_read(0x8b);
g1=bcd_hex(g);
write_add_date(15,table[g1%10]);
}
/*将DS13202中的数据读出,在将扫描到的新数据写入到ds1302中,再读出,最终通过delay()函数显示出来*/
key2()
{
uchar m,m1,m11,f,f1,f11,s,s1,s11,d,d1,d11,t,t1,t11,y,y1,y11,flag,m2,f2,s2,d2,t2,y2,w,w1,w11,w2;
m2=ds_read(0x81);
miao=bcd_hex(m2);
f2=ds_read(0x83);
fen=bcd_hex(f2);
s2=ds_read(0x85);
shi=bcd_hex(s2);
d2=ds_read(0x87);
day=bcd_hex(d2);
t2=ds_read(0x89);
month=bcd_hex(t2);
y2=ds_read(0x8d);
year=bcd_hex(y2);
w2=ds_read(0x8b);
week=bcd_hex(w2);
if (k==1)
{
flag=0;
write_com_com(0x40+8,0x0d);
if (num!=20) /*num若等于20,则证明无键按下*/
{
write_date(table[num]);
m1=ds_read(0x81);
m11=bcd_hex(m1);
miao=((m11/10)*10+num); /*将键盘值读入显示函数中,若没有这步,输入的键盘值将不被保存*/
flag=1;
ds_write(0x8e,0x00);
m=miao/10;
miao=miao%10;
miao=miao+m*16;
ds_write(0x80,miao+128);
ds_write(0x8e,0x80);
}
}
if (k==2)
{
write_com_com(0x40+7,0x0d);
if (num!=20)
{
write_date(table[num]);
if (num>5)
{
miao=0;
fen=0;
shi=0;
}
else
{
if(flag==0)
{
m1=ds_read(0x81);
m11=bcd_hex(m1);
miao=((m11%10)+(num*10));
ds_write(0x8e,0x00);
m=miao/10;
miao=miao%10;
miao=miao+m*16;
ds_write(0x80,miao+128);
ds_write(0x8e,0x80);
}
else
{
miao=((miao%10)+(num*10));
ds_write(0x8e,0x00);
m=miao/10;
miao=miao%10;
miao=miao+m*16;
ds_write(0x80,miao+128);
ds_write(0x8e,0x80);
}
}
}
}
if (k==3)
{
flag=0;
write_com_com(0x40+5,0x0d);
if (num!=20)
{
write_date(table[num]);
f1=ds_read(0x83);
f11=bcd_hex(f1);
fen=((f11/10)*10+num);
ds_write(0x8e,0x00);
f=fen/10;
fen=fen%10;
fen=fen+f*16;
ds_write(0x82,fen);
ds_write(0x8e,0x80);
flag=1;
}
}
if (k==4)
{
write_com_com(0x40+4,0x0d);
if (num!=20)
{
write_date(table[num]);
if (num>5)
{
miao=0;
fen=0;
shi=0;
}
else
{
if(flag==0)
{
f1=ds_read(0x83);
f11=bcd_hex(f1);
fen=((f11%10)+(num*10));
ds_write(0x8e,0x00);
f=fen/10;
fen=fen%10;
fen=fen+f*16;
ds_write(0x82,fen);
ds_write(0x8e,0x80);
}
else
{
fen=((fen%10)+(num*10));
ds_write(0x8e,0x00);
f=fen/10;
fen=fen%10;
fen=fen+f*16;
ds_write(0x82,fen);
ds_write(0x8e,0x80);
}
}
}
}
if (k==5)
{
flag=0;
write_com_com(0x40+2,0x0d);
if (num!=20)
{
write_date(table[num]);
s1=ds_read(0x85);
s11=bcd_hex(s1);
shi=((s11/10)*10+num);
ds_write(0x8e,0x00);
s=shi/10;
shi=shi%10;
shi=shi+s*16;
ds_write(0x84,shi);
ds_write(0x8e,0x80);
flag=1;
}
}
if (k==6)
{
write_com_com(0x40+1,0x0d);
if (num!=20)
{
write_date(table[num]);
if (num>2)
{
miao=0;
fen=0;
shi=0;
}
else
{
if(flag==0)
{
s1=ds_read(0x85);
s11=bcd_hex(s1);
shi=((s11%10)+num*10);
ds_write(0x8e,0x00);
s=shi/10;
shi=shi%10;
shi=shi+s*16;
ds_write(0x84,shi);
ds_write(0x8e,0x80);
}
else
{
shi=((shi%10)+num*10);
ds_write(0x8e,0x00);
电子时钟+ds18b20温度计汇编设计
2星 需积分: 16 80 浏览量
2010-06-28
20:21:56
上传
评论 1
收藏 48KB RAR 举报
cwlabc2009
- 粉丝: 2
- 资源: 6