网上看到很多人做单片机万年历的,但是OLED万年历的很少做,放假这几天没事干,做着玩一玩,累,很多东西都要自己重头做起,这个例程只是一个初步,后面还有很多东西没有做进来,我的OLED是IIC接口的,0.96寸的双色屏.晶振是11.0592
M的.网上的买的时钟模块也没有到货.后面会加上,晶振应该用12,或者24M的.时间会更准确.按键调时也没有加,我准备用
遥控器.就这个简单的程序就花了近4K的程序空间,单片机用的STC12C5404,后面换成STC12C5412,不知道写不写得下.下面的跟贴有移植到STM32的图片
如果有不懂的,或者调试中遇到困难,可以加我QQ或者we信QQ112001198
本人从事单片机30多年,可以帮你轻松的进阶STM32.
话不多说,上程序:
#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)
|