LCD12864与LCD1602最大的区别在于LCD12864可以显示汉字,同时也可以拿来画图;当然,作为图形显示不推荐lcd12864,推荐NOKIA5110

12864引脚基本和1602的引脚吻合,大部分的模块多出来两个引脚,一个是RST复位引脚,另一个是PSB通讯模式选择引脚,具体描述见下图

12864指令基本和1602相同,读写时序也应当是先读取忙标志后进行写入,命令列表如下

一般来说,基本指令集用来显示汉字足够了,在开始配置12864之前先要让模块退出复位,然后选择PSB选择相应的通讯模式,接着还要写入相应的模式命令,确定是8位MPU通讯还是4位MPU通讯

对于12864指令集的详细描述代码中会有

  1. #ifndef __LCD12864_H_
  2. #define __LCD12864_H_
  3.  
  4. #include "common.h"
  5. #include "delay.h"
  6. # include <intrins.h>
  7.  
  8. //12864基本指令集
  9. /***************************************************************************/
  10. #define LCD12864_SHOW_CLEAR 0X01
  11.  
  12. #define LCD12864_POINT_ZERO 0X02
  13.  
  14. #define LCD12864_ENTRY_MODE 0X04
  15. //BIT1 指针自动+1 1 指针自动-1 0
  16. //BIT0 屏幕跟随指针移动 1 屏幕不移动 0
  17.  
  18. #define LCD12864_DISPLAY_STATUS 0X08
  19. //BIT0 1游标闪烁˸ 0游标不闪烁
  20. //BIT1 1游标显示 0游标不显示
  21. //BIT2 1开显示 0关显示
  22.  
  23. #define LCD12864_CURSOR_MODE 0X10
  24. //BIT3 显示跟随移动 1 显示不跟随移动 0
  25. //BIT2 游标右移 1 游标左移0
  26.  
  27. #define LCD12864_FUN_SET 0X20
  28. //BIT4 1八位并口 0 四位通讯接口
  29. //BIT2 1扩充指令集 0基础指令集
  30.  
  31. #define LCD12864_CGRAM_SET 0X40//CGRAM(绘图)基础地址
  32. //BIT0-BIT5 CGRAM地址
  33.  
  34. #define LCD12864_DDRAM_SET 0X80//设定LCD地址
  35. //BIT0-BIT5 DDRAM地址(显示字符)
  36. /***********************************************************************************************/
  37.  
  38. void Lcd12864Init(void);
  39.  
  40. void Lcd12864SetPos(u8 x,u8 y);
  41.  
  42. void Lcd12864ShowStr(u8 x,u8 y,u8* buffer);//不能进行中英文混合显示
  43.  
  44. #endif
  1. #include "lcd12864.h"
  2.  
  3. sbit LCD12864_RS_PIN = p07;
  4. sbit LCD12864_RW_PIN = p06;
  5. sbit LCD12864_EN_PIN = p05;
  6. sbit LCD12864_PSB_PIN = p04;
  7. sbit LCD12864_RST_PIN = p03;
  8.  
  9. #define LCD12864_DATA P2
  10.  
  11. #define LCD_RS_CMD LCD12864_RS_PIN = 0
  12. #define LCD_RS_DAT LCD12864_RS_PIN = 1
  13.  
  14. #define LCD_RW_WRITE LCD12864_RW_PIN = 0
  15. #define LCD_RW_READ LCD12864_RW_PIN = 1
  16.  
  17. #define LCD_EN_HIGH LCD12864_EN_PIN = 1
  18. #define LCD_EN_LOW LCD12864_EN_PIN = 0
  19.  
  20. #define LCD_PSB_COM LCD12864_PSB_PIN = 0
  21. #define LCD_PSB_LPT LCD12864_PSB_PIN = 1
  22.  
  23. #define LCD_RST_LOW LCD12864_RST_PIN = 0
  24. #define LCD_RST_HIGH LCD12864_RST_PIN = 1
  25.  
  26. static void delay(unsigned int m)
  27. {
  28. unsigned int i,j;
  29. for(i=0;i<m;i++)
  30. for(j=0;j<10;j++);
  31. }
  32.  
  33. static bit Lcd12864ReadStatus(void)
  34. {
  35. bit result;
  36. LCD_RS_CMD;
  37. LCD_RW_READ;
  38. LCD_EN_HIGH;
  39. _nop_();
  40. _nop_();
  41. _nop_();
  42. _nop_();
  43. result = (bit)(LCD12864_DATA&0x80);
  44. LCD_EN_LOW;
  45. return result;
  46. }
  47.  
  48. static void Lcd12864WriteCommand(u8 command)
  49. {
  50. while(Lcd12864ReadStatus());
  51. LCD_RS_CMD;
  52. LCD_RW_WRITE;
  53. LCD_EN_LOW;
  54. _nop_();
  55. _nop_();
  56. LCD12864_DATA = command;
  57. _nop_();
  58. _nop_();
  59. _nop_();
  60. _nop_();
  61. LCD_EN_HIGH;
  62. _nop_();
  63. _nop_();
  64. _nop_();
  65. _nop_();
  66. LCD_EN_LOW;
  67. }
  68.  
  69. static void Lcd12864WriteData(u8 dat)
  70. {
  71. while(Lcd12864ReadStatus());
  72. LCD_RS_DAT;
  73. LCD_RW_WRITE;
  74. LCD_EN_LOW;
  75. _nop_();
  76. _nop_();
  77. LCD12864_DATA = dat;
  78. _nop_();
  79. _nop_();
  80. _nop_();
  81. _nop_();
  82. LCD_EN_HIGH;
  83. _nop_();
  84. _nop_();
  85. _nop_();
  86. _nop_();
  87. LCD_EN_LOW;
  88. }
  89.  
  90. // 1 lpt 0 com
  91. static void Lcd12864SelMode(u8 mode)
  92. {
  93. delay(40);
  94. if(mode)
  95. {
  96. LCD_PSB_LPT;
  97. }
  98. else
  99. {
  100. LCD_PSB_COM;
  101. }
  102. delay(1);
  103. }
  104. static void Lcd12864Rst(void)
  105. {
  106. LCD_RST_LOW;
  107. delay(1);
  108. LCD_RST_HIGH;
  109. delay(10);
  110. }
  111. void Lcd12864Init(void)
  112. {
  113. Lcd12864SelMode(1);
  114. Lcd12864Rst();
  115. Lcd12864WriteCommand(0x30); //
  116. delay(100);
  117. Lcd12864WriteCommand(0x30); //八位并口,基础指令集
  118. delay(37);
  119. Lcd12864WriteCommand(0x08); //关闭显示和游标
  120. delay(100);
  121. Lcd12864WriteCommand(0x10); //游标不跟随
  122. delay(100);
  123. Lcd12864WriteCommand(0x0C); //开显示
  124. delay(100);
  125. Lcd12864WriteCommand(0x01); //清屏
  126. delay(10);
  127. Lcd12864WriteCommand(0x06); //AC自动+ 屏幕不移动
  128. delay(100);
  129. }
  130.  
  131. void Lcd12864SetPos(u8 x,u8 y)
  132. {
  133. u8 pos = 0;
  134. switch(y)
  135. {
  136. case 1:
  137. pos = 0x80;
  138. break;
  139. case 2:
  140. pos = 0x90;
  141. break;
  142. case 3:
  143. pos = 0x88;
  144. break;
  145. case 4:
  146. pos = 0x98;
  147. break;
  148. }
  149. if(x>=8)x = 8;
  150. pos += x;
  151. Lcd12864WriteCommand(pos);
  152. }
  153.  
  154. void Lcd12864ShowStr(u8 x,u8 y,u8* buffer)
  155. {
  156. u8 i = 0;
  157. Lcd12864SetPos(x,y);
  158. for(i = 0; i < 16-2*x;i++)
  159. {
  160. if(*(buffer+i) == '\0')break;
  161. else
  162. {
  163. Lcd12864WriteData(*(buffer+i));
  164. }
  165. }
  166. }

