找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 17195|回复: 31
打印 上一主题 下一主题
收起左侧

LCD12864(KS0108)驱动程序 显示汉字-字符

  [复制链接]
跳转到指定楼层
楼主
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)

  1. #include <reg52.h>
  2. #include<intrins.h>
  3. #include<string.h>
  4. #include "hanzi.h"  //汉字库头文件
  5. #include "shuzi.h"  //字符库头文件
  6. #define uchar unsigned char
  7. #define uint unsigned int

  8. //   lcd12864(ks0108)
  9. #define LCD_DATA P2  //LCD8位并行数据口   
  10. sbit LCD_RS=P0^5;          //寄存器选择
  11. sbit LCD_RW=P0^6;          //读/写选择
  12. sbit LCD_EN=P0^7;          //读写使能
  13. sbit LCD_CS1=P0^2;          //右半屏选择,1有效
  14. sbit LCD_CS2=P0^3;          //左半屏选择,1有效
  15. sbit LCD_RST=P0^4;          //复位信号
  16. //*********************************************//
  17. // 函数声明
  18. void init_lcd(void);
  19. void lcd_delay(uint time);            //延时
  20. void lcd_write_com(uchar cmdcode);    //写命令
  21. void lcd_write_data(uchar Rsspdata);  //写数据
  22. void lcd_Clr_Scr(void);               //清屏
  23. void lcd_werite_x_y(uchar x,uchar y); //写地址
  24. void lcd_write_chinese(uchar x,uchar y, uchar hz,uchar *dat); //任意位置显示任意汉字
  25. void lcd_write_english(uchar x,uchar y, uchar en,uchar *dat); //任意位置显示任意字符
  26. //****************************************************************************//
  27. //---------------------------------------
  28. //    主函数
  29. //---------------------------------------
  30. void main(void)
  31. {
  32.           init_lcd();     //初始化
  33.           lcd_Clr_Scr();  //清屏
  34.         while(1)
  35.         {
  36.                 lcd_write_english(0,0,0,SHUZI);
  37.                 lcd_write_english(0,8,1,SHUZI);
  38.                 lcd_write_english(0,16,2,SHUZI);
  39.                 lcd_write_english(0,24,3,SHUZI);
  40.                 lcd_write_english(0,32,4,SHUZI);
  41.                 lcd_write_english(0,40,5,SHUZI);
  42.                 lcd_write_english(0,48,6,SHUZI);
  43.                 lcd_write_english(0,56,7,SHUZI);
  44.                 lcd_write_english(0,64,8,SHUZI);
  45.                 lcd_write_english(0,72,9,SHUZI);
  46.                
  47.                 lcd_write_chinese(2,0,0,HANZI);
  48.                 lcd_write_chinese(2,16,1,HANZI);
  49.                 lcd_write_chinese(4,0,2,HANZI);
  50.                 lcd_write_chinese(4,16,3,HANZI);
  51.                 lcd_write_chinese(4,32,4,HANZI);
  52.                 lcd_write_chinese(4,48,5,HANZI);
  53.                 lcd_write_chinese(4,64,6,HANZI);
  54.                 lcd_write_chinese(4,80,7,HANZI);
  55.                 lcd_write_chinese(4,96,8,HANZI);
  56.                 while(1);
  57.         }
  58. }
  59. //---------------------------------------
  60. //   延时函数
  61. //---------------------------------------
  62. void lcd_delay(uint time)
  63. {
  64.           uint i;
  65.           for(i=0;i<time;i++);
  66. }
  67. //---------------------------------------
  68. //   12864初始化函数
  69. //---------------------------------------
  70. void init_lcd(void)
  71. {           
  72.           LCD_RST=0;              //液晶复位
  73.           lcd_delay(250);         //适当延时
  74.           LCD_RST=1;              //复位结束
  75.           LCD_CS1=1;                         //左半屏选通
  76.           LCD_CS2=1;                             //右半屏选通        
  77.           lcd_delay(250);         //适当延时
  78.           lcd_write_com(0x3f);    //显示开
  79. }
  80. //---------------------------------------
  81. //   写命令函数
  82. //---------------------------------------
  83. void lcd_write_com(uchar cmdcode)
  84. {                                          
  85.           LCD_RS=0;                        //选择命令寄存器
  86.           LCD_RW=0;                         //写选通
  87.           LCD_DATA=cmdcode;   //将命令写入总线
  88.           _nop_();            //空操作,做短暂的延时
  89.           LCD_EN=1;           //E的下降沿,数据写入
  90.           _nop_();            //空操作,做短暂的延时
  91.           LCD_EN=0;           //E的下降沿,数据写入
  92. }
  93. //---------------------------------------
  94. //   写数据函数
  95. //---------------------------------------
  96. void lcd_write_data(uchar Rsspdata)
  97. {

  98.           LCD_RS=1;                        //选择数据寄存器
  99.           LCD_RW=0;                         //写选通
  100.           LCD_DATA=Rsspdata;  //将数据写入总线
  101.           _nop_();            //空操作,做短暂的延时
  102.           LCD_EN=1;           //E的下降沿,数据写入
  103.           _nop_();            //空操作,做短暂的延时
  104.           LCD_EN=0;           //E的下降沿,数据写入
  105. }
  106. //---------------------------------------
  107. //   清屏函数
  108. //---------------------------------------
  109. void lcd_Clr_Scr(void)
  110. {
  111.           uchar j,k;
  112.           LCD_CS1=1;                                           //左半屏选通
  113.           LCD_CS2=1;                                           //右半屏选通
  114.           lcd_write_com(0x40+0);        //将列地址写入  
  115.           for(k=0;k<8;k++)
  116.           {
  117.                     lcd_write_com(0xb8+k);    //将行地址写入        
  118.                     for(j=0;j<64;j++)               //每行的64列都写0,因为选了左右两屏,
  119.                     {
  120.                               lcd_write_data(0x00); //64列同时写0
  121.                     }
  122.           }
  123. }
  124. //---------------------------------------
  125. //    地址写入函数
  126. //---------------------------------------
  127. void lcd_werite_x_y(uchar x,uchar y)
  128. {
  129.           y=y&0x7f;                                 //限定范围,列不能超过128
  130.           x=x&0x07;                             //限定范围,行不能超过8
  131.           if(y<64)                    //如果列小于64
  132.           {
  133.                     LCD_CS1=1;                  //选通左半屏
  134.                     LCD_CS2=0;                  //关闭右半屏
  135.                     lcd_write_com(0x40+y);  //将列地址写入  
  136.           }
  137.           else
  138.           {
  139.                     LCD_CS1=0;                  //关闭左半屏
  140.                     LCD_CS2=1;                  //选通右半屏
  141.                     y&=0x3f;
  142.                     lcd_write_com(0x40+y);  //将列地址写入         
  143.           }
  144.           lcd_write_com(0xb8+x);      //将行地址写入        
  145. }
  146. //---------------------------------------
  147. //     指定位置写16*16汉字函数
  148. //---------------------------------------
  149. void lcd_write_chinese(uchar x,uchar y, uchar hz,uchar *dat)
  150. {
  151.           uchar i=0;        
  152.           lcd_werite_x_y(x,y);             //设定起始地址
  153.           for(i=0;i<16;i++)
  154.           lcd_write_data(dat[hz*32+i]);    //先写上半个字,共16个字节
  155.           lcd_werite_x_y(x+1,y);           //设定起始地址,此次将行地址加1,以便写下行
  156.           for(i=0;i<16;i++)
  157.           lcd_write_data(dat[hz*32+16+i]); //再写下半个字,共16个字节
  158. }        
  159. //---------------------------------------
  160. //     指定位置写8*16字符函数
  161. //---------------------------------------
  162. void lcd_write_english(uchar x,uchar y, uchar en,uchar *dat)
  163. {
  164.     uchar i=0;        
  165.           lcd_werite_x_y(x,y);            //设定起始地址
  166.           for(i=0;i<8;i++)
  167.           lcd_write_data(dat[en*16+i]);   //先写上半个字,共8个字节
  168.           lcd_werite_x_y(x+1,y);          //设定起始地址,此次将行地址加1,以便写下行
  169.           for(i=0;i<8;i++)
  170.           lcd_write_data(dat[en*16+8+i]); //再写下半个字,共8个字节
  171. }
