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