0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

利用单片机+OLED显示屏制作实时时钟

王子变青蛙_35400519 来源:王子变青蛙_35400519 作者:王子变青蛙_35400 2022-06-12 09:04 次阅读

目录

一、引言

二、硬件连接

三、软件介绍

1、主函数

(1)、按键控制函数

(2)、显示函数

2、定时器中断子程序

四、实物展示

五、源代码获取

一、引言

最近在学习OLED显示屏的应用,通过OLED显示时间、年、月、日,以及相关信息。还可以根据喜好添加不同的图片。可以自行设置时间,控制屏幕的亮灭从而减少电量的损耗。设计中我一共使用了六个端口,OLED显示屏占用两个端口,控制加减的按键使用了两个,控制屏幕的亮灭使用了一个。但程序中有一个缺陷,就是星期不会跟着日期的改变而改变,需要自己手动更改,后期如果我学会了再重新添加程序。

二、硬件连接

OLED显示器的连接与上两节使用的相同,如果制作实时时钟,需要再添加一个时钟芯片,本设计没有使用时钟芯片。四个按键,切换:P3^4,开关:P3^5,-:P3^6,+:P3^7.

三、软件介绍

1、主函数

(1)、按键控制函数

一共使用四个按键,第一个为”加“按键,第二个为“减”按键,第三个为”开关“按键,第四个为“模式选择”按键。

if(key2==0)//控制OLED屏幕亮灭
			{
				DelayUs2x(10);
				if(key2==0)
				{  num1++;  }
				while(!key2);
			}			
			if(num1==1){  OLED_Display_Off();	num=0;}//关闭
			if(num1==2)num1=0;
			if(num1==0)
			{
				OLED_Display_On();   //打开
			if(key3==0)//模式控制
				{
				DelayUs2x(10);
				if(key3==0)
				{  num++;  }
				while(!key3);
			   }
			
			if(key0==0)////加
			{
				DelayUs2x(10);
				if(key0==0)
				{
				   if(num==1){ hour++;if(hour>=24)hour=0; }//+
				   if(num==2){ minute++;if(minute>=60)hour=0; }//+	
           if(num==3){ year++; }//+
           if(num==4){ month++;if(month>=13)month=1; 
					                     if((month==1||month==3||month==5||month==7||month==8||month==10||month==12)&&date==31)date=30; 
                               if(month==2&&date>28)date=28; 					 }//+
           if(num==5){ date++;if((month==1||month==3||month==5||month==7||month==8||month==10||month==12)&&date>=32)date=1;	   //日
	                   else if(date>=31&&month==4||date>=31&&month==6||date>=31&&month==9||date>=31&&month==11)date=1;
					           else if(date>=29&&month==2)date=1; }//+	
           if(num==6){Q++;if(Q>=7)Q=0;}					 
				}
				while(!key0);
		  }
      if(key1==0)    //减
			{
			    DelayUs2x(10);
				if(key1==0)
				{  
				   if(num==1){ hour--;if(hour==255)hour=23; }//-
				   if(num==2){ minute--;if(minute==255)minute=59; }//-	
           if(num==3){ year--; }//-
           if(num==4){ month--;if(month==0)month=12; 
					                     if((month==1||month==3||month==5||month==7||month==8||month==10||month==12)&&date==31)date=30; 
                               if(month==2&&date>28)date=28;}//-
           if(num==5){ date--;if(date==0&&month==1||date==0&&month==3||date==0&&month==5||date==0&&month==7||date==0&&month==8||date==0&&month==10||date==0&&month==12)date=31;
                              else if(date==0&&month==4||date==0&&month==6||date==0&&month==9||date==0&&month==11)date=30;
                              else if(date==0&&month==2)date=28;	}//-	
           if(num==6){Q--;if(Q==255)Q=6;}					 
				}
				while(!key1);
			}	
			if(num==7)num=0;

num用来控制对年、月、日、时、分哪一位的修改,等于1对小时的修改,等于2对分钟的修改,等于3对年的修改,等于4对月的修改,等于5对年的修改,等于6返回。

(2)、显示函数

显示背景图片。背景图程序需要放在主循环之外。

OLED_DrawBMP(0,0,127,64,BMP1);	//生成图像

显示年、月、日、时、分、秒以及星期天。

 OLED_ShowNum(0,0,N,2,8);		//显示数字		
		OLED_ShowChinese(13,0,0,7);	//文字 年
				
		OLED_ShowNum(22,0,Y,2,8);		//显示数字		
        OLED_ShowChinese(35,0,1,7);	//文字 月
				
		OLED_ShowNum(46,0,R,2,8);		//显示数字		
        OLED_ShowChinese(59,0,2,7);	//文字 日	
				
		OLED_ShowNum(33,5,S,2,16);		//显示数字
		OLED_ShowString(50,5,":",16);   //显示字符串		
		OLED_ShowNum(57,5,F,2,16);		//显示数字
		OLED_ShowString(72,5,":",16);   //显示字符串		
		OLED_ShowNum(79,5,M,2,16);		//显示数字	
		
        OLED_ShowChinese(75,1,7,13);	//文字 星
        OLED_ShowChinese(88,1,8,13);	//文字 期
		OLED_ShowChinese(101,1,Q,13);	//文字 

2、定时器中断子程序

void Timer0_isr(void) interrupt 1
if(num==500)        //大致1s
   {
    num=0;
	  second++;
	if(second==60)  //秒到60,分钟加1
	 {
	  second=0;	  
	  minute++;
	  if(minute==60)//分钟到60,小时加1
	    {
		 minute=0;
		 hour++;
		 if(hour==24)//小时到24,回零
		  {
			 hour=0;
		   date++;Q++;
				if(Q==8)
					 Q=0;
		   if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)//月1,3,5,7,8,10,12
			 {
			    if(date==31)
					{
						date=0;
					   month++;
						if(month==12)
							month=0;
							year++;
					}				
			  }
			  if(month==4||month==6||month==9||month==11)//月4,6,9,11
				{
			    if(date==30)
					{
						date=0;
					   month++;
						if(month==12)
							month=0;
							year++;
					}				
			  }
				if(month==2)//月2
				{
	         if(year%4==0)
           {
					    if(date==29)
					      {
					       date=0;
					       month++;
						     if(month==12)
								 {
							      month=0;
							      year++;
								 }
					      }
					 }						 
			    else if(date==28)
					     {
						     date=0;
					       month++;
						     if(month==12)
						     { 
							     month=0;
							     year++;
						     }
					     }				
			  }
			}
		  }
	 }
   
  }

