LCD12864液晶显示模块串行连接方式

1.芯片简介
lcd12864液晶显示模块是 128×64点阵的汉字图形型液晶显示模块,可显示汉字及图形,内置 8192个中文汉字(16x16 点阵)(需带有字库的型号才能显示中文)、128 个字符(8x16 点阵)及 64x256 点阵显示 ram(gdram)。可与 cpu 直接接口,提供两种界面来连接微处理机:8-位并行及串行两种连接方式。具有多种功能:光标显示、画面移位、睡眠模式等。
主要特点如下
逻辑工作电压(vdd):4.5~5.5v;背光源电压 :4.5~5.5v;工作温度(ta):0~60℃(常温) / -20~75℃(宽温);显示角度:6:00 钟直视;与 mcu 接口:8位或3位串行模式;2. lcd12864引脚定义
3.lcd12864并行控制
(1)读操作时序如图
(2)写操作时序如图
(3)与mcu连接原理图
并行模式,除电源外,需要将模块的cs、sclk、sid、db0-db7引脚一一与单片机连接,psb接vcc(接地为串行模式,接vcc为并行模式),rst接vcc(低电平复位);
(4)并行模式驱动程序
lcd12864.h
#ifndef __lcd12864_h#define __lcd12864_h//---包含头文件---//#include//---重定义关键词---//#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);#endiflcd12864.c
#includelcd12864.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]!='�') { 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;
(2)与mcu连接原理图
串行模式,除电源外,只需要将模块的cs、sclk、sid引脚与单片机连接,psb接gnd(接地为串行模式,接vcc为并行模式),rst接vcc(低电平复位);
(3)串行模式驱动程序
lcd12864.h
#ifndef _lcd12864_h_#define _lcd12864_h_/************************************************************** io口宏定义区***************************************************************/sbit cs =p2^3;//rssbit sid=p2^4;//rwsbit sck=p2^5;//eextern 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);#endiflcd12864.c
#include #include #includelcd12864.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 != '�') { if(col==8) { col=0; row++; } if(row==4) row=0; writecommand(ac_table[8*row+col]); writedata(*puts); puts++; if(*puts != '�') { writedata(*puts); puts++; col++; } }}

机器视觉检测—OCR字符检测的应用
光伏电站将获增值税即征即退50%的利好
采购自助售货机主板时要注意什么
Molex Brad M12电源F编码电线组和插座产品
华为云发布CodeArts Check代码检查服务,守护软件质量和安全
LCD12864液晶显示模块串行连接方式
目前中国LED产业面临新的四大挑战与规范
据说1nm光刻机已经被设计出来了,预计2022年即可商用
运放为什么要使用退耦电容呢?
北京大学教授、平安银等一行60人莅临比亚迪全球总部
2022,我们追逐群星,也在追逐AIGC的无尽可能
5G智慧安防项目建设提速
镜面广告机在公共场所中如何有效的传播商家广告
拉绳开关使用方法及注意事项
HMC980LP4E有源偏置控制器
本田宣布将实施人员优化,继续向新能源车转型并应对降价竞争
温度冲击和循环的区别_环境可靠性测试设备
提高室内LED显示屏散热量的七点技巧
射频功率放大器宽带匹配如何解决?这篇文章讲得够详细了
热点:被动元件龙头国巨并购日本太阳诱电