12864点阵液晶显示模块的原理和实例程序(HJ12864M-1)

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)上的液晶点。

/////LCD12864液晶屏测试程序(已通过)//////
////////液晶屏型号:HJ12864M-1//////////
///////////////////////////////////////

#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int  

//8bit数据接入IO口
#define Part P0    //P0接8位数据线
//控制数据端
sbit LCD_RS=P2^5;  //定义12864液晶RS端,寄存器选择信号 H:数据寄存器 L:指令寄存器
sbit LCD_RW=P2^6;  //定义12864液晶RW端,读/写信号  H:读   L:写
sbit LCD_EN=P2^7;  //定义12864液晶LCDEN端, 片选信号  下降沿触发,锁存数据
//
sbit LCD_PSB=P3^2;  //定义12864液晶PSB端, H:并行 L:串行
sbit LCD_RST=P3^4;  //定义12864液晶RST端, H:不复位  L:复位
uchar code dis1[]={"床前明月光"};
uchar code dis2[]={"疑是地上霜"};
uchar code dis3[]={"举头望明月"};
uchar code dis4[]={"低头思故乡"};
//=====================================
//毫秒延时函数
void delay(uint xms)
{
 uint i,j;
 for(j=0;i<xms;j++)
  for(i=0;i<110;i++);
}
//====================================
//LCD忙检测函数
bit lcd_busy()
{
 bit result;
    LCD_RS=0;
  LCD_RW=1;
  LCD_EN= 1;
   result=(bit)(Part & 0x80);
   LCD_EN=0;
  return result;
}
//=====================================
//液晶写命令函数
void lcd_write_cmd(uchar com)
{
 while(lcd_busy());
 LCD_RS=0;  //选择指令寄存器
 LCD_RW=0;  //写
 LCD_EN=0;
 Part=com;    //指令值赋给P0口
 delay(5);
 LCD_EN=1;
 delay(5);
 LCD_EN=0;
}
//=====================================
//液晶写一个字符数据函数
void lcd_write_dat(uchar date)
{
 while(lcd_busy());
 LCD_RS=1;  //选择数据寄存器
 LCD_RW=0;  //写
 LCD_EN=0;
 P0=date;    //数据值赋给P0口
 delay(5);
 LCD_EN=1;
 delay(5);
 LCD_EN=0;
}
//=====================================
//液晶写一个字符串函数
void lcd_write_string(uchar *str)
{
 while(*str!=‘\0‘)  //未结束
 {
  lcd_write_dat(*str++);
  delay(5);
 }
}
//=====================================
//液晶显示位置函数
void lcd_pos(uchar x,uchar y)  //从第X行的第Y位置开始显示
{
 uchar pos;
 if(x==1)        //第一行
 { x=0x80;}
 else if(x==2)  //第二行
 { x=0x90;}
 else if(x==3)  //第三行
 { x=0x88;}
 else if(x==4)  //第四行
 { x=0x98;}
 pos=x+y-1;     //首地址为0X80
 lcd_write_cmd(pos);
}
//=====================================
//液晶初始化函数
void lcd_init()
{
 LCD_PSB=1;  //并行方式
 LCD_RST=1;  //不复位
 lcd_write_cmd(0x30);
 delay(5);
 lcd_write_cmd(0x0c);  //开显示,不显示光标
 delay(5);
 lcd_write_cmd(0x06);  //写一个字符后地址指针自动加1
 delay(5);
 lcd_write_cmd(0x01);   //清屏
 delay(5);
}
//=====================================
//主函数函数
void main()
{
// uchar i;
 lcd_init();
 while(1)
 {
  lcd_pos(1,1);
 // lcd_write_string(dis1);
     lcd_write_string("床前明月光");
  delay(5);
  lcd_pos(2,1);
 // lcd_write_string(dis2);
  lcd_write_string("疑是地上霜");
  delay(5);
  lcd_pos(3,1);
 // lcd_write_string(dis3);
  lcd_write_string("举头望明月");
  delay(5);
  lcd_pos(4,1);
 // lcd_write_string(dis4);
  lcd_write_string("低头思故乡");
  delay(500);
 }
}
时间: 2024-07-30 14:20:57

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

12864点阵液晶显示

1系统12864点阵型液晶显示屏的基本原理 12864点阵图形液晶显示器应用,一种通过C51编程实现对LCD12864液晶屏的控制,液晶显示器(LCD)具有低工作电压.微功耗.显示灵活.成本低等特点. 数字电路中数据以0和1保存,对LCD控制器进行不同的数据操作,可以得到不同的结果.对于显示英文操作,由于英文字母种类少只需要8位(一字节)即可.而对于中文,常用却有6000以上,于是我们的DOS前辈想了一个办法,就是将ASCII表的高128个很少用到的数值以两个为一组来表示汉字,即汉字的内码.而剩

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

