网上的DS1302与1602调配的程序许多都有很大问题。我写个全的,并且写得很细,让我们看看好了解,端口自己修正即可
#include#include /*********************************端口界说**********************************/sbit sclk = P3^4;sbit io= P3^3;sbit rst= P3^5;sbit rs=P1^0;sbit en=P1^2;sbit rw=P1^1;#define uchar unsigned char#define uint unsigned intuchar flag,second,minute,hour,week,day,month,year;//秒、分、时、星期、日、月、年void delay(uint z) //延时子程序{uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void delayus(){_nop_();_nop_();_nop_();_nop_();}void write_1602dat(uchar dat)//界说一个带参数的写数据子程序{rs=1; //1602的rs为0时,接纳指令,为1时接纳数据P0=dat;//把void write_shu(uchar shu)中的COM中的数据给P0口delay(5);en=1;delay(5);en=0;delay(5);}void write_1602com(uchar com)//界说一个带参数的写指令子程序{rs=0; //1602的rs为0时,接纳指令,为1时接纳数据P0=com;//把void write_com(uchar com)中的COM中的数据给P0口delay(5);en=1;delay(5);en=0;delay(5);}void Write1602(uchar add,uchar dat){write_1602com(add);write_1602dat(dat);}void init1602()//界说一个初始化子程序{en=0;rw=0;write_1602com(0x38);//调用 write_com子程序并把0x38赋给P0口,显现形式翻开write_1602com(0x0e);//调用 write_com子程序并把“开显现,显现光标,光标闪耀”指令码赋给P0口write_1602com(0x06);//调用 write_com子程序并把“地址指针加1,整屏不移动”指令码赋给P0口//write_com(0x80+0x10);//数据指针初始化,让指针指向可显现的最右端write_1602com(0x80);//数据指针初始化,让指针指向最左端,显现从榜首行开端write_1602com(0x01);//调用 write_com子程序并把"清零指"令码赋给P0口Write1602(0x80,2);Write1602(0x81,0);Write1602(0x80+4,-);Write1602(0x80+7,-);Write1602(0x80+0x40+5,:);Write1602(0x80+0x40+8,:);}/********************写一个字节**************/void write_1302byte(dat){uchar i;sclk=0;delayus();for(i=8;i>0;i--){io=dat&0x01;//只要是从低位取数,向高位必定要和0X01与delayus();sclk=1;//为写数据制作上升沿。delayus();sclk=0;//为下一次上升沿写下一个字节做预备dat>>=1;//将数据向左移一位,预备写入下一个数据}}/********************读一个字节***************/uchar read_1302byte(){uchar i,dat;delayus();for(i=8;i>0;i--){dat>>=1;if(io==1){dat|=0x80;//将1取出,写在dat的最高位。}sclk=1;//把sclk拉高,为读一个字节的下降沿做预备delayus;//稍等制作一个高电平sclk=0;//为读一个字节制作下降沿delayus;}return dat;}/*************写入一个时间位*****************/void write_1302(uchar add,uchar dat){rst=0;delayus();sclk=0;delayus();rst=1;write_1302byte(add);delayus();write_1302byte(dat);delayus();rst=0;}/****************读1302的地址******************/uchar read_1302add(uchar add){uchar timedat;rst=0;_nop_();sclk=0;_nop_();rst=1;write_1302byte(add);//写入要读的地址timedat=read_1302byte();//将上面地址中的数据赋给timedatsclk=1;_nop_();rst=0;return timedat;}/****************初始化1302*********************/void init_1302(){flag=read_1302add(0x81);//读秒寄存器的最高位,读出时钟状况if(flag&0x80)//判别时钟是否封闭,若内部封闭,则初始,若没封闭,不初始化,还在走{write_1302(0x8e,0x00);//去除写保护write_1302(0x80,((55/10)<<4|(55%10)));//写秒寄存器,并写入初值55write_1302(0x82,((59/10)<<4|(55%10)));//写分寄存器,并写入初值59write_1302(0x84,((22/10)<<4|(22%10)));//写小时寄存器,并写入初值23write_1302(0x86,((24/10)<<4|(24%10)));//写日寄存器,并写入初值18write_1302(0x88,((2/10)<<4|(2%10)));//写月寄存器,并写入初值2write_1302(0x8a,((5/10)<<4|(5%10)));//写周寄存器,并写入初值5write_1302(0x8c,((12/10)<<4|(12%10)));//写年寄存器,并写入初值12,不能写2012年write_1302(0x90,0xa5);//写充电方法write_1302(0x8e,0x80);//加上写保护}}