目錄
一、引言
二、硬件連接
三、軟件介紹
1、主函數(shù)
(1)、按鍵控制函數(shù)
(2)、顯示函數(shù)
2、定時(shí)器中斷子程序
四、實(shí)物展示
五、源代碼獲取
一、引言
最近在學(xué)習(xí)OLED顯示屏的應(yīng)用,通過OLED顯示時(shí)間、年、月、日,以及相關(guān)信息。還可以根據(jù)喜好添加不同的圖片??梢宰孕性O(shè)置時(shí)間,控制屏幕的亮滅從而減少電量的損耗。設(shè)計(jì)中我一共使用了六個(gè)端口,OLED顯示屏占用兩個(gè)端口,控制加減的按鍵使用了兩個(gè),控制屏幕的亮滅使用了一個(gè)。但程序中有一個(gè)缺陷,就是星期不會(huì)跟著日期的改變而改變,需要自己手動(dòng)更改,后期如果我學(xué)會(huì)了再重新添加程序。
二、硬件連接
OLED顯示器的連接與上兩節(jié)使用的相同,如果制作實(shí)時(shí)時(shí)鐘,需要再添加一個(gè)時(shí)鐘芯片,本設(shè)計(jì)沒有使用時(shí)鐘芯片。四個(gè)按鍵,切換:P3^4,開關(guān):P3^5,-:P3^6,+:P3^7.
三、軟件介紹
1、主函數(shù)
(1)、按鍵控制函數(shù)
一共使用四個(gè)按鍵,第一個(gè)為”加“按鍵,第二個(gè)為“減”按鍵,第三個(gè)為”開關(guān)“按鍵,第四個(gè)為“模式選擇”按鍵。
if(key2==0)//控制OLED屏幕亮滅
{
DelayUs2x(10);
if(key2==0)
{ num1++; }
while(!key2);
}
if(num1==1){ OLED_Display_Off(); num=0;}//關(guān)閉
if(num1==2)num1=0;
if(num1==0)
{
OLED_Display_On(); //打開
if(key3==0)//模式控制
{
DelayUs2x(10);
if(key3==0)
{ num++; }
while(!key3);
}
if(key0==0)////加
{
DelayUs2x(10);
if(key0==0)
{
if(num==1){ hour++;if(hour>=24)hour=0; }//+
if(num==2){ minute++;if(minute>=60)hour=0; }//+
if(num==3){ year++; }//+
if(num==4){ month++;if(month>=13)month=1;
if((month==1||month==3||month==5||month==7||month==8||month==10||month==12)&&date==31)date=30;
if(month==2&&date>28)date=28; }//+
if(num==5){ date++;if((month==1||month==3||month==5||month==7||month==8||month==10||month==12)&&date>=32)date=1; //日
else if(date>=31&&month==4||date>=31&&month==6||date>=31&&month==9||date>=31&&month==11)date=1;
else if(date>=29&&month==2)date=1; }//+
if(num==6){Q++;if(Q>=7)Q=0;}
}
while(!key0);
}
if(key1==0) //減
{
DelayUs2x(10);
if(key1==0)
{
if(num==1){ hour--;if(hour==255)hour=23; }//-
if(num==2){ minute--;if(minute==255)minute=59; }//-
if(num==3){ year--; }//-
if(num==4){ month--;if(month==0)month=12;
if((month==1||month==3||month==5||month==7||month==8||month==10||month==12)&&date==31)date=30;
if(month==2&&date>28)date=28;}//-
if(num==5){ date--;if(date==0&&month==1||date==0&&month==3||date==0&&month==5||date==0&&month==7||date==0&&month==8||date==0&&month==10||date==0&&month==12)date=31;
else if(date==0&&month==4||date==0&&month==6||date==0&&month==9||date==0&&month==11)date=30;
else if(date==0&&month==2)date=28; }//-
if(num==6){Q--;if(Q==255)Q=6;}
}
while(!key1);
}
if(num==7)num=0;
num用來控制對年、月、日、時(shí)、分哪一位的修改,等于1對小時(shí)的修改,等于2對分鐘的修改,等于3對年的修改,等于4對月的修改,等于5對年的修改,等于6返回。
(2)、顯示函數(shù)
顯示背景圖片。背景圖程序需要放在主循環(huán)之外。
OLED_DrawBMP(0,0,127,64,BMP1); //生成圖像
顯示年、月、日、時(shí)、分、秒以及星期天。
OLED_ShowNum(0,0,N,2,8); //顯示數(shù)字
OLED_ShowChinese(13,0,0,7); //文字 年
OLED_ShowNum(22,0,Y,2,8); //顯示數(shù)字
OLED_ShowChinese(35,0,1,7); //文字 月
OLED_ShowNum(46,0,R,2,8); //顯示數(shù)字
OLED_ShowChinese(59,0,2,7); //文字 日
OLED_ShowNum(33,5,S,2,16); //顯示數(shù)字
OLED_ShowString(50,5,":",16); //顯示字符串
OLED_ShowNum(57,5,F,2,16); //顯示數(shù)字
OLED_ShowString(72,5,":",16); //顯示字符串
OLED_ShowNum(79,5,M,2,16); //顯示數(shù)字
OLED_ShowChinese(75,1,7,13); //文字 星
OLED_ShowChinese(88,1,8,13); //文字 期
OLED_ShowChinese(101,1,Q,13); //文字
2、定時(shí)器中斷子程序
void Timer0_isr(void) interrupt 1
if(num==500) //大致1s
{
num=0;
second++;
if(second==60) //秒到60,分鐘加1
{
second=0;
minute++;
if(minute==60)//分鐘到60,小時(shí)加1
{
minute=0;
hour++;
if(hour==24)//小時(shí)到24,回零
{
hour=0;
date++;Q++;
if(Q==8)
Q=0;
if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)//月1,3,5,7,8,10,12
{
if(date==31)
{
date=0;
month++;
if(month==12)
month=0;
year++;
}
}
if(month==4||month==6||month==9||month==11)//月4,6,9,11
{
if(date==30)
{
date=0;
month++;
if(month==12)
month=0;
year++;
}
}
if(month==2)//月2
{
if(year%4==0)
{
if(date==29)
{
date=0;
month++;
if(month==12)
{
month=0;
year++;
}
}
}
else if(date==28)
{
date=0;
month++;
if(month==12)
{
month=0;
year++;
}
}
}
}
}
}
}
實(shí)際中不同月份中天數(shù)不相同,1、3、5、7、8、10、12為31天,4、6、9、11為30天,2月為28天。程序中通過循環(huán)累加來計(jì)算時(shí)間,并根據(jù)不同的月份采用不同的累加。
四、實(shí)物展示
https://live.csdn.net/v/213880
這次我采用了自己焊接的一個(gè)單片機(jī)最小系統(tǒng),通過兩節(jié)18650電池供電。通過穩(wěn)壓芯片將電壓降至5V。
五、源代碼獲取
關(guān)注公眾號“小小創(chuàng)客者”回復(fù)“OLED時(shí)鐘”獲得代碼。若有錯(cuò)誤歡迎指正。
審核編輯:湯梓紅
-
單片機(jī)
+關(guān)注
關(guān)注
6067文章
44992瀏覽量
650677 -
OLED
+關(guān)注
關(guān)注
120文章
6286瀏覽量
228114 -
實(shí)時(shí)時(shí)鐘
+關(guān)注
關(guān)注
4文章
314瀏覽量
67074
發(fā)布評論請先 登錄

用51單片機(jī)驅(qū)動(dòng)oled顯示屏
單片機(jī)顯示屏時(shí)鐘的制作資料分享
如何利用ESP8266和OLED顯示屏來做一個(gè)網(wǎng)絡(luò)時(shí)鐘呢
電腦實(shí)時(shí)時(shí)鐘的設(shè)計(jì)

基于單片機(jī)的1602液晶顯示的DS1302實(shí)時(shí)時(shí)鐘
單片機(jī)制作RTC實(shí)時(shí)時(shí)鐘(DS1302)程序【C語言版】
一文看懂rtc實(shí)時(shí)時(shí)鐘和單片機(jī)時(shí)鐘的區(qū)別
實(shí)時(shí)時(shí)鐘的單片機(jī)項(xiàng)目需要學(xué)習(xí)什么知識

使用實(shí)時(shí)時(shí)鐘IC DS1307制作精確時(shí)鐘的方法

評論