網上看到很多人做單片機萬年歷的,但是OLED萬年歷的很少做,放假這幾天沒事干,做著玩一玩,累,很多東西都要自己重頭做起,這個例程只是一個初步,后面還有很多東西沒有做進來,我的OLED是IIC接口的,0.96寸的雙色屏.晶振是11.0592
M的.網上的買的時鐘模塊也沒有到貨.后面會加上,晶振應該用12,或者24M的.時間會更準確.按鍵調時也沒有加,我準備用
遙控器.就這個簡單的程序就花了近4K的程序空間,單片機用的STC12C5404,后面換成STC12C5412,不知道寫不寫得下.下面的跟貼有移植到STM32的圖片
如果有不懂的,或者調試中遇到困難,可以加我QQ或者we信QQ112001198
本人從事單片機30多年,可以幫你輕松的進階STM32.
IMG_0406(20200203-200355).JPG (237.2 KB, 下載次數: 56)
下載附件
2020-2-3 20:30 上傳
話不多說,上程序:
#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, 下載次數: 213)
2020-2-3 20:30 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|