找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5803|回复: 11
收起左侧

我做的OLED单片机万年历,希望对你有帮助

  [复制链接]
ID:375003 发表于 2020-2-3 20:31 | 显示全部楼层 |阅读模式
       网上看到很多人做单片机万年历的,但是OLED万年历的很少做,放假这几天没事干,做着玩一玩,累,很多东西都要自己重头做起,这个例程只是一个初步,后面还有很多东西没有做进来,我的OLED是IIC接口的,0.96寸的双色屏.晶振是11.0592
M的.网上的买的时钟模块也没有到货.后面会加上,晶振应该用12,或者24M的.时间会更准确.按键调时也没有加,我准备用
遥控器.就这个简单的程序就花了近4K的程序空间,单片机用的STC12C5404,后面换成STC12C5412,不知道写不写得下.下面的跟贴有移植到STM32的图片
如果有不懂的,或者调试中遇到困难,可以加我QQ或者we信QQ112001198
本人从事单片机30多年,可以帮你轻松的进阶STM32.
IMG_0406(20200203-200355).JPG

话不多说,上程序:
#include "codetab.h"
#include "LQ12864.h"
unsigned char a=0,b=0,c=0,d=0,e=0,f=0,g=0;
unsigned int l=0;
unsigned int i=31500; //这个值校时,12小时制 比如8.39分,8*3600+39*60+秒数
bit disp=0;
void Timer0Init()//定时一秒,完成后进行中断
{
        TMOD|=0X01;//0000 0001方式一
        TH0=0X4C;        //给定时器赋初值,定时50ms
        TL0=0X00;        
        ET0=1;//打开定时器0中断允许
        EA=1;//打开总中断
        TR0=1;//打开定时器
                TF0=0;                        
}

void display()
{
                OLED_P16x16Ch(0,2,f*2);
                OLED_P16x16Ch(0,4,f*2+1); //0
                OLED_P16x16Ch(16,2,e*2);
                OLED_P16x16Ch(16,4,e*2+1);//1
                OLED_P16x16Ch(32,2,32);
                OLED_P16x16Ch(32,4,33);//:
                OLED_P16x16Ch(48,2,d*2);
                OLED_P16x16Ch(48,4,d*2+1);//2
                OLED_P16x16Ch(64,2,c*2);
                OLED_P16x16Ch(64,4,c*2+1);//3
                OLED_P16x16Ch(80,2,32);
                OLED_P16x16Ch(80,4,33);//:
                OLED_P16x16Ch(95,2,b*2);
                OLED_P16x16Ch(95,4,b*2+1);//4
                OLED_P16x16Ch(111,2,a*2);
                OLED_P16x16Ch(111,4,a*2+1);//5;
}

void main(void)
{
//        unsigned char i;
//        while(1){
//    SCL=!SCL;
//        delay(1000);//1000是257ms;
//    SDA=!SDA;}
    Timer0Init();  
    ET0=1;
    EA=1;
        delay(2000);
//        OLED_CLS();
        OLED_Init(); //OLED初始化
        OLED_Fill(0xff); //屏全亮
        delay(2000);
        OLED_Fill(0x00); //屏全灭
        delay(200);
        //初始化时间显示区
        while(1)
        {

                OLED_P8x16Str(8,0,"2020");//第一行 -- 8x16的显示单元显示ASCII码
                OLED_P16x16Ch(40,0,34);//第一行第三列显示年
                OLED_P8x16Str(56,0,"02");
                OLED_P16x16Ch(74,0,35);        //显示月
                OLED_P8x16Str(90,0,"02");
                OLED_P16x16Ch(106,0,36);        //显示日
                if(disp)
                {
                   display();
                   disp=0;
                }

                OLED_P16x16Ch(0,6,37);//星
                OLED_P16x16Ch(16,6,38);//期
                OLED_P16x16Ch(32,6,36);//日
                OLED_P16x16Ch(48,6,20);//空
                OLED_P16x16Ch(63,6,39);//正
                OLED_P16x16Ch(79,6,35);//月
                OLED_P16x16Ch(95,6,40);//初
                OLED_P16x16Ch(111,6,29);//九
                while(disp)
                {
                   display();
                   disp=0;
                }                                                  

        }
}

