初學51單片機之實時時鐘(DS1302編寫)
這個程式注釋比較少,有什麼需要的,可以Hi我。。。。
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar code table1[]="DS1302";
uchar code table2[]="Day-";
uchar code table5[]="0123456789";
char date1,date2,date3,date4,date5,date6,date7;
uchar sec1,sec2,min1,min2,hr1,hr2,day1,dat1,dat2,month1,month2,year1,year2;
uchar day;
sbit rs=P2^4;
sbit rw=P2^5;
sbit lcden=P2^6;
sbit clk=P1^0;
sbit io=P1^1;
sbit rst=P1^2;
sbit key1=P3^7;
sbit key2=P3^6;
sbit key3=P3^5;
sbit key4=P3^4;
sbit key5=P3^3;
sbit key6=P3^2;
void delay(uint ms)
{
uint i,j;
for(i=ms;i>0;i--)
for(j=110;j>0;j--);
}
void write_com(uchar com)
{
rs=0;
rw=0;
lcden=0;
P0=com; //送指令
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_date(uchar date)
{
rs=1;
rw=0;
lcden=0;
P0=date; //送資料
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void lcd1602_init()
{
write_com(0x38);
delay(2);
write_com(0x0c);
delay(2);
write_com(0x06);
delay(2);
write_com(0x01);
delay(2);
write_com(0x80);
delay(2);
}
void write_ds1302_byte(uchar temp) //寫一個位元組
{
uchar i;
for (i=0;i<8;i++) //循環8次寫入資料
{
clk=0;
io=(bit)(temp&0x01); //每次傳輸低位元組
temp>>=1; //右移一位
clk=1;
}
}
void write_ds1302(uchar add,uchar date) //向寄存器寫資料
{
rst=0; //關閉ds1302
_nop_();
clk=0;
_nop_();
rst=1; //使能ds1302
_nop_();
write_ds1302_byte(add); //發送位址
write_ds1302_byte(date); //發送資料
rst=0;
clk=1;
}
uchar read_ds1302_byte() //讀一個位元組
{
uchar i;
uchar temp=0x00;
for(i=0;i<8;i++)
{
temp>>=1;
clk=1;
_nop_();
clk=0;
if(io==1)
temp|=0x80; //如果檢測到最低位為1,将最低位放在temp的最高位,依次檢測,循環8次,傳回temp
else
temp&=0x7f; //若檢測為0,同上,可以不寫
}
return(temp);
}
uchar read_ds1302(uchar add) //從寄存器讀資料
{
uchar date;
rst=0; //關閉ds1302
_nop_();
clk=0;
_nop_();
rst=1; //使能ds1302
_nop_();
write_ds1302_byte(add);
date=read_ds1302_byte();
rst=0;
_nop_();
clk=1;
return(date);
}
void ds1302_init()
{
write_ds1302(0x8e,0x00); //關閉寫保護
write_ds1302(0x90,0xaa); //定義充電
write_ds1302(0x80,0x53); //秒
write_ds1302(0x82,0x59); //分
write_ds1302(0x84,0x08); //時
write_ds1302(0x86,0x02); //日
write_ds1302(0x88,0x08); //月
write_ds1302(0x8a,0x02); //周
write_ds1302(0x8c,0x11); //年
write_ds1302(0x8e,0x80); //打開寫保護
}
void display()
{
uchar i,j;
write_com(0x80);
for(i=0;i<6;i++)
{
write_date(table1[i]);
delay(5);
}
write_com(0x80+0x40+1);
for(j=0;j<4;j++)
{
write_date(table2[j]);
delay(5);
}
date1=read_ds1302(0x81);
sec1=(date1&0x0f);
sec2=(date1>>4);
date2=read_ds1302(0x83);
min1=(date2&0x0f);
min2=(date2>>4);
date3=read_ds1302(0x85);
hr1=(date3&0x0f);
hr2=(date3>>4);
date4=read_ds1302(0x87);
dat1=(date4&0x0f);
dat2=(date4>>4);
date5=read_ds1302(0x89);
month1=(date5&0x0f);
month2=(date5>>4);
date6=read_ds1302(0x8b);
day1=(date6&0x0f);
date7=read_ds1302(0x8d);
year1=(date7&0x0f);
year2=(date7>>4);
write_com(0xc0+15);
write_date(table5[sec1]);
write_com(0xc0+14);
write_date(table5[sec2]);
write_com(0xc0+13);
write_date(\':\');
write_com(0xc0+12);
write_date(table5[min1]);
write_com(0xc0+11);
write_date(table5[min2]);
write_com(0xc0+10);
write_date(\':\');
write_com(0xc0+5);
write_date(table5[day1]);
write_com(0x80+15);
write_date(table5[dat1]);
write_com(0x80+14);
write_date(table5[dat2]);
write_com(0x80+13);
write_date(\'-\');
write_com(0x80+12);
write_date(table5[month1]);
write_com(0x80+11);
write_date(table5[month2]);
write_com(0x80+10);
write_date(\'-\');
write_com(0x80+9);
write_date(table5[year1]);
write_com(0x80+8);
write_date(table5[year2]);
}
/*void keyscan()
{
uchar num;
if(key1==0)
{
delay(5);
if(key1==0)
{
num++;
while(!key1);
if(num==1)
{
write_com(0x80+0x40+15);
write_com(0x0f);
}
if(num==2)
{
write_com(0x80+0x40+12);
}
if(num==3)
{
write_com(0x80+0x40+9);
}
if(num==4)
{
write_com(0x80+15);
}
if(num==5)
{
write_com(0x80+12);
}
if(num==6)
{
write_com(0x80+0x40+5);
}
if(num==7)
{
write_com(0x80+9);
}
if(num==8)
{
num=0;
write_com(0x0c);
}
}
}
if(num!=0)
{
if(key2==0)
{
delay(5);
if(key2==0)
{
while(!key2);
if(num==1)
{
date1++;
if(date1==60)
date1=0;
write_sfm(14,date1);
write_com(0x80+0x40+15);
}
if(num==2)
{
date2++;
if(date2==60)
date2=0;
write_sfm(11,date2);
write_com(0x80+0x40+12);
}
if(num==3)
{
date3++;
if(date3==24)
date3=0;
write_sfm(8,date3);
write_com(0x80+0x40+9);
}
if(num==4)
{
date4++;
if(date4==32)
date4=1;
write_nyr(14,date4);
write_com(0x80+15);
}
if(num==5)
{
date5++;
if(date5==13)
date5=1;
write_nyr(11,date5);
write_com(0x80+12);
}
if(num==6)
{
date6++;
if(date6==8)
date6=1;
write_date(0x30+day);
write_com(0x80+0x40+5);
}
if(num==7)
{
date7++;
if(date7==100)
date7=0;
write_nyr(8,date2);
write_com(0x80+7);
}
}
}
if(key3==0)
{
delay(5);
if(key3==0)
{
while(!key3);
if(num==1)
{
date1--;
if(date1==-1)
date1=59;
write_sfm(14,date1);
write_com(0x80+0x40+15);
}
if(num==2)
{
date2--;
if(date2==-1)
date2=59;
write_sfm(11,date2);
write_com(0x80+0x40+12);
}
if(num==3)
{
date3--;
if(date3==-1)
date3=23;
write_sfm(8,date3);
write_com(0x80+0x40+9);
}
if(num==4)
{
date4--;
if(date4==0)
date4=31;
write_nyr(14,date4);
write_com(0x80+15);
}
if(num==5)
{
date5--;
if(date5==0)
date5=1;
write_nyr(11,date5);
write_com(0x80+12);
}
if(num==6)
{
date6--;
if(date6==0)
date6=7;
write_date(0x30+day);
write_com(0x80+0x40+5);
}
if(num==7)
{
date7--;
if(date7==-1)
date7=99;
write_nyr(8,date2);
write_com(0x80+7);
}
}
}
}
} */
void main()
{
lcd1602_init();
delay(5);
ds1302_init();
delay(5);
while(1)
{
//keyscan;
display();
}
}