LCD12864显示屏原理及使用教程

这篇具有很好参考价值的文章主要介绍了LCD12864显示屏原理及使用教程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.芯片简介

        LCD12864液晶显示模块是 128×64点阵的汉字图形型液晶显示模块,可显示汉字及图形,内置 8192个中文汉字(16X16 点阵)(需带有字库的型号才能显示中文)、128 个字符(8X16 点阵)及 64X256 点阵显示 RAM(GDRAM)。可与 CPU 直接接口,提供两种界面来连接微处理机:8-位并行及串行两种连接方式。具有多种功能:光标显示、画面移位、睡眠模式等。

lcd12864,单片机模块使用教程,单片机,stm32,c语言,嵌入式硬件

主要特点如下

  • 逻辑工作电压(VDD):4.5~5.5V;

  • 背光源电压 :4.5~5.5V;

  • 工作温度(Ta):0~60℃(常温) / -20~75℃(宽温);

  • 显示角度:6:00 钟直视;

  • 与 MCU 接口:8位或3位串行模式;

2. LCD12864引脚定义

lcd12864,单片机模块使用教程,单片机,stm32,c语言,嵌入式硬件

3.LCD12864并行控制

(1)读操作时序如图

lcd12864,单片机模块使用教程,单片机,stm32,c语言,嵌入式硬件

(2)写操作时序如图

lcd12864,单片机模块使用教程,单片机,stm32,c语言,嵌入式硬件

(3)与MCU连接原理图

        并行模式,除电源外,需要将模块的CS、SCLK、SID、DB0-DB7引脚一一与单片机连接,PSB接VCC(接地为串行模式,接VCC为并行模式),RST接VCC(低电平复位);

lcd12864,单片机模块使用教程,单片机,stm32,c语言,嵌入式硬件

(4)并行模式驱动程序

LCD12864.h


#ifndef __LCD12864_H
#define __LCD12864_H

//---包含头文件---//
#include<reg51.h>

//---重定义关键词---//
#ifndef uchar
#define uchar unsigned char
#endif

#ifndef uint 
#define uint unsigned int
#endif
//---定义使用的IO口---//

#define LCD12864_DATAPORT P0    //数据IO口

sbit LCD12864_RS  =  P2^6;             //(数据命令)寄存器选择输入 
sbit LCD12864_RW  =  P2^5;             //液晶读/写控制
sbit LCD12864_EN  =  P2^7;             //液晶使能控制
sbit LCD12864_PSB =  P3^2;             //串/并方式控制
sbit LCD12864_RST =  P3^4;         //复位端
//---声明全局函数---//
void LCD12864_Delay1ms(uint c);
uchar LCD12864_Busy(void);
void LCD12864_WriteCmd(uchar cmd);
void LCD12864_WriteData(uchar dat);
void LCD12864_Init();
void LCD12864_ClearScreen(void);
void LCD12864_SetWindow(uchar x, uchar y,uchar *word);

#endif

LCD12864.c
 


#include"lcd12864.h"
/*******************************************************************************
* 函 数 名         : LCD12864_Delay1ms
*******************************************************************************/
void LCD12864_Delay1ms(uint c)
{
    uchar a,b;
  for(; c>0; c--)
  {
      for(b=199; b>0; b--)
    {
          for(a=1; a>0; a--);
    }
  }
}

/*******************************************************************************
* 函 数 名         : LCD12864_Busy
* 函数功能       : 检测LCD是否忙
* 输    出         : 1或0(1表示不忙,0表示忙)
*******************************************************************************/
uchar LCD12864_Busy(void)
{
  uchar i = 0;
  LCD12864_RS = 0;     //选择命令
  LCD12864_RW = 1;  //选择读取
  LCD12864_EN = 1;
  LCD12864_Delay1ms(1);
  while((LCD12864_DATAPORT & 0x80) == 0x80)  //检测读取到的值
  {
    i++;
    if(i > 100)
    {
      LCD12864_EN = 0;
      return 0;     //超过等待时间返回0表示失败
    }
  }
  LCD12864_EN = 0;
  return 1;
}

