標(biāo)題:
LCD12864+ds1302大時間顯示 單片機(jī)程序
[打印本頁]
作者:
cclianbao
時間:
2020-2-10 15:40
標(biāo)題:
LCD12864+ds1302大時間顯示 單片機(jī)程序
下面是復(fù)制的部分代碼,復(fù)制到里面?zhèn)渥⑹莵y碼,不過提供源程序下載查看,備注很清楚,適合初學(xué)者
本程序是12864顯示屏配合DS1302模塊,用的普中科技HC6800ESV2.0的開發(fā)板。不過沒用開發(fā)板自帶的DS1302,電路板設(shè)計有缺陷導(dǎo)致1302和12864顯示屏沖突。
各種現(xiàn)實數(shù)字全部自己設(shè)計圖片并取模顯示。全程屏幕顯示用的是繪圖模式刷新。用兩個按鍵控制時間設(shè)定。
思路:先把屏幕格局設(shè)計出來,把字體字模提取。先把時間顯示好再想辦法把按鍵控制設(shè)計進(jìn)去,然后再想著把要設(shè)置的那個位閃爍變化。
單片機(jī)源程序如下:
void main()
{
Lcd12864Init();//Lcd初始化
DisplayKJ(image1);//畫面初始化
Time0init();
Time1init();//定時器初始化
Lcd12864Com(0x36);//打開繪圖模式
while(1)
{
/***************判斷K1鍵按下并且按鍵參數(shù)加1***********************/
if(K1==0)
{
Delay(20);
if(K1==0)
{
while(K1==0);
Keynumber++;
TR0=0;//暫停定時器0計數(shù),不讀取DS1302里面的數(shù)值
}
}
/***********根據(jù)K1的次數(shù)判斷需要閃爍的位置分別是秒分時日月周*******************/
switch(Keynumber)
{
case 0:
DisplayTime();break;//無設(shè)置的時候全部刷新一遍
case 1:
if(shannumber==0)
{
DisplayMS(image2[SetTimeDate[0]/10]);
DisplayMG(image2[SetTimeDate[0]%10]);
}
else
{
DisplayMS(image2[10]);
DisplayMG(image2[10]);
};
break;//設(shè)置秒的時候只刷新秒位
case 2:
if(shannumber==0)
{
DisplayFG(image2[SetTimeDate[1]%10]);
DisplayFS(image2[SetTimeDate[1]/10]);
}
else
{
DisplayFS(image2[10]);
DisplayFG(image2[10]);
};
break;//設(shè)置分的時候只刷新分位
case 3:
if(shannumber==0)
{
DisplaySG(image2[SetTimeDate[2]%10]);
DisplaySS(image2[SetTimeDate[2]/10]);
}
else
{
DisplaySS(image2[10]);
DisplaySG(image2[10]);
};
break;//設(shè)置小時的時候只刷新小時位
case 4:
if(shannumber==0)
{
DisplayRS(image3[SetTimeDate[3]/10]);
DisplayRG(image3[SetTimeDate[3]%10]);
}
else
{
DisplayRS(image3[10]);
DisplayRG(image3[10]);
};
break;//設(shè)置日的時候只刷新日位
case 5:
if(shannumber==0)
{
DisplayYS(image3[SetTimeDate[4]/10]);
DisplayYG(image3[SetTimeDate[4]%10]);
}
else
{
DisplayYS(image3[10]);
DisplayYG(image3[10]);
};
break;//設(shè)置月的時候只刷新月位
case 6:
if(shannumber==0)
{
DisplayXQ(image3[SetTimeDate[5]%10]);
}
else
{
DisplayXQ(image3[10]);
};
break;//設(shè)置周的時候只刷新周位
case 7:
Keynumber=0;Ds1302Init();TR0=1;break;//按鍵循環(huán)一遍重新將數(shù)據(jù)寫入時間數(shù)組,然后打開定時器讀取DS1302內(nèi)的數(shù)據(jù)
}
/******************在設(shè)置的狀態(tài)下判斷K2并設(shè)置各參數(shù)***********************/
/********************設(shè)置秒?yún)?shù)*********************/
if((Keynumber==1)&&(K2==0))
{
Delay(20);
if((Keynumber==1)&&(K2==0))
{
while((Keynumber==1)&&(K2==0));
SetTimeDate[0]++;
if(SetTimeDate[0]==60)
{
SetTimeDate[0]=0;
}
}
}
/*******************設(shè)置分參數(shù)****************************/
if((Keynumber==2)&&(K2==0))
{
Delay(20);
if((Keynumber==2)&&(K2==0))
{
while((Keynumber==2)&&(K2==0));
SetTimeDate[1]++;
if(SetTimeDate[1]==60)
{
SetTimeDate[1]=0;
}
}
}
/**********************設(shè)置時參數(shù)***********************************/
if((Keynumber==3)&&(K2==0))
{
Delay(20);
if((Keynumber==3)&&(K2==0))
{
while((Keynumber==3)&&(K2==0));
SetTimeDate[2]++;
if(SetTimeDate[2]==24)
{
SetTimeDate[2]=0;
}
}
}
/**********************設(shè)置日參數(shù)*******************************************/
if((Keynumber==4)&&(K2==0))
{
Delay(20);
if((Keynumber==4)&&(K2==0))
{
while((Keynumber==4)&&(K2==0));
SetTimeDate[3]++;
if(SetTimeDate[3]==32)
{
SetTimeDate[3]=1;
}
}
}
/***********************設(shè)置月參數(shù)*************************************/
if((Keynumber==5)&&(K2==0))
{
Delay(20);
if((Keynumber==5)&&(K2==0))
{
while((Keynumber==5)&&(K2==0));
SetTimeDate[4]++;
if(SetTimeDate[4]==13)
{
SetTimeDate[4]=1;
}
}
}
/********************設(shè)置星期*****************************************/
if((Keynumber==6)&&(K2==0))
{
Delay(20);
if((Keynumber==6)&&(K2==0))
{
while((Keynumber==6)&&(K2==0));
SetTimeDate[5]++;
if(SetTimeDate[5]==8)
{
SetTimeDate[5]=1;
}
}
}
}
}
void Timer0() interrupt 1 //定時器0中斷函數(shù)
{
static uchar counte;
TH0=0x3c;
TL0=0xb0;
counte++;
if(counte==1)
{
counte=0;
SetTimeDate[0]=BcdToNum(Ds1302_Read(0x81));//正常運行把讀出的秒分時保存到數(shù)組SetTimeDate中
SetTimeDate[1]=BcdToNum(Ds1302_Read(0x83));
SetTimeDate[2]=BcdToNum(Ds1302_Read(0x85));
SetTimeDate[3]=BcdToNum(Ds1302_Read(0x87));
SetTimeDate[4]=BcdToNum(Ds1302_Read(0x89));
SetTimeDate[5]=BcdToNum(Ds1302_Read(0x8b));
}
}
/*************************定時器1中斷函數(shù),設(shè)置閃爍的變量******************/
void Timer1() interrupt 3
{ static uchar number;
TH1 = 0x3c;
TL1 = 0xb0;
number++;
if(number==10)
{
number=0;
shannumber=~shannumber;
}
}
復(fù)制代碼
Keil代碼51hei下載地址:
12864顯示時間 ds1302 按鍵.rar
(60.33 KB, 下載次數(shù): 88)
2020-2-10 14:48 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
楊天想
時間:
2021-11-2 15:18
樓主能發(fā)原理圖出來嗎
作者:
Liubtwinner
時間:
2021-11-3 19:47
先下一個,有時間整一個。謝謝共享!
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1