实际中不同月份中天数不相同,1、3、5、7、8、10、12为31天,4、6、9、11为30天,2月为28天。程序中通过循环累加来计算时间,并根据不同的月份采用不同的累加。

四、实物展示

https://live.csdn.net/v/213880

这次我采用了自己焊接的一个单片机最小系统,通过两节18650电池供电。通过稳压芯片将电压降至5V。

五、源代码获取

关注公众号“小小创客者”回复“OLED时钟”获得代码。若有错误欢迎指正。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6034

    文章

    44547

    浏览量

    634371
  • OLED
    +关注

    关注

    119

    文章

    6193

    浏览量

    224066
  • 实时时钟
    +关注

    关注

    4

    文章

    245

    浏览量

    65762
收藏 人收藏

    评论

    相关推荐

    #单片机 OLED显示屏 兑换的显示屏到了!#单片机

    OLED显示屏
    efans
    发布于 :2023年04月24日 16:51:22

    用51单片机驱动oled显示屏

    文章目录51单片机一.前言二.代码三.总结51单片机一.前言说起51,可以说是老古董了,刚开始接触单片机就是从51开始,今天就来用51单片机驱动ol
    发表于 07-15 07:11

    单片机显示屏时钟制作资料分享

    单片机显示屏时钟制作前言表盘处理获取表盘图片转换c文件前言主控采用k210单片机,屏幕为nt35310,采用image2lcd取模
    发表于 11-18 07:25

    电脑实时时钟的设计

    电脑实时时钟以ATMEL89C51 单片机为核心,即ATMEL89C51 单片机执行全面控制,利用MC146818 时钟芯片的性能高、功耗低
    发表于 05-30 11:59 56次下载
    电脑<b class='flag-5'>实时时钟</b>的设计

    基于单片机的1602液晶显示的DS1302实时时钟

    基于单片机的1602液晶显示的DS1302实时时钟
    发表于 11-25 14:57 39次下载

    单片机制作RTC实时时钟(DS1302)程序【C语言版】

    单片机制作RTC实时时钟(DS1302)程序【C语言版】,感兴趣的可以看看。
    发表于 12-30 13:48 0次下载

    一文看懂rtc实时时钟单片机时钟的区别

    本文首先阐述了rtc实时时钟单片机时钟的区别,其次介绍了单片机时钟概念与单片机内外部时钟方式
    的头像 发表于 05-14 15:48 6.1w次阅读

    实时时钟单片机项目需要学习什么知识

    实现实时时钟单片机开发学习过程中,一个里程碑式的综合性项目,如果能独立完成实现实时时钟的相关显示,设置等功能,那就代表着单片机编程已经完全
    的头像 发表于 10-13 11:53 3536次阅读
    <b class='flag-5'>实时时钟</b>的<b class='flag-5'>单片机</b>项目需要学习什么知识

    使用实时时钟IC DS1307制作精确时钟的方法

    如何使用实时时钟 IC DS1307 制作准确的时钟。时间将显示在液晶显示屏上。
    的头像 发表于 04-26 17:23 6551次阅读
    使用<b class='flag-5'>实时时钟</b>IC DS1307<b class='flag-5'>制作</b>精确<b class='flag-5'>时钟</b>的方法

    基于STM32单片机RTC实时时钟使用库文件设计

    基于STM32单片机RTC实时时钟使用库文件设计源代码
    发表于 04-26 14:28 5次下载

    基于AT89C51单片机1602液晶显示的DS1302实时时钟

    基于AT89C51单片机1602液晶显示的DS1302实时时钟Proteus仿真及程序
    发表于 05-04 15:18 2次下载

    基于51单片机实时时钟设计

    电子发烧友网站提供《基于51单片机实时时钟设计.rar》资料免费下载
    发表于 01-02 10:15 43次下载

    基于51单片机实时时钟+温度应用设计

    基于51单片机实时时钟+温度应用设计(仿真)
    发表于 01-02 09:55 6次下载

    基于51单片机实时时钟设计

    电子发烧友网站提供《基于51单片机实时时钟设计.rar》资料免费下载
    发表于 01-12 10:43 13次下载

    基于51单片机实时时钟+温度应用设计

    电子发烧友网站提供《基于51单片机实时时钟+温度应用设计.rar》资料免费下载
    发表于 01-12 10:20 0次下载