12864点阵液晶显示模块(LCM)就是由 128*64个液晶显示点组成的一个128列*64行的阵列。每个显示点对应一位二进制数,1表示亮,0表示灭。存储这些点阵信息的RAM称为显示数据存 储器。要显示某个图形或汉字就是将相应的点阵信息写入到相应的存储单元中。图形或汉字的点阵信息当然由自己设计,问题的关键就是显示点在液晶屏上的位置 (行和列)与其在存储器中的地址之间的关系。

由于多数液晶显示模块的驱动电路是由一片行驱动器和两 片列驱动器构成,所以12864液晶屏实际上是由左右两块独立的64*64液晶屏拼接而成,每半屏有一个512*8 bits显示数据RAM。左右半屏驱动电路及存储器分别由片选信号CS1和CS2选择。(少数厂商为了简化用户设计,在模块中增加译码电路,使得 128*64液晶屏就是一个整屏,只需一个片选信号。)

显示点在64*64液晶屏上的位置由行号 (line,0~63)与列号(column,0~63)确定。512*8 bits RAM中某个存储单元的地址由页地址(Xpage,0~7)和列地址(Yaddress,0~63)确定。每个存储单元存储8个液晶点的显示信息。

为了使液晶点位置信息与存储地址的对应关系更直观关, 将64*64液晶屏从上至下8等分为8个显示块,每块包括8行*64列个点阵。每列中的8行点阵信息构成一个8bits二进制数,存储在一个存储单元中。 (需要注意:二进制的高低有效位顺序与行号对应关系因不同商家而不同)存放一个显示块的RAM区称为存储页。即64*64液晶屏的点阵信息存储在8个存储 页中,每页64个字节,每个字节存储一列(8行)点阵信息。因此存储单元地址包括页地址(Xpage,0~7)和列地址(Yaddress,0~63)。