/*******************************************************************************
* 函 数 名         : LCD12864_WriteCmd
* 函数功能       : 写命令
*******************************************************************************/
void LCD12864_WriteCmd(uchar cmd)
{
  uchar i;
  i = 0;
  while( LCD12864_Busy() == 0)
  {
    LCD12864_Delay1ms(1);
    i++;
    if( i>100)
    {
      return;     //超过等待退出
    }  
  } 
  LCD12864_RS = 0;     //选择命令
  LCD12864_RW = 0;     //选择写入
  LCD12864_EN = 0;     //初始化使能端
  LCD12864_DATAPORT = cmd;   //放置数据
  LCD12864_EN = 1;       //写时序
  LCD12864_Delay1ms(5);
  LCD12864_EN = 0;              
}

/*******************************************************************************
* 函 数 名         : LCD12864_WriteData
* 函数功能       : 写数据
*******************************************************************************/
void LCD12864_WriteData(uchar dat)
{
  uchar i;
  i = 0;
  while( LCD12864_Busy() == 0)
  {
    LCD12864_Delay1ms(1);
    i++;
    if( i>100)
    {
      return;     //超过等待退出
    }  
  }
  LCD12864_RS = 1;     //选择数据
  LCD12864_RW = 0;     //选择写入
  LCD12864_EN = 0;     //初始化使能端
  LCD12864_DATAPORT = dat;   //放置数据
  LCD12864_EN = 1;       //写时序
  LCD12864_Delay1ms(5);
  LCD12864_EN = 0;                    
}

/*******************************************************************************
* 函 数 名         : LCD12864_Init
*******************************************************************************/
void LCD12864_Init()
{
  LCD12864_PSB = 1;    //选择并行输入
  LCD12864_RST = 1;    //复位
  LCD12864_WriteCmd(0x30);  //选择基本指令操作
  LCD12864_WriteCmd(0x0c);  //显示开,关光标
  LCD12864_WriteCmd(0x01);  //清除LCD12864的显示内容
}

/*******************************************************************************
* 函 数 名         : LCD12864_SetWindow
*******************************************************************************/
void LCD12864_SetWindow(uchar x, uchar y,uchar *word)
{
  uchar pos;
  uchar i=y;
  if(x == 0)     // 第一行的地址是80H
  {
    x = 0x80;
  }    
  else if(x == 1)  //第二行的地址是90H
  {
    x = 0x90;  
  }  
  else if(x == 2)  //第三行的地址是88H
  {
    x = 0x88;
  }  
  else if(x == 3)  //第三行的地址是98H
  {
    x = 0x98;
  }  
  pos = x + y;
  LCD12864_WriteCmd(pos);  
  while(word[i]!='\0')
  {
    if(i<16)    //判断是否在本行的显示范围内
    {
      LCD12864_WriteData(word[i]);
      i++;
    }  
   }
}

4.LCD12864串行控制

(1)串行控制时序如图:

第一字节:格式 11111ABC

  •  A 为数据传送方向控制:H 表示数据从 LCD 到 MCU,L 表示数据从 MCU 到 LCD;

  •  B 为数据类型选择:H 表示数据是显示数据,L 表示数据是控制指令;

  •  C 固定为 0;

第二字节:(串行)8 位数据的高 4 位—格式 DDDD0000;

第三字节:(串行)8 位数据的低 4 位—格式 0000DDDD;

lcd12864,单片机模块使用教程,单片机,stm32,c语言,嵌入式硬件

(2)与MCU连接原理图

        串行模式,除电源外,只需要将模块的CS、SCLK、SID引脚与单片机连接,PSB接GND(接地为串行模式,接VCC为并行模式),RST接VCC(低电平复位);

lcd12864,单片机模块使用教程,单片机,stm32,c语言,嵌入式硬件

(3)串行模式驱动程序

LCD12864.h


#ifndef   _LCD12864_h_
#define   _LCD12864_h_
/**************************************************************
               iO口宏定义区
***************************************************************/
sbit CS =P2^3;//RS
sbit SID=P2^4;//RW
sbit SCK=P2^5;//E

extern void WriteCommand( unsigned char Cbyte );   //写入指令函数
extern void WriteData( unsigned char Dbyte );  //写入指令数据
extern void LcmInit( void );   //显示屏初始化
extern void LcmClearTXT( void );  //显示屏清屏
extern void Location_xy_12864(unsigned char x,unsigned char y);
extern void PutStr(unsigned char row,unsigned char col,unsigned char *puts);
#endif

LCD12864.c