复制代码

全部资料51hei下载地址:
LCD12864显示汉字-字符程序.zip (114.98 KB, 下载次数: 558)



评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏12 分享淘帖 顶2 踩
回复

使用道具 举报

沙发
ID:228939 发表于 2018-1-23 12:38 | 只看该作者
学习学习
回复

使用道具 举报

板凳
ID:62743 发表于 2018-4-26 17:10 | 只看该作者
牛人,好好拜读了
回复

使用道具 举报

地板
ID:326163 发表于 2018-5-9 22:10 来自手机 | 只看该作者
我的怎么不能用?
回复

使用道具 举报

5#
ID:53978 发表于 2018-5-10 09:54 | 只看该作者
慢慢学习
回复

使用道具 举报

6#
ID:27031 发表于 2018-6-1 19:00 | 只看该作者
谢谢分享好的资源~
回复

使用道具 举报

7#
ID:75806 发表于 2018-6-21 22:46 | 只看该作者
正需要这个程序,学习一下
回复

使用道具 举报

8#
ID:142383 发表于 2018-8-1 08:26 | 只看该作者
正在弄这个不带字库的屏,先学习学习楼主的程序。
回复

使用道具 举报

9#
ID:387860 发表于 2018-8-25 14:39 | 只看该作者
下了,显示不了啊
回复