例如点亮128*64的屏中(20,30)位置上的液 晶点,因列地址30小于64,该点在左半屏第29列,所以CS1有效;行地址20除以8取整得2,取余得4,该点在RAM中页地址为2,在字节中的序号为 4;所以将二进制数据00010000(也可能是00001000,高低顺序取决于制造商)写入Xpage=2,Yaddress=29的存储单元中即点 亮(20,30)上的液晶点。

  1. /////LCD12864液晶屏测试程序(已通过)//////
  2. ////////液晶屏型号:HJ12864M-1//////////
  3. ///////////////////////////////////////
  4.  
  5. #include <reg52.h>
  6. #define uchar unsigned char
  7. #define uint unsigned int
  8.  
  9. //8bit数据接入IO口
  10. #define Part P0 //P0接8位数据线
  11. //控制数据端
  12. sbit LCD_RS=P2^5; //定义12864液晶RS端,寄存器选择信号 H:数据寄存器 L:指令寄存器
  13. sbit LCD_RW=P2^6; //定义12864液晶RW端,读/写信号 H:读 L:写
  14. sbit LCD_EN=P2^7; //定义12864液晶LCDEN端, 片选信号 下降沿触发,锁存数据
  15. //
  16. sbit LCD_PSB=P3^2; //定义12864液晶PSB端, H:并行 L:串行
  17. sbit LCD_RST=P3^4; //定义12864液晶RST端, H:不复位 L:复位
  18. uchar code dis1[]={"床前明月光"};
  19. uchar code dis2[]={"疑是地上霜"};
  20. uchar code dis3[]={"举头望明月"};
  21. uchar code dis4[]={"低头思故乡"};
  22. //=====================================
  23. //毫秒延时函数
  24. void delay(uint xms)
  25. {
  26. uint i,j;
  27. for(j=0;i<xms;j++)
  28. for(i=0;i<110;i++);
  29. }
  30. //====================================
  31. //LCD忙检测函数
  32. bit lcd_busy()
  33. {
  34. bit result;
  35. LCD_RS=0;
  36. LCD_RW=1;
  37. LCD_EN= 1;
  38. result=(bit)(Part & 0x80);
  39. LCD_EN=0;
  40. return result;
  41. }
  42. //=====================================
  43. //液晶写命令函数
  44. void lcd_write_cmd(uchar com)
  45. {
  46. while(lcd_busy());
  47. LCD_RS=0; //选择指令寄存器
  48. LCD_RW=0; //写
  49. LCD_EN=0;
  50. Part=com; //指令值赋给P0口
  51. delay(5);
  52. LCD_EN=1;
  53. delay(5);
  54. LCD_EN=0;
  55. }
  56. //=====================================
  57. //液晶写一个字符数据函数
  58. void lcd_write_dat(uchar date)
  59. {
  60. while(lcd_busy());
  61. LCD_RS=1; //选择数据寄存器
  62. LCD_RW=0; //写
  63. LCD_EN=0;
  64. P0=date; //数据值赋给P0口
  65. delay(5);
  66. LCD_EN=1;
  67. delay(5);
  68. LCD_EN=0;
  69. }
  70. //=====================================
  71. //液晶写一个字符串函数
  72. void lcd_write_string(uchar *str)
  73. {
  74. while(*str!='\0') //未结束
  75. {
  76. lcd_write_dat(*str++);
  77. delay(5);
  78. }
  79. }
  80. //=====================================
  81. //液晶显示位置函数
  82. void lcd_pos(uchar x,uchar y) //从第X行的第Y位置开始显示
  83. {
  84. uchar pos;
  85. if(x==1) //第一行
  86. { x=0x80;}
  87. else if(x==2) //第二行
  88. { x=0x90;}
  89. else if(x==3) //第三行
  90. { x=0x88;}
  91. else if(x==4) //第四行
  92. { x=0x98;}
  93. pos=x+y-1; //首地址为0X80
  94. lcd_write_cmd(pos);
  95. }
  96. //=====================================
  97. //液晶初始化函数
  98. void lcd_init()
  99. {
  100. LCD_PSB=1; //并行方式
  101. LCD_RST=1; //不复位
  102. lcd_write_cmd(0x30);
  103. delay(5);
  104. lcd_write_cmd(0x0c); //开显示,不显示光标
  105. delay(5);
  106. lcd_write_cmd(0x06); //写一个字符后地址指针自动加1
  107. delay(5);
  108. lcd_write_cmd(0x01); //清屏
  109. delay(5);
  110. }
  111. //=====================================
  112. //主函数函数
  113. void main()
  114. {
  115. // uchar i;
  116. lcd_init();
  117. while(1)
  118. {
  119. lcd_pos(1,1);
  120. // lcd_write_string(dis1);
  121. lcd_write_string("床前明月光");
  122. delay(5);
  123. lcd_pos(2,1);
  124. // lcd_write_string(dis2);
  125. lcd_write_string("疑是地上霜");
  126. delay(5);
  127. lcd_pos(3,1);
  128. // lcd_write_string(dis3);
  129. lcd_write_string("举头望明月");
  130. delay(5);
  131. lcd_pos(4,1);
  132. // lcd_write_string(dis4);
  133. lcd_write_string("低头思故乡");
  134. delay(500);
  135. }
  136. }