#include <reg52.h>
#include <intrins.h>
#include"LCD12864.h"
/**************************************************************


      //串行方式控制
/*******************************************************************
              常量声明区
********************************************************************/      
unsigned char code AC_TABLE[]={                   //坐标编码
0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,
0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,
0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,
0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f,
};
/****************************************************************                        
              发送一个字节
*****************************************************************/
void SendByte(unsigned char Dbyte)
{
  unsigned char i;
  for(i=0;i<8;i++)
  {
    SCK = 0;
    Dbyte=Dbyte<<1;
    SID = CY;
    SCK = 1;
    SCK = 0;
  }
}
/**********************************************************
              接收一个字节
***********************************************************/

unsigned char ReceiveByte(void)
{
  unsigned char i,temp1,temp2;
  temp1=temp2=0;
  for(i=0;i<8;i++)
  {
    temp1=temp1<<1;
    SCK = 0;
    SCK = 1;                
    SCK = 0;
    if(SID) temp1++;
  }
  for(i=0;i<8;i++)
  {
    temp2=temp2<<1;
    SCK = 0;
    SCK = 1;
    SCK = 0;
    if(SID) temp2++;
  }
  return ((0xf0&temp1)+(0x0f&temp2));
}
/****************************************************************
                      检查忙状态
******************************************************************/
void CheckBusy( void )
{
  do SendByte(0xfc);     //11111,RW(1),RS(0),0
  while(0x80&ReceiveByte());
}

/******************************************************************
           写一个字节的指令
*******************************************************************/
void WriteCommand( unsigned char Cbyte )
{
  CS = 1;
  CheckBusy();
  SendByte(0xf8);          //11111,RW(0),RS(0),0
  SendByte(0xf0&Cbyte);
  SendByte(0xf0&Cbyte<<4);
  CS = 0;
}
/*************************************************************
                 写一个字节的数据
**************************************************************/
void WriteData( unsigned char Dbyte )
{
  CS = 1;
  CheckBusy();
  SendByte(0xfa);          //11111,RW(0),RS(1),0
  SendByte(0xf0&Dbyte);
  SendByte(0xf0&Dbyte<<4);
  CS = 0;
}

/******************************************************************
                         lcd初始化函数
*******************************************************************/
void LcmInit( void )
{
     WriteCommand(0x30);
     WriteCommand(0x03);
     WriteCommand(0x0c);
     WriteCommand(0x01);
     WriteCommand(0x06);
}

/*******************************************************************************************************
                                 设定光标函数
********************************************************************************************************/
void Location_xy_12864(unsigned char x,unsigned char y)
{
  switch(x)
  {
    case 0:
      x=0x80;break;
    case 1:
      x=0x90;break;
    case 2:
      x=0x88;break;
    case 3:
      x=0x98;break;
    default:
      x=0x80;
  }
  y=y&0x07;
  WriteCommand(0x30);
  WriteCommand(y+x);
  WriteCommand(y+x);

}
/***********************************************************************************
                  清除文本
************************************************************************************/
void LcmClearTXT( void )
{
  unsigned char i;
  WriteCommand(0x30);
  WriteCommand(0x80);
  for(i=0;i<64;i++)
  WriteData(0x20);
  Location_xy_12864(0,0);      
}
/****************************************************************************************
                      显示字符串
*****************************************************************************************/
void PutStr(unsigned char row,unsigned char col,unsigned char *puts)
{    
  WriteCommand(0x30);
  WriteCommand(AC_TABLE[8*row+col]);
  while(*puts != '\0')
  {
    if(col==8)
    {
      col=0;
      row++;
    }
    if(row==4) row=0;
    WriteCommand(AC_TABLE[8*row+col]);
    WriteData(*puts);
    puts++;
    if(*puts != '\0')
    {
      WriteData(*puts);
      puts++;
      col++;
    }  
  }
}

如需资料可在该账号下载频道下载,或关注公众号-单片机实例设计,发送“LCD12864”获取。 文章来源地址https://www.toymoban.com/news/detail-803954.html

