第一范文网 - 专业文章范例文档资料分享平台

基于AT89C51单片机的电子万年历的设计

来源:用户分享 时间:2025/6/28 5:22:39 本文由loading 分享 下载这篇文档手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:xxxxxxx或QQ:xxxxxx 处理(尽可能给您提供完整文档),感谢您的支持与谅解。

}

RS=0;RW=1;EN=1; //输出:D0~D7=状态字 DelayMS(1); state=P0;

//从P0口读LCD状态

EN = 0;DelayMS(1); return state;

//-----------忙等待------------------// void LCD_Busy_Wait() {

while((Read_LCD_State()&0x80)==0x80);

DelayMS(5);

}

//-----------向LCD写数据------------------// void Write_LCD_Data(uchar dat) {

LCD_Busy_Wait(); }

//-------------写LCD指令-------------------// void Write_LCD_Command(uchar cmd) {

LCD_Busy_Wait(); }

//-------------LCD初始化-------------------// void Init_LCD() {

RS=0;EN=0; RW=0; //写指令,EN高脉冲,输出:D0~D7=数据 P0=cmd;EN=1;DelayMS(1);EN=0;

RS=1;EN=0;RW=0;

//写数据,EN为高脉冲,

P0=dat;EN=1;DelayMS(1);EN=0;

20

Write_LCD_Command(0x38); //设置16*2显示,5*7点阵,8位数据接口 }

//------------------------------------------ //设置液晶显示位置

//------------------------------------------ void Set_LCD_POS(uchar p){ }

//----在LCD上显示字符串---------// void Display_LCD_String(uchar p,uchar *s) { }

//---------日期与时间值转换为数字字符----------------// void Format_DateTime(uchar d,uchar *a) {

a[0]=d/10+'0';

uchar i;

Write_LCD_Command(p|0x80);//相当于在0x80基础上加入位置量 DelayMS(1);

Write_LCD_Command(0x01); //显示清零,数据指针清零 DelayMS(1);

Write_LCD_Command(0x06); //写一个字符后地址指针自动加1 DelayMS(1);

Write_LCD_Command(0x0c); //设置开显示,不显示光标 DelayMS(1);

Set_LCD_POS(p); for(i=0;i<16;i++) { }

Write_LCD_Data(s[i]); //在固定位置显示时间日期 DelayMS(1);

21

a[1]=d+'0';

}

//判断是否为闰年 uchar isLeapYear(uint y)

{ return (y%4==0&&y0!=0)||(y@0==0);} //求自2000.1.1开始的任何一天是星期几 //函数没有通过,求出总天数后再求星期几 //因为求总天数可能会超出uint的范围 void RefreshWeekDay()

{ uint i,d,w=5; //已知1999.12.31是周五

for(i=2000;i<2000+DateTime[6];i++) { } d=0;

for(i=1;i

//保存星期,0~6表示星期日,星期一,二,...,六,为了与DS1302的期

d=isLeapYear(i)?366:365; w=(w+d)%7;

格式匹配,返回值需要加

DateTime[5=(w+d)%7+1;

//*****年月日时分++/--********// void DateTime_Adjust(char x) {

{

case 6:

//年00-99

switch(Adjust_Index)

if(x==1&&DateTime[6]<99) DateTime[6]++;

22

if(x==-1&&DateTime[6]>0) DateTime[6]--; //获取2月天数

MonthsDays[2]=isLeapYear(2000+DateTime[6])?29:28; //如果年份变化后当前月份的天数大于上限则设为上限 if(DateTime[3]>MonthsDays[DateTime[4]]) { DateTime[3]=MonthsDays[DateTime[4]];} RefreshWeekDay(); //刷新星期 break;

//月01-12

case 4:

if(x==1&&DateTime[4]<12) DateTime[4]++; if(x==-1&&DateTime[4]>1) DateTime[4]--;

MonthsDays[2]=isLeapYear(2000+DateTime[6])?29:28; if(DateTime[3]>MonthsDays[DateTime[4]]) { DateTime[3]=MonthsDays[DateTime[4]];} RefreshWeekDay(); break;

//日00-28、29、30、31,调节之前首先根据年份得出该

case 3:

年中二月的天数

MonthsDays[2]=isLeapYear(2000+DateTime[6])?29:28; //根据当前月份决定调节日期的上限

if(x==1&&DateTime[3]0) DateTime[3]--;

RefreshWeekDay(); break;

//时

case 2:

if(x==1&&DateTime[2]<23) DateTime[2]++; if(x==-1&&DateTime[2]>0) DateTime[2]--; break;

//分

case 1:

23

基于AT89C51单片机的电子万年历的设计.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.diyifanwen.net/c442rj81yxm9y6ym8bczs_6.html(转载请注明文章来源)
热门推荐
Copyright © 2012-2023 第一范文网 版权所有 免责声明 | 联系我们
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:xxxxxx 邮箱:xxxxxx@qq.com
渝ICP备2023013149号
Top