lcd12864程序ks0108

lcd12864程序ks0108,第1张

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

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

lcd12864程序ks0108,lcd12864程序ks0108,第2张

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

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/dianzi/2525262.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-08-05
下一篇 2022-08-05

发表评论

登录后才能评论

评论列表(0条)

保存