代码部分有比较详细的注释,这里就不对每一个部分分别做介绍了。有问题欢迎在评论区留言。

#include <REGX52.H>
sbit dula=P2^6;//声明U1锁存器的锁存端
sbit wela=P2^7;//声明U2锁存器的锁存端
sbit rs=P3^5;//lcd数据命令选择端,0写数据,1写命令
sbit lcden=P3^4;//控制LCD的使用
sbit s1=P3^0;//s9
sbit s2=P3^1;//s13
sbit s3=P3^2;//s17
sbit rd=P3^7;//置低电平后分离出第4列四个独立按键
unsigned char count,s1num;
char hour,min,sec,months,weeks,days,comparemonth,m;
unsigned int years;
unsigned char code table1[]="  2022-02-28 MON";
unsigned char code table2[]="    00:00:00";
int code month[12]={31,28,31,30,31,30,31,31,30,31,30,31};//每个月天数  第二月有两种情况 运用时闰年判断下后处理
char code *week[7]={"SUN","MON","TUE","WED","THU","FRI","SAT"};       //每周一天英文缩写  从星期天开始
void delay(unsigned int n)//延时函数,单位为毫秒
{unsigned char i, j;while(n--){i = 2;j = 199;do{while (--j);} while (--i);}
}
void write_com(unsigned char com)//写指令
{rs=0;lcden=0;P0=com;delay(5);lcden=1;delay(5);lcden=0;
}
void write_date(unsigned char date)//初始化时写数据写数据
{rs=1;lcden=0;P0=date;delay(5);lcden=1;delay(5);lcden=0;
}void init()//初始化显示时间和日期
{unsigned char num;dula=0;wela=0;lcden=0;write_com(0x38);write_com(0x0c);//开显示 不显示光标write_com(0x06);//写一个字符后地址指针加1write_com(0x01);//显示清零write_com(0x80);//控制写入第一行for(num=0;num<17;num++){write_date(table1[num]);delay(5);}write_com(0x80+0x40);//控制写入第二行for(num=0;num<12;num++){write_date(table2[num]);delay(5);}TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1;TR0=1;
}void write_time(unsigned char line,unsigned char add, unsigned char date)//修改时写数据
{unsigned char shi,ge;//十位与个位shi=date/10;ge=date%10;write_com(0x80+(line-1)*0x40+add);  //根据行数和add参数定位写数据位置             write_date(0x30+shi);      //输出十位字符write_date(0x30+ge);     //输出个位字符
}void calweek()//计算周几的函数
{char i; //显示字符串 for 循环用if(months==1 || months==2)      //如果是1 2月份,要看成前一年的13 14月{m=months+12;years--;}else m=months;weeks=(days+2*m+3*(m+1)/5+years+years/4-years/100+years/400+1)%7;       //基姆拉尔森公式算星期几write_com(0x80+13);for(i=0;i<3;i++)              //for循环写入字符串每一个字符{           write_date(week[weeks][i]);delay(5);}
}void day_add()
{comparemonth=month[months-1];if(months==2)           //闰年二月29天{if(years%4==0)comparemonth=29;}   days++;if(days>comparemonth)        //days超过当月天数 回归1日 月份加一{days=1;months++;if(months>12)                             //加一年{months=1;years++;if(years%100==0)                                //加一个世纪{write_time(1,3,years/100);      //年份后两位进位仅前两位更新}write_time(1,5,years%100);       //年份后两位没进位,只要更新后两位}write_time(1,8,months);     //更新月份}write_time(1,11,days);             //更新天数calweek();                //计算周几
}void keyscan_time()
{rd=0;if(s1==0)//按下s9{delay(5);if(s1==0){s1num++;while(!s1);if(s1num==1)//光标移动到秒位{TR0=0;write_com(0x80+0x40+11);write_com(0x0f);}}switch (s1num){case 2: write_com(0x80+0x40+8);                              //分write_com(0x0f); break;case 3: write_com(0x80+0x40+5);                             //时write_com(0x0f); break;case 4: write_com(0x80+11);                               //天write_com(0x0f);    break;case 5: write_com(0x80+8);                                //月write_com(0x0f);    break;              case 6: write_com(0x80+5);                                  //年write_com(0x0f);    break;              case 7: s1num=0;  write_com(0x0c);//光标不闪烁  TR0=1;break;}}if(s1num!=0){if(s2==0){delay(5);if(s2==0)//按下s9,实现对时钟的调节(数值增大){while(!s2);if(s1num==1)//对秒进行修改{sec++;if(sec==60)sec=0;write_time(2,10,sec);write_com(0x80+0x40+11);}if(s1num==2)//对分钟进行修改{min++;if(min==60)min=0;write_time(2,7,min);write_com(0x80+0x40+8);}if(s1num==3)//对小时进行修改{hour++;if(hour==24)hour=0;write_time(2,4,hour);write_com(0x80+0x40+5);}comparemonth=month[months-1];if(months==2)     {   if(years%4==0)    comparemonth=29;   }    //闰年二月29天if(s1num==4)//对天的修改{    days++;if(days>comparemonth)  days=1;write_time(1,10,days);write_com(0x80+11);}if(s1num==5)//对月的修改{months++;if(months>12)         months=1;write_time(1,7,months); write_com(0x80+8);}if(s1num==6)//对年的修改{years++;if(years%100==0){write_time(1,2,years/100);  //年份后两位进位就增加年份前两位更新write_com(0x80+3);}else{write_time(1,4,years%100);       //年份后两位没进位,只要更新后两位write_com(0x80+5);}}calweek();                       //计算周几并更新      }}if(s3==0)//按下s17,实现对时钟的调节(数值减小){delay(5);if(s3==0){while(!s3);if(s1num==1){sec--;if(sec==-1)sec=59;write_time(2,10,sec);write_com(0x80+0x40+11);}if(s1num==2){min--;if(min==-1)min=59;write_time(2,7,min);write_com(0x80+0x40+8);}if(s1num==3){hour--;if(hour==-1)hour=23;write_time(2,4,hour);write_com(0x80+0x40+5);}comparemonth=month[months-1];  //comparemonth除了2月不确定,其他每月天数都是数组中的数字if(months==2)       {   if(years%4==0)    comparemonth=29;   }    //闰年二月29天if(s1num==4){days--;if(days==0)  days=comparemonth;write_time(1,10,days);             //更新天数write_com(0x80+11);}if(s1num==5){if(months==0)      months=12; write_time(1,7,months);     //更新月份write_com(0x80+8);}if(s1num==6){if(years%100==0){write_time(1,2,years/100);  //年份后两位进位就增加年份前两位更新write_com(0x80+3);}else{write_time(1,4,years%100);       //年份后两位没进位,只要更新后两位write_com(0x80+5);}}calweek();                       //计算周几并更新       }}}
}
void main()
{init();while(1){keyscan_time();}
}void timer0()interrupt 1//中断函数
{TH0=(65536-50000)/256;TL0=(65536-50000)%256;count++;if(count==18){count=0;sec++;if(sec==60){sec=0;min++;if(min==60){min=0;hour++;if(hour==24){hour=0;day_add();}write_time(2,4,hour);}write_time(2,7,min);}write_time(2,10,sec);}
}