需要注意的是,12864每次写入的时候不能中英文同时混合写入,这样会造成乱码,因为就编码来讲,一个汉字空间,是可以容纳两个ascii码字符的,所以当一个英文字母和一个汉字在一起的时候,英文字符八位编码,汉字16位编码,LCD控制器将英文的八位编码和汉字的前八位编码当成一个汉字来显示,当然就会出错了

当然,这也就是说,显示汉字的时候一定要保证汉字的第一个字符一定得是当前地址写入的第一个字符,不能是第二个,而汉字的第一个编码一般都是大于0x80的,所以遇到大于0x80数据的时候进行判断是不是当前地址写入的第一个字符,不是则重新设置地址,就能防止汉字乱码出现了

另外,51编译器keil需要选择ansci编码,选择其他编码,汉字是会变成乱码的,这纯粹是编码格式问题,嗯,最好的办法是将汉字编码变成数组依次写入,这样就能避免编辑器造成的编码问题了

51驱动LCD12864的更多相关文章

  1. 自制单片机之十五……可串行驱动LCD12864的应用

    在网上搜了一下,ST7920控制器的LCD产品可以提供8位,4位并行和串行接口可选,并行的控制接口的LCD较多,前面的贴子也介绍过,我们在这儿不说了,这儿我们讲的是串口控制LCD12864. 买了块S ...

  2. 51驱动LCD1602

    1602 采用标准的 16 脚接口,其中: 第 1 脚:VSS 为地电源 第 2 脚:VDD 接 5V 正电源 第 3 脚:V0 为液晶显示器对比度调整端,接正电源时对比度最弱,接地 电源时对比度最高 ...

  3. FPGA nios通过驱动LCD12864实现菜单界面和uart串口通信

    因为csdn无法插入视频,无法展示我这个实现的效果,这里我截了一些图,应该基本上也能明白了: 基本功能就是如图片所示,里面采用了菜单结构(这里编程需要一定得c语言编程技巧与数据结构知识),gpa是什么 ...

  4. 自制单片机之五……LCD12864的驱动

    LCD12864的驱动LCD12864在市面上主要分为两种,一种是采用st7920控制器的,它一般带有中文字库字模,价格略高一点.另一种是采用KS0108控制器,它只是点阵模式,不带字库.很可惜,我的 ...

  5. [51单片机] nRF24L01 无线模块 测试 按键-灯-远程控制

    哈哈,穷吊死一个,自己做的一个超简单的板还没有电源提供,只得借助我的大开发板啦.其实这2个模块是完全可以分开的,无线嘛,你懂得!进入正题,这个实验的功能就是一个发送模块(大的那个板)连接4个按键,通过 ...

  6. Unix/Linux环境C编程新手教程(12) openSUSECCPP以及Linux内核驱动开发环境搭建

    1. openSUSE是一款优秀的linux. watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaXRjYXN0Y3Bw/font/5a6L5L2T/font ...

  7. Unix/Linux环境C编程入门教程(12) openSUSECCPP以及Linux内核驱动开发环境搭建

    1. openSUSE是一款优秀的linux. 2.选择默认虚拟机 3.选择稍后安装操作系统 4.选择linux  opensuse 5. 选择默认虚拟机名称 6.设置处理器为双核. 7.内存设置为2 ...

  8. LCD12864 液晶显示-汉字及自定义显示(串口)

    在网上找了许久,发现FPGA用串口驱动LCD12864程序很少,基本上没有.刚开始窃喜,中间郁闷,最后还是高兴,为什么这样说呢!头一回在没有参考程序的情况下,完全是照时序图写(自信),中间调试过程遇到 ...

  9. 关于STM32驱动DS1302实时时钟的一点思考

    之前用51驱动过DS1302,没用多久就输出了正确的时间.当时以为这块芯片其实没啥,很简单.但是现在用STM32做项目,用到同样的芯片,以为这有何难,只要把那个程序拿过来复制黏贴改一下IO设置不就行了 ...