12864点阵液晶显示模块的原理和实例程序(HJ12864M-1)的更多相关文章

  1. SMG12232ZK标准字符点阵型液晶显示模块的演示程序[C51编程语言][MCS51并行接口方式]

    //SMG12232ZK标准字符点阵型液晶显示模块的演示程序[C51编程语言][MCS51并行接口方式] //应用产品: SMG12232ZK标准中文字符点阵型液晶显示模块 // 本演示程序适用于SM ...

  2. 如何为编程爱好者设计一款好玩的智能硬件(八)——LCD1602点阵字符型液晶显示模块驱动封装(中)

    六.温湿度传感器DHT11驱动封装(下):如何为编程爱好者设计一款好玩的智能硬件(六)——初尝试·把温湿度给收集了(下)! 七.点阵字符型液晶显示模块LCD1602驱动封装(上):如何为编程爱好者设计 ...

  3. 如何为编程爱好者设计一款好玩的智能硬件(九)——LCD1602点阵字符型液晶显示模块驱动封装(下)

    六.温湿度传感器DHT11驱动封装(下):如何为编程爱好者设计一款好玩的智能硬件(六)——初尝试·把温湿度给收集了(下)! 七.点阵字符型液晶显示模块LCD1602驱动封装(上):如何为编程爱好者设计 ...

  4. 如何为编程爱好者设计一款好玩的智能硬件(七)——LCD1602点阵字符型液晶显示模块驱动封装(上)

    当前进展: 一.我的构想:如何为编程爱好者设计一款好玩的智能硬件(一)——即插即用.积木化.功能重组的智能硬件模块构想 二.别人家的孩子:如何为编程爱好者设计一款好玩的智能硬件(二)——别人是如何设计 ...

  5. SMG12232A2标准图形点阵型液晶显示模块的演示程序[C51编程语言]

    //SMG12232A2标准图形点阵型液晶显示模块的演示程序[C51编程语言][MCS51总线接口方式] //应用产品: SMG12232A2标准图形点阵型液晶显示模块 // 本演示程序适用于SMG1 ...

  6. Camera图像处理原理及实例分析-重要图像概念

    Camera图像处理原理及实例分析 作者:刘旭晖  colorant@163.com  转载请注明出处 BLOG:http://blog.csdn.net/colorant/ 主页:http://rg ...

  7. Camera图像处理原理及实例分析

    Camera图像处理原理及实例分析 作者:刘旭晖  colorant@163.com  转载请注明出处 BLOG:http://blog.csdn.net/colorant/ 主页:http://rg ...

  8. LCD1602液晶显示模块的单片机驱动深入详解之软件篇(AVR)

    LCD1602液晶显示模块的驱动虽然比七段数码管之类的显示要复杂一些,但实际上也并不是很难,最主要的还是初始化,为什么这么说呢?我们在调试一块新液晶屏的时候,都会先初始化看看有没有光标在闪,没有光标前 ...

  9. MATLAB神经网络原理与实例精解视频教程

    教程内容:<MATLAB神经网络原理与实例精解>随书附带源程序.rar9.随机神经网络.rar8.反馈神经网络.rar7.自组织竞争神经网络.rar6.径向基函数网络.rar5.BP神经网 ...

随机推荐

  1. 【转】说说Runnable与Callable

    说说Runnable与Callable   Callable接口:   Runnable接口: 相同点: 两者都是接口:(废话) 两者都可用来编写多线程程序: 两者都需要调用Thread.start( ...

  2. Android 调节图片工具类

    package com.base.changeimage; import android.graphics.Bitmap; import android.graphics.Canvas; import ...

  3. freopen()函数

    freopen函数通过实现标准I/O重定向功能来访问文件,而fopen函数则通过文件I/O来访问文件. freopen函数在算法竞赛中常被使用.在算法竞赛中,参赛者的数据一般需要多次输入,而为避免重复 ...

  4. Locust安装教程与使用

    Locust安装教程与使用官网地址:https://github.com/locustio/locust 如果是python3+以上的环境,需要下载locust项目源码进行安装 因Centos7.2环 ...

  5. xcode技巧

    1.统计ios开发代码,包括头文件的,终端命令进入项目目录下,命令如下 find . -name "*.m" -or -name "*.h" -or -name ...

  6. python爬虫之路——初识爬虫原理

    爬虫主要做两件事 ①模拟计算机对服务器发起Request请求 ②接收服务器端的Response内容并解析,提取所需的信息 互联网页面错综复杂,一次请求不能获取全部信息.就需要设计爬虫的流程. 本书主要 ...

  7. 2018.4.21 如何正确快速安装/卸载云服务器Centos7安装GUI图形化界面GNOME桌面环境

    为云服务哦Centos安装图形化界面GNOME .KDE 1.开始前先验证一下能不能上网 ping www.baidu.com 2.接下来开始安装X(X Window System),命令为 yum ...

  8. linux文本处理工具及正则表达式

    cat命令:查看文本内容 cat [选项]... [文件]... -E    显示行结束符 -n    显示文本内容时显示行号 -A    显示所以控制符 -b    非空行编号 -s     压缩连 ...

  9. Python——序列封包与序列解包

    一.序列封包与序列解包 把多个值赋给一个变量时,Python会自动的把多个值封装成元组,称为序列封包. 把一个序列(列表.元组.字符串等)直接赋给多个变量,此时会把序列中的各个元素依次赋值给每个变量, ...

  10. Bootstrap历练实例:默认的缩略图

    本章将讲解Bootstrap缩略图,大多数站点都需要要在网格中布局图像,视频,文本.Bootstrap通过缩略图为此提供了一些简便的方法,使用Bootstrap创建缩略图的步骤如下: 1.在图像的周围 ...