51单片机利用液晶制作一个时钟相关推荐

  1. 51单片机课程设计——利用51单片机的定时器设计一个时钟论文

    计科在读,分享自己做过的作业,欢迎指正,有需要课程设计论文的可以私信我 摘要 单片机是一种数字集成电路芯片,是指集成在一块芯片上的微型计算机.一个比较完整的单片机应该包括微处理器(CPU). 存储器( ...

  2. 简单利用lce1602制作一个时钟

    利用所学的单片机知识LCD1602的知识及电路知识编程实现单片机I/O 口控制 LCD1602 的显示时钟 main.c #include <REGX52.H> #include < ...

  3. HTML5实现一个时钟动画,利用html5制作一个时钟动画效果

    我们先来看下效果图(不考虑颜色搭配): (学习视频分享:html5视频教程) 我们首先要理解如何去实现这个时钟,暂时不要考虑动画,学着将问题进行拆解,一步一步实现. 首先我们需要画个方形,有个边框,给 ...

  4. 电子时钟万年历+51单片机+1602液晶屏+DS1302+DS18B20+按键

    电子时钟万年历+51单片机+1602液晶屏+DS1302+DS18B20+按键 这次课程设计要完成的是制作一个基于51单片机的电子时钟的万年历(protues仿真),需要用到1602液晶屏+DS130 ...

  5. html插入flash时钟,教你利用Flash制作一个会走动的时钟(时针,分针,秒针)

    其实制作时钟的方法很多,在此小编利用Flash也制作一个时钟,就当是学习CS3语言的编程技巧吧.下面是具体的实现步骤. 工具/原料 Adobe Flash CS3 方法/步骤 1.新建一Flash文档 ...

  6. 基于51单片机万年历可调电子时钟闹钟温度(实物图+源码+仿真+原理图+论文)

     资料编号:038 硬件构成:51单片机+最小系统+LCD1602液晶显示模块+时钟模块+温度采集模块+蜂鸣器模块+按键模块 1.采用LCD1602液晶屏显示.DS1302时钟芯片和DS18B20温度 ...

  7. 【51单片机】DAC0832制作信号发生器(方波,三角波,锯齿波)

    [51单片机]DAC0832制作信号发生器(方波,三角波,锯齿波) 1 A/D与D/A 2 电路与元器件 3 源代码 3.1 程序开始 3.2 监视按钮操作 3.3 按钮控制显示波形 3.4 方波产生 ...

  8. 51单片机之点亮一个灯

    51单片机之点亮#一个灯#流水灯#交通灯 接下来的学习将主要转为使用keil编程,并使用proteus进行仿真,推荐有条件的同学可以购买一个板子进行实物的练习    发光二极管常用来指示系统工作状态, ...

  9. 基于51单片机的无线遥控器制作

    基于51单片机的无线遥控器制作 资源链接:https://download.csdn.net/download/qq_41676952/10965512 目前单片机渗透到我们生活的各个领域,几乎很难找 ...

最新文章

  1. jupyter notebook运行没反应_搭建Jupyter Notebook远程云服务器(Jupyter配置)
  2. 论海明威的存在主义宗教意识——存在主义虚无主义。注:部分观点个人不赞同...
  3. nacos集群之日志狂刷fail to connect server,after trying 567 times,last try server is...
  4. Training RNNs as Fast as CNNs
  5. Flink 在小红书推荐系统中的应用
  6. 第十三章:Java_反射机制
  7. 开学一月,可以自己玩自己做的游戏了!!!
  8. Iptables详解+实例
  9. mysql 命令行批量sql_命令行中执行批量SQL的方法
  10. 【oracle11g,17】存储结构: 段的类型,数据块(行连接、行迁移,块头),段的管理方式,高水位线...
  11. java 中缀式转后缀式
  12. 我喜欢的 Linux shell 玩法
  13. PHP是迄今为止最好的web平台
  14. 数据-第8课-线性表的链式存储结构(未)
  15. Cuba在Linux(Ubuntu)的安装
  16. 用HTML制作一个好看的网页模板
  17. 名帖72 颜真卿 楷书《竹山堂连句》
  18. C语言中的指针应用,函数指针,指针函数,结构体中定义函数指针。
  19. http劫持软件、怎么应对这样的 HTTP 劫持
  20. 通信线路工程验收规范_一级建造师市政涉及到的相关规范汇总

热门文章

  1. 软件技术专业大学生该如何制定职业综合能力提升计划
  2. win10 ad用户 计算机名,更改 AD 用户的显示名称 - Windows Server | Microsoft Docs
  3. OpenGL 编程实践 之 改变屏幕分辨率和颜色深度
  4. 【SMS】SMS协议介绍之IP-SM-GW
  5. web页面上传大文件有没有好的解决方案
  6. 华为emui3.1 android,【华为P8评测】EMUI3.1:安卓5.0 细节有优化 _手机评测-中关村在线...
  7. python 运算阶乘的代码_Python阶乘求和的代码详解
  8. 业内专家长篇综述:6G最新进展及未来发展趋势
  9. 一款好的游戏开发IDE是什么样子?Rider使用体验和建议
  10. 不是我们选择了年龄焦虑,是大厂焦虑了我们