12864市面上比較流行的有兩種,一種是以KS0108為主控芯片的,不帶字庫(kù)的,說(shuō)白了就是只能靠打點(diǎn)才能顯示出字符或圖形的,當(dāng)然要借助取模軟件;另一種是以ST7920為主控芯片的,帶ASCII碼和中文字庫(kù)。至于兩種的區(qū)別下一篇再討論,這篇先講述KS0108為主控芯片的12864的原理。
KS0108控制的12864內(nèi)部有兩個(gè)控制器,分別控制左半屏和右半屏,如下圖所示
左半屏和右半屏操作時(shí)寫(xiě)的地址其實(shí)是一樣的,那么只能通過(guò)片選CS1和CS2來(lái)選擇哪半個(gè)屏了,如果兩個(gè)都選通,則相當(dāng)于兩塊64x64的液晶了,而且顯示的內(nèi)容是一樣的,取模方式是縱向8點(diǎn)下高位。
lcd12864程序ks0108:
/***************************************************************************************
說(shuō)明:
1、程序共分六部分。一個(gè)主C程序,五個(gè)頭文件程序。
2、構(gòu)成:AT89C52 + DS1302 + DS18B20 + Ampire128x64 + Speaker
3、顯示:日期,星期,時(shí)間,氣溫
4、調(diào)整:設(shè)置三個(gè)按鍵,用于調(diào)節(jié)日期,星期,時(shí)間。 5、程序不夠完善,請(qǐng)有志者自行修改補(bǔ)充。
lcd12864程序ks0108
***************************************************************************************/
////////////////////////////////////////////////////////////// 1 ////////////////////////////////////////////////////////////////////////////////
//C程序:負(fù)責(zé)調(diào)用與整合其他程序模塊功能
#include“Hzimo.h” //字模頭文件
#include“DS1302.h” //時(shí)鐘讀寫(xiě)頭文件
#include“DS18B20.h” //溫度傳感器操作頭文件
#include“KS0108.h” //液晶顯示操作頭文件
#include“keyscan.h” //鍵盤(pán)調(diào)整操作頭文件
void pointer_Update() //指針的繪制與擦除(等比分點(diǎn))
{
uchar S,M,H; //定義秒分時(shí)寄存變量,用于時(shí)間判斷
if(S!=DT[0]) //秒時(shí)間跳變
{
CLKpointer_show(31,31,S,25,0); //秒針線擦除
S=DT[0]; //指向下一次的時(shí)間
}
CLKpointer_show(31,31,S,25,1); if(M!=DT[1]) //分時(shí)間跳變
{
CLKpointer_show(31,31,M,20,0); //分針線擦除
M=DT[1]; //指向下一次的時(shí)間
}
CLKpointer_show(31,31,M,20,1); if(DT[2]《12) DT[2]=DT[2]*5+DT[1]/12; //用于計(jì)算時(shí)針的終點(diǎn)坐標(biāo)
else
{DT[2]=DT[2]-12;DT[2]=DT[2]*5+DT[1]/12;
}
if(H!=DT[2]) //時(shí)間是否跳變
{
CLKpointer_show(31,31,H,15,0); //時(shí)針線擦除
H=DT[2]; //指向下一次的時(shí)間
}
CLKpointer_show(31,31,H,15,1);
}
void fixed_display() //固定顯示(按頁(yè),列,字碼,字?jǐn)?shù)定位)
{
sz_Disp1(2,0,16,num[11],1);//右屏0頁(yè)第16列顯示‘-’
sz_Disp1(2,0,40,num[11],1); //右屏0頁(yè)第40列顯示‘-’
hz_Disp16(2,2,0,HZ[8],2); //右屏2頁(yè)第0列顯示“星期”
sz_Disp1(2,2,32,num[10],2); //右屏2頁(yè)第32列填充黑塊“■” 2個(gè)
sz_Disp1(2,4,16,num[12],1); //右屏4頁(yè)第16列顯示‘:’
sz_Disp1(2,4,40,num[12],1); //右屏4頁(yè)第40列顯示‘:’
hz_Disp16(2,6,0,HZ[10],2); //右屏6頁(yè)第0列顯示“氣溫”
hz_Disp16(2,6,48,HZ[0],1); //右屏6頁(yè)第48列顯示“℃”
picture_disp12(1,0,0,&clock); //左屏顯示表盤(pán)與刻度
}
void dynamic_display() //動(dòng)態(tài)顯示(隨時(shí)更新的數(shù)值)
{
sz_Disp1(2,0, 0,num[DT[6]/10],1); //右屏0頁(yè)第 0列顯示‘年十位’
sz_Disp1(2,0, 8,num[DT[6]%10],1); //右屏0頁(yè)第 8列顯示‘年個(gè)位’
sz_Disp1(2,0,24,num[DT[4]/10],1); //右屏0頁(yè)第24列顯示‘月十位’
sz_Disp1(2,0,32,num[DT[4]%10],1); //右屏0頁(yè)第32列顯示‘月個(gè)位’
sz_Disp1(2,0,48,num[DT[3]/10],1); //右屏0頁(yè)第48列顯示‘日十位’
sz_Disp1(2,0,56,num[DT[3]%10],1); //右屏0頁(yè)第56列顯示‘日個(gè)位’
hz_Disp16(2,2,48,HZ[DT[5]],1); //右屏2頁(yè)第48列顯示“星期值”
sz_Disp1(2,4, 0,num[DT[2]/10],1); //右屏4頁(yè)第 0列顯示‘時(shí)十位’
sz_Disp1(2,4, 8,num[DT[2]%10],1); //右屏4頁(yè)第 8列顯示‘時(shí)個(gè)位’
sz_Disp1(2,4,24,num[DT[1]/10],1); //右屏4頁(yè)第24列顯示‘分十位’
sz_Disp1(2,4,32,num[DT[1]%10],1); //右屏4頁(yè)第32列顯示‘分個(gè)位’
sz_Disp1(2,4,48,num[DT[0]/10],1); //右屏4頁(yè)第48列顯示‘秒十位’
sz_Disp1(2,4,56,num[DT[0]%10],1); //右屏4頁(yè)第56列顯示‘秒個(gè)位’
if(key1n==0) //如果K1鍵計(jì)次值為 0
{
//注:此位置兼作調(diào)整提示顯示
sz_Disp1(2,6,32,num[Temp/10],1); //右屏6頁(yè)第32列顯示‘溫度十位’
sz_Disp1(2,6,40,num[Temp%10],1);//右屏6頁(yè)第40列顯示‘溫度個(gè)位’
}
pointer_Update(); //左右屏指針顯示與擦除
}
void main(void)
{ init_lcd(0);//LCD初始化
評(píng)論