标题:
使用STC15单片机驱动的OLED DS1302时钟
[打印本页]
作者:
天蓝色的Toto
时间:
2021-2-13 02:14
标题:
使用STC15单片机驱动的OLED DS1302时钟
以前搞的一个项目,现在拿出来分享一下代码(实物很久以前就损坏了)
单片机源程序如下:
#include<stc15f2k60s2.h>
#include<LQ12864.h>
#include<ds1302.h>
#include<ds18b20.h>
sbit SetMode=P5^4;
sbit SetTimes=P5^5;
void delayk(unsigned int MS) //误差 0us
{
while(MS--)
{
unsigned char a,b;
for(b=129;b>0;b--)
for(a=45;a>0;a--);
}
}
unsigned int tem;
unsigned char GK;//水平测
unsigned char model=0;
unsigned char code Shuzi[]="0123456789:-";
unsigned char TimeMode[9];
unsigned char DateMode[11];
unsigned char TempMode[6];
unsigned char GKMode[3];
unsigned char InitTime[7]={0,0,14,4,4,4,19};//秒分时日月周年
unsigned int Celsius;
void KeysCan()
{
if(!SetMode)
{
delayk(50);
model++;
if(model==7){model=0;}
while(!SetMode);
}
}
unsigned char Gaokao()
{
unsigned char temp;
switch(InitTime[4])
{
case 4:temp=70-InitTime[3];break;
case 5:temp=40-InitTime[3];break;
case 6:temp=9-InitTime[3];break;
}
return(temp);
}
void TMPdisplay()
{
TempMode[0]=Shuzi[tem%1000/100];
TempMode[1]=Shuzi[tem%100/10];
TempMode[2]='.';
TempMode[3]=Shuzi[tem%10];
TempMode[4]='^';
TempMode[5]='C';
TempMode[6]='\0';
OLED_P8x16Str(64,0,TempMode);
}
void SMG()
{
unsigned char a;
a=read1302(Read_hour);
InitTime[2]=((a>>4)*10+(a&0x0f));
TimeMode[0]=Shuzi[a>>4];
TimeMode[1]=Shuzi[a&0x0f];
TimeMode[2]=Shuzi[10];
a=read1302(Read_minute);
InitTime[1]=((a>>4)*10+(a&0x0f));
TimeMode[3]=Shuzi[a>>4];
TimeMode[4]=Shuzi[a&0x0f];
TimeMode[5]=Shuzi[10];
a=read1302(Read_second);
InitTime[0]=((a>>4)*10+(a&0x0f));
TimeMode[6]=Shuzi[a>>4];
TimeMode[7]=Shuzi[a&0x0f];
TimeMode[8]='\0';
a=read1302(Read_year);
InitTime[6]=((a>>4)*10+(a&0x0f));
DateMode[0]=Shuzi[2];
DateMode[1]=Shuzi[0];
DateMode[2]=Shuzi[a>>4];
DateMode[3]=Shuzi[a&0x0f];
DateMode[4]=Shuzi[11];
a=read1302(Read_month);
InitTime[4]=((a>>4)*10+(a&0x0f));
DateMode[5]=Shuzi[a>>4];
DateMode[6]=Shuzi[a&0x0f];
DateMode[7]=Shuzi[11];
a=read1302(Read_day);
InitTime[3]=((a>>4)*10+(a&0x0f));
DateMode[8]=Shuzi[a>>4];
DateMode[9]=Shuzi[a&0x0f];
DateMode[10]='\0';
GK=Gaokao();
GKMode[0]=Shuzi[GK/10];
GKMode[1]=Shuzi[GK%10];
GKMode[2]='\0';
}
void main()
{
OLED_Init();
Draw_BMP(0,0,128,8,Zhangtianlan);
delayk(300);
OLED_CLS();
OLED_P8x16Str(4,4,"Time:");
for(model=0;model<8;model++)
{
OLED_P16x16Ch(16*model,6,model,CNY);
}
model=0;
init_ds1302_io();
while(1)
{
unsigned char b,c;
TMPchange();
for(c=0;c<15;c++)
{
KeysCan();
if(!SetTimes)
{
delayk(20);
switch(model)
{
case 0:InitTime[model]=0;SetTime(InitTime);break;
case 1:InitTime[model]++; if(InitTime[model]==60){InitTime[model]=0;} SetTime(InitTime);break;
case 2:InitTime[model]++; if(InitTime[model]==24){InitTime[model]=0;} SetTime(InitTime);break;
case 3:InitTime[model]++;
switch(InitTime[model+1])
{
case 2:if(InitTime[model]==29){InitTime[model]=1;}break;
case 4:if(InitTime[model]==31){InitTime[model]=1;}break;
case 6:if(InitTime[model]==31){InitTime[model]=1;}break;
case 9:if(InitTime[model]==31){InitTime[model]=1;}break;
case 11:if(InitTime[model]==31){InitTime[model]=1;}break;
default:if(InitTime[model]==32){InitTime[model]=1;}break;
}
SetTime(InitTime);
break;
case 4:InitTime[model]++; if(InitTime[model]==13){InitTime[model]=1;} SetTime(InitTime);break;
case 5:InitTime[model]++; if(InitTime[model]==8){InitTime[model]=1;} SetTime(InitTime);break;
case 6:InitTime[model]++; if(InitTime[model]==100){InitTime[model]=0;} SetTime(InitTime);break;
}
while(!SetTimes);
}
SMG();
b=read1302(Read_week);
InitTime[5]=((b>>4)*10+(b&0x0f));
switch(b)
{
case 1:OLED_P8x16Str(96,2,"Mon");break;
case 2:OLED_P8x16Str(96,2,"Tue");break;
case 3:OLED_P8x16Str(96,2,"Wed");break;
case 4:OLED_P8x16Str(96,2,"Thu");break;
case 5:OLED_P8x16Str(96,2,"Fri");break;
case 6:OLED_P8x16Str(96,2,"Sat");break;
case 7:OLED_P8x16Str(96,2,"Sun");break;
}
OLED_P8x16Str(52,4,TimeMode);
OLED_P8x16Str(5,2,DateMode);
switch(model+1)
{
case 1:OLED_P8x16Str(4,0,"SetSec\0");break;
case 2:OLED_P8x16Str(4,0,"SetMin\0");break;
case 3:OLED_P8x16Str(4,0,"SetHou\0");break;
case 4:OLED_P8x16Str(4,0,"SetDay\0");break;
case 5:OLED_P8x16Str(4,0,"SetMon\0");break;
case 6:OLED_P8x16Str(4,0,"SetWek\0");break;
case 7:OLED_P8x16Str(4,0,"SetYea\0");break;//break;
}
TMPdisplay();
OLED_P8x16Str(96,6,GKMode);
}
tem=TMPget();
}
}
复制代码
所有程序51hei提供下载:
OLED-DS1302时钟 STC15版.zip
(83.98 KB, 下载次数: 49)
2021-2-13 02:14 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
yuzhihang123
时间:
2021-3-11 23:43
学习一下,为啥不用注释呀
作者:
天蓝色的Toto
时间:
2021-3-16 23:31
yuzhihang123 发表于 2021-3-11 23:43
学习一下,为啥不用注释呀
很久以前的代码,当时写的时候没注释
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1