lcd12864程序ks0108

显示光电

94人已加入

描述

  12864市面上比较流行的有两种,一种是以KS0108为主控芯片的,不带字库的,说白了就是只能靠打点才能显示出字符或图形的,当然要借助取模软件;另一种是以ST7920为主控芯片的,带ASCII码和中文字库。至于两种的区别下一篇再讨论,这篇先讲述KS0108为主控芯片的12864的原理。

  KS0108控制的12864内部有两个控制器,分别控制左半屏和右半屏,如下图所示

LCD12864

  左半屏和右半屏操作时写的地址其实是一样的,那么只能通过片选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初始化

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分