拓冰建站拓冰建站
首页 / 资讯中心 / 正文

单片机LCD12864显示系统:从并行时序到驱动代码实战

简介《单片机LCD12864显示系统课程设计》是一份完整的单片机课程设计报告面向单片机初学者、电子类专业在校生以及需要完成类似课设任务的同学。内容涵盖以AT89S51为主控芯片、SED1520为液晶控制器的LCD12864显示系统设计方案具体包括系统总体方案、单片机最小系统、显示电路、按键控制电路等硬件电路设计以及汉字显示、上下移屏、左右移屏等软件模块的实现思路。资源仅包含1个PDF文件压缩包大小约1.13MB便于下载后直接阅读。该课程设计报告已有135人学习浏览。读者可获得完整的系统框图、硬件接口技术分析、各功能模块的软件设计逻辑以及课程设计体会与参考文献能够直接参考或借鉴这一完整设计方案来完成自身的单片机LCD显示类项目。 做过单片机课程设计的同学应该对LCD12864不陌生。这个型号的液晶屏是课程设计里的常客温度计、万年历、智能小车、信号发生器凡是需要“看得见”的界面基本都会拿它来撑场面。我当初做的就是“单片机LCD12864显示系统”这个题目说白了就是用单片机的IO口去控制一块128x64像素的点阵液晶把字符、汉字、图形按自己的想法显示出来。这个题目看起来不起眼但真做起来涉及的东西并不少并行串行接口怎么选、时序怎么对、字模怎么取、对比度怎么调每一步都有坑。本篇文章就把我当时从选型到跑通全流程的思路和代码整理出来给正在做或者准备做类似题目的人一个直接能用的参考。1. 项目概述与整体设计思路1.1 LCD12864显示系统到底在做什么先把这个题目拆开看。“单片机”是控制核心负责产生数据和指令“LCD12864”是显示终端负责把数据变成屏幕上的内容“显示系统”则是软件层面的组织方式让你能灵活地切换页面、更新数据、绘制图形。三者合在一起就是我们常说的“带显示功能的嵌入式终端”。LCD12864屏本质是一个点阵液晶横128个点、竖64个点共8192个像素点。控制芯片最常见的是ST7920内部带了中文字库也就是说你直接给它一个GB2312编码的汉字内码它自己就能把字显示出来不需要一张张存字模图片。这是它比LCD1602方便的地方也是它比OLED屏便宜却更“笨重”的原因。对于课程设计来说能用汉字显示菜单和人机交互界面是个很大的加分项答辩的时候展示效果远好于光几个数字跳来跳去。1.2 方案选型与硬件规划我的设计选了最经典的51内核单片机STC89C52RC原因无他课程设计的核心是把显示原理搞清楚而不是去折腾复杂的外设驱动。LCD12864支持并行和串行两种接口模式我最终采用了8位并行方式虽然占用IO多一些但速度最快逻辑也最直观适合拿来对时序做分析。硬件上除了单片机最小系统和屏本身还需要一个10K电位器来调对比度以及几个按键用于页面切换。设计目标很明确上电后显示系统标题按下按键能在几个功能页面之间切换其中一页显示动态数据我用的是ADC采样电压值一页显示绘制出来的波形曲线。这套东西做下来硬件简单但覆盖了LCD12864的核心功能字符、汉字、图形都有了。2. 硬件设计与驱动原理详解2.1 LCD12864引脚定义与接线要点LCD12864模块通常是20个引脚不同厂家引脚排列略有差异但核心信号是一样的。8位并行模式下除了电源和背光关键就是三根控制线和8根数据线。我整理了一张引脚对照表方便照着接线引脚名称功能接法1VSS电源地GND2VDD电源正5V3VO对比度调节接电位器中间抽头4RS数据/指令选择单片机P2.05RW读/写选择单片机P2.16E使能信号单片机P2.27-14D0-D78位数据总线单片机P0口15PSB并/串行接口选择接VCC并行模式17RST复位接VCC或复位电路19A背光正极串电阻接5V20K背光负极GND这里最容易被忽略的是VO引脚。它在5V供电下通常需要调节到1V左右才能看到清晰的显示接一个10K电位器从VCC到GND分压中间抽头接VO上电后慢慢旋到屏幕出现墨色就是正常的。很多同学上电发现屏幕只有背光亮、一个字都没有八成就是对比度没调好。2.2 读写时序与初始化流程ST7920控制器的并行时序里最关键的是理解E使能信号在时序中的作用。ST7920的数据手册里有一个非常重要的约束E引脚要保持高电平至少一段时间之后E从高变低的下降沿数据被锁存进控制器内部。也就是说数据总线上的内容必须在E下降沿之前稳定下来。标准的一个写周期我总结成了四步给RS和RW设置正确的电平把数据放到数据总线上给E一个足够宽的高脉冲然后拉低E。因为51单片机的IO操作速度相对较慢只要不是连续高速写入基本不需要额外插入延时。我实测用的STC89C52RC在12MHz晶振下不加延时也能稳定工作但如果用的是一般单片机模拟时序建议在E高电平期间加1-2微秒的延时兼容性更好。初始化流程的顺序是固定的抄网上代码很容易但要理解为什么这样设计。整个初始化分三步功能设定、显示开关控制、清屏。其中“显示开关控制”这一步的参数包含开关显示和光标是否闪烁两个功能很多人直接写0x0C就是开显示、关光标如果写0x0E就会莫名其妙出现一个下划线光标这是很多人踩过的坑。3. 程序设计与核心代码实现3.1 基础驱动函数写命令与写数据写命令和写数据是整个显示的基石。区别只在RS引脚的电平RS为0时写入的是指令RS为1时写入的是数据。基础代码可以这么写#define LCD_DATA P0 sbit LCD_RS P2^0; sbit LCD_RW P2^1; sbit LCD_E P2^2; void LCD_WriteCmd(unsigned char cmd) { LCD_RS 0; // 指令模式 LCD_RW 0; // 写操作 LCD_DATA cmd; // 数据放到总线 LCD_E 1; // 产生下降沿锁存 Delay_us(2); LCD_E 0; Delay_us(50); // 指令执行需要时间 } void LCD_WriteData(unsigned char dat) { LCD_RS 1; // 数据模式 LCD_RW 0; LCD_DATA dat; LCD_E 1; Delay_us(2); LCD_E 0; Delay_us(50); }这段代码里的延时不是随便拍的。E高电平保持2微秒是为了满足ST7920数据手册中E脉冲宽度的要求写数据后延时50微秒是给控制器留出内部处理的时间。如果把这些延时全去掉在51单片机上偶尔还能工作但换到STM32这种高速单片机就很容易出现花屏因为总线速度太快控制器根本反应不过来。3.2 显示字符、汉字与自定义图形ST7920显示字符的原理比较简单它内部有一个文本显示区分DDRAM地址你往哪个地址写数据内容就出现在对应的行列位置。对于12864屏文本模式下是4行每行8个汉字或16个ASCII字符。第一行地址从0x80开始第二行0x90第三行0x88第四行0x98。需要特别注意这个地址跳转规律。很多人以为是0x80、0x81、0x82这样一路排下去实际上第二行的首地址不是0x88而是0x90它是按“上半屏两行、下半屏两行”的结构来排列的。第三行首地址0x88是因为它和第一行同处上半屏第四行0x98跟第二行同处下半屏。这个规律不搞清楚界面布局一定乱。显示汉字就更容易了ST7920内置字库支持GB2312编码的常用汉字直接写入两个字节的内码就能显示。我在显示系统标题“LCD12864显示系统”的时候拆成“显示系统”四个汉字查它们的GB2312编码然后直接写进DDRAM地址就行。实测下来比自己在Photoshop里画字模再一张张贴图省了太多功夫。图形显示则要切换进绘图模式。ST7920的GDRAM是64行x16列的字节数组每个字节的每一位对应一个像素点。画图的思路是先关掉图形显示功能往GDRAM写坐标和像素数据全部写完后再打开图形显示开关图形和文本可以同时显示在屏幕上。我这里给出一个画点的核心逻辑void LCD_DrawPoint(unsigned char x, unsigned char y) { unsigned char row, col, byteH, byteL; unsigned char readH, readL; // 计算坐标对应的GDRAM地址 row y; // GDRAM行0-63 col x / 16; // 每行16个字节 byteH (row 0x07) | 0x80; // 垂直地址高位 byteL col 0x80; // 水平地址 // 先关图形读回原值再写回 ... }GDRAM读改写的过程比较绕网上能搜到很多写法但核心思想是一致的LCD12864不支持直接对某个像素点单独写必须先读出该字节当前值把要画的点位改成1再整字节写回去。这一步当初花了我不少时间读数据时需要把RW置1而且读时序比写时序多一个空读周期这算是ST7920一个不大不小的坑。3.3 一个完整的显示系统框架基础驱动跑通以后就可以往“系统”的方向设计了。我做的框架是一个简单的状态机系统启动后处于主菜单页按下按键切换到对应功能子页面子页面返回主菜单主菜单显示系统标题和版本号功能页面分别有电压显示页和波形绘制页。这个结构的核心是定义一个页面编号变量unsigned char page 0; // 0主菜单 1电压显示 2波形绘制 void main(void) { LCD_Init(); while(1) { KEY_Scan(); switch(page) { case 0: Display_MainMenu(); break; case 1: Display_Voltage(); break; case 2: Display_Wave(); break; default: page 0; break; } } }状态机的思路看起来简单但好处非常明显页面之间互不干扰给后续增加新功能只动switch分支不会动底层驱动代码。我见过不少同学把显示逻辑和按键处理全部堆在main函数里最后改一个功能另一块就崩了那就是因为缺了这层架构。4. 调试经验与常见问题排查实录4.1 上电黑屏、只有背光怎么回事这个问题在课程设计答辩前最常出现。排查顺序我建议按照供电、对比度、复位、初始化代码四步走。先用万用表测屏的VDD引脚有没有5V再测背光两端电压是否正常。如果都正常就把目光放到VO引脚的电位器上慢慢从高往低拧边拧边看屏幕有没有反应。很多情况下黑屏不是代码问题就是对比度电压不对字符显示出来但颜色和底色太接近肉眼看不到而已。最后才是排查复位和初始化时序。ST7920上电后需要一个较长的复位时间如果单片机的复位比屏的复位早结束屏可能还没准备好此时初始化指令会被丢掉表现为指令发了但屏幕一动不动。解决方案是在初始化函数最前面加一个至少50ms的延时让屏完成内部复位。4.2 花屏、乱码与字符错位花屏的第一个常见原因是初始化顺序错乱。ST7920的功能设定指令0x30是开启8位并行接口的必须在所有指令之前发送而且通常要发送三次每次间隔一段时间确保控制器在正确的工作模式下。如果一上来就发清屏0x01屏幕可能完全不理会。第二个原因是总线时序不满足要求E高电平时间太短数据还没被锁存就消失了。第三个原因是DDRAM地址计算错误尤其是第二行和第四行的首地址搞混接着字符就会出现在意料之外的物理位置。还有一个非常隐蔽的问题数据总线上有上拉电阻与否会影响显示稳定性。STC89C52的P0口是开漏输出如果不加上拉电阻高电平输出能力很弱在数据线较长或者供电不稳的情况下会导致随机花屏。解决办法很简单P0口接一个10K排阻到VCC一劳永逸。4.3 引脚占用太多与显示刷新慢8位并行模式要占掉11个IO口对单片机其他功能模块的影响比较大。如果项目还接了传感器、按键、电机驱动这些外设IO资源就会吃紧。两个解决办法一是把PSB引脚接低电平切换到串行模式这样只需要3根线CS、SCLK、SID数据是一位一位送进去的初始化代码里指令也要改成串行时序对应的0xF8、0xF9系列二是用595移位寄存器做并转串把数据总线从8根压缩到3根。前者改代码成本低但刷新速度慢后者硬件多一点但显示速度保持并行水准。5. 避坑指南那些资料里不会明说的细节5.1 液晶模块的型号差异陷阱LCD12864只是一个统称市面上至少有两种主控方案在卖一个是ST7920一个是KS0108。两者的指令系统完全不同动图、绘图方式也截然不同。买模块的时候一定要看描述里是否写明“ST7920主控”或“含中文字库”如果只是泛泛写LCD12864收到货可能跟你手头的代码完全不兼容。5.2 取模软件的设置要点虽然ST7920自带中文字库但显示ASCII字符或自定义图标时还是需要字模工具。如果你用了字模软件生成数据注意几个参数取模方式要选“逐行取模”还是“逐列取模”要和绘图写入方向保持一致字节顺序是高位在前还是低位在前也要事先确认。这两项一旦选错画出来的图形就是横七竖八的乱码而且肉眼很难看出规律排查起来非常痛苦。5.3 先确保背光亮再调对比度我调试时的一个习惯是先把背光点亮确认供电无误然后随手拧对比度电位器直到屏幕出现淡淡的墨点这时候说明屏已经正常工作代码层面出了问题就可以放心去查指令和时序。如果背光都不亮先去查电源线有没有接反、背光限流电阻是否把电流限制得太死。这块排错思路如果用一句话总结就是“先硬件后软件、先供电后时钟、先静态后动态”。本文还有配套的精品资源点击获取
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门