六.温湿度传感器DHT11驱动封装(下):如何为编程爱好者设计一款好玩的智能硬件(六)——初尝试·把温湿度给收集了(下)! 七.点阵字符型液晶显示模块LCD1602驱动封装(上):如何为编程爱好者设计一款好玩的智能硬件(七)——LCD1602点阵字符型液晶显示模块驱动封装(上) 八.LCD1602点阵字符型液晶显示模块驱动封装(中) 已经有好一阵子没写了,一方面是因为最近闲杂的事特多,另一方面(主要方面)是因为我卡在了LCD1602驱动的权衡上面——总共3个控制线和一个8位并行的数据线,放在51

LCD1602液晶显示模块深入详解之软件篇(AVR)

LCD1602液晶显示模块的驱动虽然比七段数码管之类的显示要复杂一些,但实际上也并不是很难,最主要的还是初始化,为什么这么说呢?我们在调试一块新液晶屏的时候,都会先初始化看看有没有光标在闪,没有光标前是一番努力(PROTEUS上也是这么做的),光标出来之后就相对很容易了. 那初始化的流程是怎么样的呢?我们还是看看HD44780的数据手册吧,如下图所示: 可以看到,初始化的主要步骤如下: (1)上电:这特么也算是一个步骤么?是的!如果你用的是其它液晶模块,比如LCD12864,会发现有一个复位引脚

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

Camera图像处理原理及实例分析 作者:刘旭晖  [email protected]  转载请注明出处 BLOG:http://blog.csdn.net/colorant/ 主页:http://rgbbones.googlepages.com/ 做为拍照手机的核心模块之一,camera sensor 效果的调整,涉及到众多的参数,如果对基本的光学原理及 sensor 软/硬件对图像处理的原理能有深入的理解和把握的话,对我们的工作将会起到事半功倍的效果.否则,缺乏了理论的指导,只能是凭感觉和经

TCP/IP协议族——ARP、DNS工作原理及实例详解

 测试网络: 通过VMware创建了两个虚拟机,并利用桥接方式联网以此模拟两台主机连接一台路由器的情况.测试网络图如下: ARP协议工作原理 ARP协议能实现任意网络地址到任意物理地址的转换,这里仅讨论IP地址到以太网地址(MAC地址)的转换.其工作原理是:主机向自己所在网络广播一个ARP请求,该请求包含目标机器的网络地址.此网络上的其他机器都将接收到这个请求,但只有被请求的目标机器会回应一个ARP应答,其中包含自己的物理地址. 以太网ARP请求/应答报文 以太网ARP请求/应答报文格式如下

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

Camera图像处理原理及实例分析 作者:刘旭晖  [email protected]  转载请注明出处 BLOG:http://blog.csdn.net/colorant/ 主页:http://rgbbones.googlepages.com/ 做为拍照手机的核心模块之一,camera sensor 效果的调整,涉及到众多的参数,如果对基本的光学原理及 sensor 软/硬件对图像处理的原理能有深入的理解和把握的话,对我们的工作将会起到事半功倍的效果.否则,缺乏了理论的指导,只能是凭感觉和经

TCP/IP协议族——IP工作原理及实例详解(上)

 IP协议详解 本文主要介绍了IP服务特点,头部结构,IP分片知识,并用tcpdump抓取数据包,来观察IP数据报传送过程中IP的格式,以及分片的过程. IP头部信息:IP头部信息出现在每个IP数据报中,用于指定IP通信的源端IP地址.目的端IP地址,知道IP分片和重组. IP数据报的路由和转发:IP数据报的路由和转发发生在出目标机器之外的所有主机和路由器上.他们决定数据报是否应该转发以及如何转发. IP服务的特点 IP协议是TCP/IP协议族的动力,它为上层协议提供无状态.无连接.不可靠的

点阵字库的生产原理(转)

源:点阵字库的生产原理 所有的汉字或者英文都是下面的原理, 由左至右,每8个点占用一个字节,最后不足8个字节的占用一个字节,而且从最高位向最低位排列. 生成的字库说明:(以12×12例子) 一个汉字占用字节数:12÷8=1····4也就是占用了2×12=24个字节. 编码排序A0A0→A0FE A1A0→A2FE依次排列. 以12×12字库的“我”为例:“我”的编码为CED2,所以在汉字排在CEH-AOH=2EH区的D2H-A0H=32H个.所以在12×12字库的起始位置就是[{FE-A0}*2

tco/iP协议族——IP工作原理及实例详解(下)

 IP协议详解 上一篇文章文章主要介绍了IP服务的特点,IPv4头部结构IP分片,并用tcpdump抓取数据包,来观察IP数据报传送过程中IP的格式,以及分片的过程.本文主要介绍IP路由,IP转发,重定向和IPv6头部结构. IP路由 IP协议的一个核心任务是数据报的路由,即决定发送数据报到目标机器的路径.为了理解IP路由过程,我们先简要分析IP模块的基本流程. IP模块工作流程 从右往左分析上图,它首先对该数据报的头部做CRC校验,确认无误之后就分析其头部的具体信息. 如果该IP数据报的头