还剩10页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
#includereg
51.h#includeintrins.h__itRS=P2^0;__itRW=P2^1;__itE=P2^2;__itBF=P0^7;unsignedcharflag;unsignedchartime[]={time:};unsignedcharmon[]={Mon};unsignedchartus[]={Tus};unsignedcharwed[]={Wed};unsignedcharthur[]={Thur};unsignedcharfri[]={Fri};unsignedcharsat[]={Sat};unsignedcharsun[]={Sun};//寄存器宏定义#defineWRITE_SECOND0x80#defineWRITE_MINUTE0x82#defineWRITE_HOUR0x84#defineREAD_SECOND0x81#defineREAD_MINUTE0x83#defineREAD_HOUR0x85#defineWRITE_PROTECT0x8E#defineWRITE_DAY0x86#defineWRITE_MONTH0x88#defineWRITE_YEAR0x8c#defineWRITE_WEEK0x8a#defineREAD_DAY0x87#defineREAD_MONTH0x__#defineREAD_YEAR0x8d#defineREAD_WEEK0x8b//位寻址寄存器定义__itACC_7=ACC^7;//管脚定义__itSCLK=P3^1;//DS1302时钟__7脚__itDIO=P3^2;//DS1302数据__6脚__it__=P3^0;//DS1302片选5脚/***********************函数功能延时1ms***********************/voiddelay1ms{unsignedcharij;fori=0;i10;i++forj=0;j33;j++;}/************************函数功能延时n毫秒入口参数n************************/voiddelay__sunsignedcharn{unsignedchari;fori=0;in;i++delay1ms;}/************************************函数功能判断液晶模块的忙碌状态返回值resultresult=1,忙碌;result=0,不忙************************************/bitBusyTestvoid{bitresult;RS=0;//根据规定,RS为低电平、RW为高电平时,可以读状态RW=1;E=1;//E=1,才允许读/写_nop_;_nop_;_nop_;_nop_;result=BF;//将忙碌标志电平赋给resultE=0;returnresult;}/*************************************函数功能将模式设置指令或显示地址写入液晶模块入口参数:dictate**************************************/voidWriteInstructionunsignedchardictate{whileBusyTest==1;//如果忙就等待RS=0;//根据规定,RS和R/W同为低电平时,可以写入指令RW=0;E=0;_nop_;_nop_;P0=dictate;//将数据送入P0口,即写入指令或地址_nop_;_nop_;_nop_;_nop_;E=1;//E置高电平_nop_;_nop_;_nop_;_nop_;E=0;}/*****************************************函数功能指定字符显示的实际地址入口参数:xy*****************************************/voidWriteAddressunsignedcharxunsignedchary{unsignedchartemp;ifx==0{switchy{case0:temp=0x00;break;case1:temp=0x01;break;case2:temp=0x02;break;case3:temp=0x03;break;case4:temp=0x04;break;case5:temp=0x05;break;case6:temp=0x06;break;case7:temp=0x07;break;case8:temp=0x08;break;case9:temp=0x09;break;case10:temp=0x0a;break;case11:temp=0x0b;break;case12:temp=0x0c;break;case13:temp=0x0d;break;case14:temp=0x0e;break;case15:temp=0x0f;break;}}ifx==1{switchy{case0:temp=0x40;break;case1:temp=0x41;break;case2:temp=0x42;break;case3:temp=0x43;break;case4:temp=0x44;break;case5:temp=0x45;break;case6:temp=0x46;break;case7:temp=0x47;break;case8:temp=0x48;break;case9:temp=0x49;break;case10:temp=0x4a;break;case11:temp=0x4b;break;case12:temp=0x4c;break;case13:temp=0x4d;break;case14:temp=0x4e;break;case15:temp=0x4f;break;}}WriteInstructiontemp|0x80;//显示位置的确定方法规定为“80H+地址码x”}/*****************************************函数功能将数据(字符的标准ASCII码)写入液晶模块入口参数y*****************************************/voidWriteDataunsignedchary{whileBusyTest==1;RS=1;//RS为高电平,RW为低电平时,可以写入数据RW=0;E=0;P0=y;//将数据送入P0口,即将数据写入液晶模块_nop_;_nop_;_nop_;_nop_;E=1;_nop_;_nop_;_nop_;_nop_;E=0;//当E由高电平跳变成低电平时,液晶模块开始执行指令}/*****************************************函数功能对LCD的显示模式进行初始化设置*****************************************/voidLcdInitiatevoid{delay__s15;//延时15ms,首次写指令时应给LCD一段较长的反应时间WriteInstruction0x38;//显示模式设置delay__s5;WriteInstruction0x38;delay__s5;WriteInstruction0x38;delay__s5;WriteInstruction0x0c;//显示模式设置显示开,无光标,光标不闪烁delay__s5;WriteInstruction0x06;//显示模式设置光标右移,字符不移delay__s5;WriteInstruction0x01;//清屏幕指令,将以前的显示内容清除delay__s5;}/*地址、数据发送子程序*/voidWrite1302unsignedcharaddrdat{unsignedcharitemp;__=0;//__引脚为低,数据传送中止SCLK=0;//清零时钟总线__=1;//__引脚为高,逻辑控制有效//发送地址fori=8;i0;i--//循环8次移位{SCLK=0;temp=addr;DIO=bittemp0x01;//每次传输低字节addr=1;//右移一位SCLK=1;}//发送数据fori=8;i0;i--{SCLK=0;temp=dat;DIO=bittemp0x01;dat=1;SCLK=1;}__=0;}/*数据读取子程序*/unsignedcharRead1302unsignedcharaddr{unsignedcharitempdat1dat2;__=0;SCLK=0;__=1;//发送地址fori=8;i0;i--//循环8次移位{SCLK=0;temp=addr;DIO=bittemp0x01;//每次传输低字节addr=1;//右移一位SCLK=1;}//读取数据fori=8;i0;i--{ACC_7=DIO;SCLK=1;ACC=1;SCLK=0;}__=0;dat1=ACC;dat2=dat1/16;//数据进制转换dat1=dat1%16;//十六进制转十进制dat1=dat1+dat2*10;returndat1;}/*初始化DS1302*/voidinitial1302void{Write1302WRITE_PROTECT0X00;//禁止写保护Write1302WRITE_SECOND0x56;//秒位初始化Write1302WRITE_MINUTE0x34;//分钟初始化Write1302WRITE_HOUR0x12;//小时初始化Write1302WRITE_DAY0x12;Write1302WRITE_MONTH0x12;Write1302WRITE_YEAR0x00;Write1302WRITE_WEEK0x01;Write1302WRITE_PROTECT0x80;}/******************************lcd时钟显示子程序****************************/voiddisplay_clock{unsignedchari;WriteAddress10;i=0;whiletime[i]!=\0{WriteDatatime[i];i++;delay__s20;}WriteAddress05;WriteData:;delay__s20;WriteAddress08;WriteData:;delay__s20;WriteAddress19;WriteData:;delay__s20;WriteAddress112;WriteData:;delay__s20;}voiddisplay_year{unsignedcharyeary1y2;year=Read1302READ_YEAR;y1=year/10+48;y2=year%10+48;WriteAddress01;WriteData2+48;delay__s20;WriteAddress02;WriteData48;delay__s20;WriteAddress03;WriteDatay1;delay__s20;WriteAddress04;WriteDatay2;delay__s20;}voiddisplay_month{unsignedcharmonthm1m2;month=Read1302READ_MONTH;m1=month/10+48;m2=month%10+48;WriteAddress06;WriteDatam1;delay__s20;WriteAddress07;WriteDatam2;delay__s20;}voiddisplay_day{unsignedchardayd1d2;day=Read1302READ_DAY;d1=day/10+48;d2=day%10+48;WriteAddress09;WriteDatad1;delay__s20;WriteAddress010;WriteDatad2;delay__s20;}voiddisplay_week{unsignedcharijkabcdweek;week=Read1302READ_WEEK;WriteAddress012;switchweek{case1:whilemon[i]!=\0{WriteDatamon[i];i++;delay__s20;};break;case2:whiletus[j]!=\0{WriteDatatus[j];j++;delay__s20;};break;case3:whilewed[k]!=\0{WriteDatawed[k];k++;delay__s20;};break;case4:whilethur[a]!=\0{WriteDatathur[a];a++;delay__s20;};break;case5:whilefri[b]!=\0{WriteDatafri[b];b++;delay__s20;};break;case6:whilesat[c]!=\0{WriteDatasat[c];c++;delay__s20;};break;case7:whilesun[d]!=\0{WriteDatasun[d];d++;delay__s20;};break;default:;}}voiddisplay_hour{unsignedcharhourh1h2;hour=Read1302READ_HOUR;h1=hour/10+48;h2=hour%10+48;WriteAddress17;WriteDatah1;delay__s20;WriteAddress18;WriteDatah2;delay__s20;}voiddisplay_second{unsignedcharseconds1s2;second=Read1302READ_SECOND;s1=second/10+48;s2=second%10+48;WriteAddress113;WriteDatas1;delay__s20;WriteAddress114;WriteDatas2;delay__s20;}voiddisplay_minute{unsignedcharminutem1m2;minute=Read1302READ_MINUTE;m1=minute/10+48;m2=minute%10+48;WriteAddress110;WriteDatam1;delay__s20;WriteAddress111;WriteDatam2;delay__s20;}/****************主函数****************/void__in{TR0=1;EA=1;ET0=1;IT0=1;TMOD=0x01;TH0=0x3c;TL0=0xb0;LcdInitiate;initial1302;display_clock;flag=20;while1{ifflag==20{flag=0;display_year;display_month;display_day;display_week;display_hour;display_minute;display_second;}}}voidtimer0_intinterrupt1{TH0=0x3c;TL0=0xb0;flag++;}。