void Timer0() interrupt 1 using 1
{
        TF0=0;
    TH0=0X4C; //50ms中断一次      
    TL0=0X00;
        g++;
        disp=1;
        if(g<20)return;
    else {i++;g=0;}
    if(i<10)
      {//
        a=i;
      }//
     else if(i>=10&&i<60)
      {//
        a=i%10;
        b=i/10;
      }//
     else if(i>=60&&i<600)
      {//
                        
        c=i/60;
        b=(i-60*c)/10;
        a=i-60*c-10*b;
      }//
     else if(i>=600&&i<3600)
      {//
                        
        d=i/600;
        c=(i-600*d)/60;
        b=(i-600*d-60*c)/10;
        a=i-600*d-60*c-10*b;
      }//
     else if(i>=3600&&i<43200)
     {//
        if(i>=36000)
        {
           l=36000;f=1;//表示有进位
        } //
        e=(i-l)/3600;
        d=(i-l-3600*e)/600;
        c=(i-l-3600*e-600*d)/60;
        b=(i-l-3600*e-600*d-60*c)/10;
        a=i-l-3600*e-600*d-60*c-10*b;
    }//点亮小时,十二小时制。
    else if(i==43200)
             {i=0;f=0;a=0;b=0;c=0;d=0;e=0;}
   disp=1;
}

全部资料51hei下载地址:
OLED12864-万年历12小时制.zip (81.16 KB, 下载次数: 209)
回复

使用道具 举报

ID:614068 发表于 2020-2-5 18:22 | 显示全部楼层
谢谢分享,值得学习
回复

使用道具 举报

ID:375003 发表于 2020-2-5 22:21 | 显示全部楼层
本帖最后由 guangshi_wq 于 2020-2-9 22:32 编辑

成功移值到STM32上,因为上面有一个RTC模块,时间一定很精准,虽然没有电池,我从电脑上取下来的时候,先保存时间到EEPROM,修改时间就不用菜单了,直接
用串口发命令修改,比如:TIME 1230,DATE 0205,YEAR 2020反正一年只用修改
一次.别的都能算出来.      我准备将程序再优化一下,写入4K的空间,将字模全部写入片上EEPROM
不常用的程序段也写入EEPROM.12K的空间不能浪费
后继增加语音报时功能不用语音模块
想出一个更简单的算法,让单片机飞起来       

     这是我以前用的点阵屏96年Made in Hongkong
主控HD61830A显存是屏点阵的8倍可以轻松实现图片滚动
扫描方式和以前电视机的一样横向逐行.
控制用汇编,单片机不带rom写入rom用的是ALL03编程器
擦除程序用紫外光照,编程器和电脑相连用ISA卡
编程器的价格是电脑的1/2,2K多.
       



以前用的屏背面

以前用的屏背面

以前用的屏正面

以前用的屏正面
IMG_0408.JPG
回复

使用道具 举报

ID:687144 发表于 2020-2-6 19:56 | 显示全部楼层
不错,谢谢!
回复

使用道具 举报

ID:208733 发表于 2020-2-7 23:40 | 显示全部楼层
等一切都恢复正常后再入手
回复

使用道具 举报

ID:634466 发表于 2020-2-8 17:47 | 显示全部楼层
会单片机就是好!
回复

使用道具 举报

ID:23606 发表于 2020-2-8 22:36 | 显示全部楼层
好资料,谢谢分享
回复

使用道具 举报

ID:375003 发表于 2020-2-9 15:05 | 显示全部楼层
本帖最后由 guangshi_wq 于 2020-3-8 16:01 编辑

调整时间改一下
这样改
#define ADJTIME  11*3600+58*60        //这是11点58分.
u16 UNIXtime=ADJTIME;//这个值调时间12小时制 比如8.39分,8*3600+39*60+秒数

ALL03编程器与电脑的接口

ALL03编程器与电脑的接口
回复

使用道具 举报

ID:375003 发表于 2020-2-10 09:00 | 显示全部楼层
本帖最后由 guangshi_wq 于 2020-2-10 14:15 编辑

如果有意者可以看看我做了部分优化的结果
http://www.51hei.com/bbs/dpj-179602-1.html这是我优化的操作系统,里面有图片.
http://www.51hei.com/bbs/dpj-179604-1.html
如果想了解NEC协议的朋友看看这里;
http://www.51hei.com/bbs/dpj-128955-1.html
如果想了解开关电源的朋友看看这里
http://www.51hei.com/bbs/forum.p ... mp;page=1#pid528876
如果喜欢玩数码管的朋友看看这里;
http://www.51hei.com/bbs/dpj-179339-1.html
如果你是还没有入门看看这里
http://www.51hei.com/bbs/dpj-129124-4.html

回复

使用道具 举报

ID:315554 发表于 2020-3-10 16:39 | 显示全部楼层
留印,谢谢楼主,搭个桥显示看下,
回复

使用道具 举报

ID:102963 发表于 2020-4-7 15:46 | 显示全部楼层
确实还有很多没写进来,只写了个时间界面。年月日星期农历,都是写的字,根本不是参数,不能修改!!!
回复

使用道具 举报

ID:202824 发表于 2021-3-6 13:41 | 显示全部楼层
多谢楼主。正在找OLED显示方面的资料。终于找到了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表