找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 6932|回復(fù): 11
收起左側(cè)

我做的OLED單片機(jī)萬(wàn)年歷,希望對(duì)你有幫助

  [復(fù)制鏈接]
ID:375003 發(fā)表于 2020-2-3 20:31 | 顯示全部樓層 |閱讀模式
       網(wǎng)上看到很多人做單片機(jī)萬(wàn)年歷的,但是OLED萬(wàn)年歷的很少做,放假這幾天沒(méi)事干,做著玩一玩,累,很多東西都要自己重頭做起,這個(gè)例程只是一個(gè)初步,后面還有很多東西沒(méi)有做進(jìn)來(lái),我的OLED是IIC接口的,0.96寸的雙色屏.晶振是11.0592
M的.網(wǎng)上的買的時(shí)鐘模塊也沒(méi)有到貨.后面會(huì)加上,晶振應(yīng)該用12,或者24M的.時(shí)間會(huì)更準(zhǔn)確.按鍵調(diào)時(shí)也沒(méi)有加,我準(zhǔn)備用
遙控器.就這個(gè)簡(jiǎn)單的程序就花了近4K的程序空間,單片機(jī)用的STC12C5404,后面換成STC12C5412,不知道寫不寫得下.下面的跟貼有移植到STM32的圖片
如果有不懂的,或者調(diào)試中遇到困難,可以加我QQ或者we信QQ112001198
本人從事單片機(jī)30多年,可以幫你輕松的進(jìn)階STM32.
IMG_0406(20200203-200355).JPG

話不多說(shuō),上程序:
#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; //這個(gè)值校時(shí),12小時(shí)制 比如8.39分,8*3600+39*60+秒數(shù)
bit disp=0;
void Timer0Init()//定時(shí)一秒,完成后進(jìn)行中斷
{
        TMOD|=0X01;//0000 0001方式一
        TH0=0X4C;        //給定時(shí)器賦初值,定時(shí)50ms
        TL0=0X00;        
        ET0=1;//打開(kāi)定時(shí)器0中斷允許
        EA=1;//打開(kāi)總中斷
        TR0=1;//打開(kāi)定時(shí)器
                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);
        //初始化時(shí)間顯示區(qū)
        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;//表示有進(jìn)位
        } //
        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;
    }//點(diǎn)亮小時(shí),十二小時(shí)制。
    else if(i==43200)
             {i=0;f=0;a=0;b=0;c=0;d=0;e=0;}
   disp=1;
}

全部資料51hei下載地址:
OLED12864-萬(wàn)年歷12小時(shí)制.zip (81.16 KB, 下載次數(shù): 213)



回復(fù)

使用道具 舉報(bào)

ID:614068 發(fā)表于 2020-2-5 18:22 | 顯示全部樓層
謝謝分享,值得學(xué)習(xí)
回復(fù)

使用道具 舉報(bào)

ID:375003 發(fā)表于 2020-2-5 22:21 | 顯示全部樓層
本帖最后由 guangshi_wq 于 2020-2-9 22:32 編輯

成功移值到STM32上,因?yàn)樯厦嬗幸粋(gè)RTC模塊,時(shí)間一定很精準(zhǔn),雖然沒(méi)有電池,我從電腦上取下來(lái)的時(shí)候,先保存時(shí)間到EEPROM,修改時(shí)間就不用菜單了,直接
用串口發(fā)命令修改,比如:TIME 1230,DATE 0205,YEAR 2020反正一年只用修改
一次.別的都能算出來(lái).      我準(zhǔn)備將程序再優(yōu)化一下,寫入4K的空間,將字模全部寫入片上EEPROM
不常用的程序段也寫入EEPROM.12K的空間不能浪費(fèi)
后繼增加語(yǔ)音報(bào)時(shí)功能不用語(yǔ)音模塊
想出一個(gè)更簡(jiǎn)單的算法,讓單片機(jī)飛起來(lái)       

     這是我以前用的點(diǎn)陣屏96年Made in Hongkong
主控HD61830A顯存是屏點(diǎn)陣的8倍可以輕松實(shí)現(xiàn)圖片滾動(dòng)
掃描方式和以前電視機(jī)的一樣橫向逐行.
控制用匯編,單片機(jī)不帶rom寫入rom用的是ALL03編程器
擦除程序用紫外光照,編程器和電腦相連用ISA卡
編程器的價(jià)格是電腦的1/2,2K多.
       



以前用的屏背面

以前用的屏背面

以前用的屏正面

以前用的屏正面
IMG_0408.JPG
回復(fù)

使用道具 舉報(bào)

ID:687144 發(fā)表于 2020-2-6 19:56 | 顯示全部樓層
不錯(cuò),謝謝!
回復(fù)

使用道具 舉報(bào)

ID:208733 發(fā)表于 2020-2-7 23:40 | 顯示全部樓層
等一切都恢復(fù)正常后再入手
回復(fù)

使用道具 舉報(bào)

ID:634466 發(fā)表于 2020-2-8 17:47 | 顯示全部樓層
會(huì)單片機(jī)就是好!
回復(fù)

使用道具 舉報(bào)

ID:23606 發(fā)表于 2020-2-8 22:36 | 顯示全部樓層
好資料,謝謝分享
回復(fù)

使用道具 舉報(bào)

ID:375003 發(fā)表于 2020-2-9 15:05 | 顯示全部樓層
本帖最后由 guangshi_wq 于 2020-3-8 16:01 編輯

調(diào)整時(shí)間改一下
這樣改
#define ADJTIME  11*3600+58*60        //這是11點(diǎn)58分.
u16 UNIXtime=ADJTIME;//這個(gè)值調(diào)時(shí)間12小時(shí)制 比如8.39分,8*3600+39*60+秒數(shù)

ALL03編程器與電腦的接口

ALL03編程器與電腦的接口
回復(fù)

使用道具 舉報(bào)

ID:375003 發(fā)表于 2020-2-10 09:00 | 顯示全部樓層
本帖最后由 guangshi_wq 于 2020-2-10 14:15 編輯

如果有意者可以看看我做了部分優(yōu)化的結(jié)果
http://www.torrancerestoration.com/bbs/dpj-179602-1.html這是我優(yōu)化的操作系統(tǒng),里面有圖片.
http://www.torrancerestoration.com/bbs/dpj-179604-1.html
如果想了解NEC協(xié)議的朋友看看這里;
http://www.torrancerestoration.com/bbs/dpj-128955-1.html
如果想了解開(kāi)關(guān)電源的朋友看看這里
http://www.torrancerestoration.com/bbs/forum.p ... mp;page=1#pid528876
如果喜歡玩數(shù)碼管的朋友看看這里;
http://www.torrancerestoration.com/bbs/dpj-179339-1.html
如果你是還沒(méi)有入門看看這里
http://www.torrancerestoration.com/bbs/dpj-129124-4.html

回復(fù)

使用道具 舉報(bào)

ID:315554 發(fā)表于 2020-3-10 16:39 | 顯示全部樓層
留印,謝謝樓主,搭個(gè)橋顯示看下,
回復(fù)

使用道具 舉報(bào)

ID:102963 發(fā)表于 2020-4-7 15:46 | 顯示全部樓層
確實(shí)還有很多沒(méi)寫進(jìn)來(lái),只寫了個(gè)時(shí)間界面。年月日星期農(nóng)歷,都是寫的字,根本不是參數(shù),不能修改。!
回復(fù)

使用道具 舉報(bào)

ID:202824 發(fā)表于 2021-3-6 13:41 | 顯示全部樓層
多謝樓主。正在找OLED顯示方面的資料。終于找到了
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表