到了这里,关于LCD12864显示屏原理及使用教程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32—LCD液晶显示屏

    目录 LCD液晶显示屏介绍 液晶的组成  物理特性 液晶显示屏内部构造  颜色深度 点亮LCD显示屏 查看原理图 图片显示 保存到工程用户代码的Inc目录下 参数为数组名 字符显示  汉字显示 某些物质在熔融状态或被溶剂溶解之后,尽管失去固态物质的刚性,却获得了液体的易流动

    2024年02月04日
    浏览(50)
  • LCD拼接屏、LED显示屏和OLED显示屏的主要区别

    我们在生活或工作中经常看到大大小小的显示屏,但很多人却分不清楚这些屏到底属于哪一类,今天sostron与大家一起来分享下关于:LCD拼接屏、LED显示屏、OLED透明屏三者的区别。 LCD拼接屏、LED显示屏和OLED显示屏是不同类型的显示技术,它们在构成、工作原理和特点上存在明

    2024年02月17日
    浏览(48)
  • 【STM32篇】驱动LCD显示屏

    本次使用的硬件设备为野火的霸道V2开发板,显示器控制芯片型号为ILI9341,实际型号为ST7789V。在编写代码时参考的是ILI9341数据手册,二者差别不大,都是240*320分辨率。         ILI9341是一个用于TFT液晶显示的单芯片控制驱动器,具有262144色的240RGB x 320像素显示解决方案。

    2024年02月12日
    浏览(47)
  • 一文读懂使用STM32驱动 LCD1602 液晶显示屏(基于Mbed Studio平台)

    LCD (Liquid Crystal Display) 液晶显示屏是一种广泛使用的一种字符型液晶显示模块。其中型号1602表示每行显示16个字符、一共2行。LCD1602相比于OLED最大的好处就是不用使用SPI或I2C等任何通信协议,而是由mbed直接将命令传给LCD从而实现控制。 LCD1602主要参数如下: 显示字符:16×2个

    2024年02月05日
    浏览(51)
  • 6.5物联网RK3399项目开发实录-驱动开发之LCD显示屏使用(wulianjishu666)

    90款行业常用传感器单片机程序及资料【stm32,stc89c52,arduino适用】 链接:https://pan.baidu.com/s/1M3u8lcznKuXfN8NRoLYtTA?pwd=c53f  ======================================================== AIO-3399J开发板外置了两个LCD屏接口,一个是EDP,一个是LVDS,接口对应板子上的位置如下图: DTS配置 引脚配置 AIO-3

    2024年04月09日
    浏览(49)
  • FPGA学习笔记03——RGB LCD显示屏

    LCD屏与FPGA芯片接口如下,其中LCD_R0—R7,G0—G7,B0—B7为RGB888信号, LCD_BL:背光板使能,为高时背光板才亮 LCD_DE:RGB数据使能,为高时RGB数据有效 LCD_VSYNC:竖直(列)扫描有效 LCD_HSYNC:水平(行)扫描有效 LCD_CLK:显示器时钟 //在控制RGB LCD屏时,即可使用DE使能,也能用VSY

    2024年02月03日
    浏览(35)
  • STC89C52单片机LCD1602显示屏介绍与代码演示

    LCD1602显示屏介绍 引脚介绍 内部结构框图  存储器  DDRAM储存器地址  CGRAM与 CGROM的地址 时序介绍 LCD1602快捷指令  LCD1602指令操作流程: 字符、字符串的显示  各种进制的数字显示 在LCD1602上显示十进制数字 在LCD1602上显示十六进制数字 在LCD1602上显示二进制数字 LCD1602(Liq

    2024年02月08日
    浏览(51)
  • 单片机 用LCD显示屏 输出字符串源代码(附Proteus图)

    附:字符型LCD显示屏型号:LM016L;这个代码应该是可以直接运行的

    2024年02月14日
    浏览(39)
  • ESP32设备驱动-I2C-LCD1602显示屏驱动

    LCD1602液晶显示器是广泛使用的一种字符型液晶显示模块。它是由字符型液晶显示屏(LCD)、控制驱动主电路HD44780及其扩展驱动电路HD44100,以及少量电阻、电容元件和结构件等装配在PCB板上而组成。 通过前面的实例我们知道,并口方式连接LCD1602将占用一定数量的GPIO口,在

    2024年02月07日
    浏览(54)
  • 【雕爷学编程】Arduino智能家居之温湿度监测与LCD显示屏输出

    Arduino是一个开放源码的电子原型平台,它可以让你用简单的硬件和软件来创建各种互动的项目。Arduino的核心是一个微控制器板,它可以通过一系列的引脚来连接各种传感器、执行器、显示器等外部设备。Arduino的编程是基于C/C++语言的,你可以使用Arduino IDE(集成开发环境)来

    2024年02月04日
    浏览(83)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包