显示光电
12864市面上比较流行的有两种,一种是以KS0108为主控芯片的,不带字库的,说白了就是只能靠打点才能显示出字符或图形的,当然要借助取模软件;另一种是以ST7920为主控芯片的,带ASCII码和中文字库。至于两种的区别下一篇再讨论,这篇先讲述KS0108为主控芯片的12864的原理。
KS0108控制的12864内部有两个控制器,分别控制左半屏和右半屏,如下图所示
左半屏和右半屏操作时写的地址其实是一样的,那么只能通过片选CS1和CS2来选择哪半个屏了,如果两个都选通,则相当于两块64x64的液晶了,而且显示的内容是一样的,取模方式是纵向8点下高位。
/***************************************************************************************
说明:
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初始化
全部0条评论
快来发表一下你的评论吧 !