使用道具 举报

10#
ID:243394 发表于 2018-8-26 11:51 | 只看该作者
谢谢分享好的资源~
回复

使用道具 举报

11#
ID:399899 发表于 2018-10-13 21:08 | 只看该作者
这个的确不多,中文字库,很方便
回复

使用道具 举报

12#
ID:414506 发表于 2018-10-24 10:57 | 只看该作者
本人是新手,刚在学习此部分;太感谢了
这个的确不多,中文字库,很方便;
回复

使用道具 举报

13#
ID:414506 发表于 2018-10-24 11:49 | 只看该作者
学习学习啊~~~谢谢
回复

使用道具 举报

14#
ID:58583 发表于 2018-12-6 07:44 | 只看该作者
感谢楼主 收藏啦
回复

使用道具 举报

15#
ID:440725 发表于 2018-12-6 10:44 | 只看该作者
bucuo.
回复

使用道具 举报

16#
ID:21069 发表于 2018-12-6 11:21 | 只看该作者
yekai_yh 发表于 2018-8-25 14:39
下了,显示不了啊

从代码上看,应该字库的代码与数字的数组没放进去,版主将放入的位置与显示函数都做好了,你只要用字模软件取好字码放到一个数组里面,运行时将你定义好的数组放入显示函数中就OK了
回复

使用道具 举报

17#
ID:130157 发表于 2019-2-23 11:04 | 只看该作者
丑啊 发表于 2018-5-9 22:10
我的怎么不能用?

我也用不了
回复

使用道具 举报

18#
ID:130157 发表于 2019-2-23 11:07 | 只看该作者
jinsheng7533967 发表于 2018-12-6 11:21
从代码上看,应该字库的代码与数字的数组没放进去,版主将放入的位置与显示函数都做好了,你只要用字模软 ...

已经都有了
回复

使用道具 举报

19#
ID:437013 发表于 2019-5-27 22:19 | 只看该作者
正好需要   学习学习
回复

使用道具 举报

20#
ID:236699 发表于 2019-5-28 08:57 | 只看该作者
谢谢,找时间好好学习一下。
回复

使用道具 举报

21#
ID:521117 发表于 2019-10-5 21:34 | 只看该作者
最近在网上淘了块3.8寸的屏,查了下是ks0108。抄袭下,感谢。
回复

使用道具 举报

22#
ID:584814 发表于 2019-10-11 15:32 | 只看该作者
mobicity 发表于 2019-10-5 21:34
最近在网上淘了块3.8寸的屏,查了下是ks0108。抄袭下,感谢。

请问是否抄袭成功 ?
回复

使用道具 举报

23#
ID:519089 发表于 2019-10-19 10:23 | 只看该作者
仿真在哪里?
回复

使用道具 举报

24#
ID:198286 发表于 2019-10-19 17:14 | 只看该作者
新手先看代码学习
回复

使用道具 举报

25#
ID:47191 发表于 2019-12-14 21:40 | 只看该作者
新手过来学习下。谢谢分享!
回复

使用道具 举报

26#
ID:693135 发表于 2020-2-26 09:13 | 只看该作者
用不了
回复

使用道具 举报

27#
ID:108573 发表于 2020-2-26 10:12 | 只看该作者
工业上这种屏用的还挺多,学习一下
回复

使用道具 举报

28#
ID:299519 发表于 2020-2-26 11:20 | 只看该作者

下下来,自己画。
回复

使用道具 举报

29#
ID:709111 发表于 2020-3-22 14:49 | 只看该作者
dalao
学习了
回复

使用道具 举报

30#
ID:687830 发表于 2020-4-28 12:38 | 只看该作者
请问排阻接在db0-db7还是接在RSRWECS1CS2,,,,
回复

使用道具 举报

31#
ID:600695 发表于 2021-5-16 20:15 | 只看该作者
可以点亮显示,但是移动字的位置的时候,比如一个字刚好在左右屏中间的时候字会断开半个显示到行首,不知道怎么解决
回复

使用道具 举报

32#
ID:599561 发表于 2022-9-5 21:23 | 只看该作者
不错,谢谢分享,万分感谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表