随机推荐

  1. 项目总结SpringMVC相关

    流程文字概述1.用户发送请求至前端控制器DispatcherServlet2.DispatcherServlet收到请求调用HandlerMapping处理器映射器.3.处理器映射器找到具体的处理器, ...

  2. Servlet与JSP的异同

    1.什么是Servlet A Java servlet is a Java programming language program that extends the capabilities of ...

  3. PAT (Advanced Level) 1109. Group Photo (25)

    简单模拟. #include<cstdio> #include<cstring> #include<cmath> #include<vector> #i ...

  4. CNS数据库网站只用mysql自带的fulltext index功能就可实现了。

    1)编辑脚本script.sql如下 ALTER TABLE `table_name` ADD FULLTEXT (`column_name`) 2)在mysql console下输入命令 SOURC ...

  5. 迄今最安全的MySQL?细数5.7那些惊艳与鸡肋的新特性(上)【转载】

    转自: DBAplus社群 http://www.toutiao.com/m5762164771/ 迄今最安全的MySQL?细数5.7那些惊艳与鸡肋的新特性(上) - 今日头条(TouTiao.com ...

  6. vm lxc

    taxonomy, 有4种: 进程虚拟机:1.相同指令集(wine),2.不同指令集(java)系统虚拟机:3.相同指令集(kvm),4.不同指令集(qemu) 第4种又可分为直接运行于硬件之上(xe ...

  7. 关于arguments.callee.caller.arguments[0]获得event的一些问题

    先从一个简单的例子说起,一个简单的button控件如下: < input  type ='button'  name ='mybtn'  id ='mybtn'  onclick ='myFun ...

  8. 风格一致的backItem在项目中怎样设置

    在相应的navigationController中重写- (void)pushViewController:(UIViewController *)viewController animated:(B ...

  9. 过河(DP)

    问题描述] 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙可能到达的点看成 ...

  10. iOS项目在非测试设备上的安装方法(项目上线前)

    转载自:http://blog.csdn.net/ai379558502/article/details/49003383 方法一: 这个办法,其实是国外一个创业项目 TestFlight,面向移动应 ...