作者 张小波
Write_Byte_TO_DS1302(addr); //向DS1302写入一个地址
dat=Read_Byte_FROM_DS1302(); //在上面写入的地址中读取数据 CLK=1; RST=0;
return dat; }
//------------------------------------------------------------- //向DS1302指定位臵写入数据, 写数据
//---------------------------------------------------------------
void Write_Data_TO_DS1302(uchar addr,uchar dat) // 向DS1302指定位臵写入数据, 写数据 {
CLK=0; RST=1;
Write_Byte_TO_DS1302(addr); Write_Byte_TO_DS1302(dat); CLK=1; RST=0; }
//----------------------------------------------------------- // 设臵时间
//--------------------------------------------------------- void SET_DS1302() // 设臵时间 {
uchar i;
Write_Data_TO_DS1302(0x8E,0x00); //写控制字,取消写保护 // 分,时,日,月,年依次写入 for(i=1;i<7;i++) {
// 分的起始地址是10000010(0x82),后面依次是时,日,月,周,年,写入地址每次递增2 Write_Data_TO_DS1302(0x80+2*i,(DateTime[i]/10<<4)|(DateTime[i])); }
Write_Data_TO_DS1302(0x8E,0x80); //写控制字,加写保护 }
//-------------------------------------------------------- // 读取当前时间
//------------------------------------------------------- void GetTime() // 读取当前时间 {
uchar i;
for(i=0;i<7;i++) {
DateTime[i]=Read_Data_FROM_DS1302(0x81+2*i); } }
作者 张小波
//------------------------------------------------------------ //日期与时间值转换为数字字符
//------------------------------------------------------------- void Format_DateTime(uchar d,uchar *a) {
a[0]=d/10+'0'; a[1]=d+'0'; }
//------------------------------------------------------------------- // 判断是否为闰年
//------------------------------------------------------------------- uchar Is_Leapyear(uint year) {
return (year%4==0&&year0!=0)||(year@0==0) ; }
//------------------------------------------------------------------ // 求自2000.1.1开始的任何一天是星期几?
//---------------------------------------------------------------------- void Refresh_Week_Day() {
uint i,d,w=5; //已知1999年12.31是星期五 for(i=2000;i<2000+DateTime[6];i++) {
d=Is_Leapyear(i)?366:365; w=(w+d)%7; } d=0;
for (i=1;i //保存星期,0-6表示星期日,星期一至星期六,为了与DS1302的星期格式匹配,返回值需要加1 DateTime[5]=(w+d)%7+1; } //------------------------------------------------- //年,月,日和时,分++/-- //---------------------------------------------------- void Datetime_Adjust(char X) { switch(Adjust_Index) { case 6: //年调整,00-99 if(X==1&&DateTime[6]<99) { DateTime[6]++; 作者 张小波 } if(X==-1&&DateTime[6]>0) { DateTime[6]--; } //获取2月天数 MonthsDays[2]=Is_Leapyear(2000+DateTime[6])?29:28; //如果年份变化后当前月份的天数大于上限则设为上限 if(DateTime[3]>MonthsDays[DateTime[4]]) { DateTime[3]=MonthsDays[DateTime[4]]; } Refresh_Week_Day(); //刷新星期 break; case 4: //月调整 01-12 if(X==1&&DateTime[4]<12) { DateTime[4]++; } if(X==-1&&DateTime[4]>1) { DateTime[4]--; } //获取2月天数 MonthsDays[2]=Is_Leapyear(2000+DateTime[6])?29:28; //如果年份变化后当前月份的天数大于上限则设为上限 if(DateTime[3]>MonthsDays[DateTime[4]]) { DateTime[3]=MonthsDays[DateTime[4]]; } Refresh_Week_Day(); //刷新星期 break; case 3: // 日调整00-28或00-29或00-30或00-31 //调节之前首先根据当前年份得出该年中2月的天数 MonthsDays[2]=Is_Leapyear(2000+DateTime[6])?29:28; //根据当前月份决定调节日期的上限 if(X==1&&DateTime[3] DateTime[3]++; } if(X==-1&&DateTime[3]>0) { DateTime[3]--; } 作者 张小波 Refresh_Week_Day(); //刷新星期 break; case 2: // 时调整 if(X==1&&DateTime[2]<23) { DateTime[2]++; } if(X==-1&&DateTime[4]>0) { DateTime[2]--; } break; case 1: // 分调整 if(X==1&&DateTime[1]<59) { DateTime[1]++; } if(X==-1&&DateTime[4]>0) { DateTime[1]--; } break; } } //-------------------------------------------------------------- // 定时器0刷新LCD显示函数 //------------------------------------------------------------- void T0_INT()interrupt 1 { TH0=-50000/256; // 写入初值 TL0=-50000%6; // 写入初值 if(++tcount!=2) return; tcount=0; //按指定格式生成待显示的日期时钟 Format_DateTime(DateTime[6],LCD_DSY_BUFFER1+5); Format_DateTime(DateTime[4],LCD_DSY_BUFFER1+8); Format_DateTime(DateTime[3],LCD_DSY_BUFFER1+11); //星期 strcpy(LCD_DSY_BUFFER1+13,Week[DateTime[5]-1]); //时,分。秒 Format_DateTime(DateTime[2],LCD_DSY_BUFFER2+5); Format_DateTime(DateTime[1],LCD_DSY_BUFFER2+8); Format_DateTime(DateTime[0],LCD_DSY_BUFFER2+11); // 显示年、月、日、星期、时、分、秒 作者 张小波 LCD_Display(0x00,LCD_DSY_BUFFER1); LCD_Display(0x40,LCD_DSY_BUFFER2); } //---------------------------------------------------------- // 键盘中断处理函数 //--------------------------------------------------------- void EX_INT0()interrupt 0 { if(k1==0) { while (k1==0); if(Adjust_Index==-1||Adjust_Index==-1) {Adjust_Index=7;} Adjust_Index--; if(Adjust_Index==5) {Adjust_Index=4;} //跳过对星期的调节 LCD_DSY_BUFFER2[13]='['; LCD_DSY_BUFFER2[14]=Change_Flag[Adjust_Index]; LCD_DSY_BUFFER2[15]=']'; } else if(k2==0) // 加 { while(k2==0); Datetime_Adjust(1); } else if(k3==0) // 减 { while(k3==0); Datetime_Adjust(-1); } else if(k4==0) { while(k4==0); SET_DS1302(); LCD_DSY_BUFFER2[13]=' '; LCD_DSY_BUFFER2[14]=' '; LCD_DSY_BUFFER2[15]=' '; Adjust_Index=-1; //操作索引重设为-1,时间继续正常显示 } } 作者 张小波 作业: 1、 简述液晶显示的原理? 2、 简述1602字符型LCD的结构及其引脚功能? 3、 详细说明LCD1602的指令功能? 4、 简要说明数组的定义及命名规则? 5、 如何对数组元素进行初始化? 6、 单片机I/O扩展有哪些芯片? 7、 简述8155的结构及其引脚功能?