[文档下载] LCD12864 液晶显示器 模块化程序

[复制链接]
1247|8
 楼主| 仙女山 发表于 2015-8-17 15:50 | 显示全部楼层 |阅读模式


  1. /**********************
  2. lcd12864.h 头文件
  3. **********************/
  4. #ifndef _LCD12864_H_
  5. #define _LCD12864_H_
  6. extern void lcd12864_busy(); //忙标志函数
  7. extern void led12864_clear();//清屏
  8. extern void lcd12864_init(); //初始化函数
  9. extern void lcd12864_pxy(unsigned char p,unsigned char x,unsigned char y);//数据的显示位置,p=0左半屏,p=1右半屏,p=2两半屏全选,xy为显示的坐标,第四象限,用正值表示。
  10. extern void lcd12864_zifu(unsigned char p,unsigned char x,unsigned char,unsigned char m); //第m个字符的显示位置,与汉字的定义一样,只是xy的坐标的值应小于等于7.
  11. extern void lcd12864_hanzi(unsigned char p,unsigned char x,unsigned char y,unsigned char m); //第m个汉字的显示位置,p=0左半屏,p=1右半屏,p=2两半屏全选,xy为显示的坐标,第四象限,用正值表示,x或y的值都应小于等于3。m为显示的第m个汉字。
  12. #endif




  13. /**********************
  14. lcd12864.c 文件
  15. **********************/

  16. #include<reg51.h>
  17. #define uint unsigned int
  18. #define uchar unsigned char
  19. sbit cs2=P2^0;
  20. sbit cs1=P2^1;
  21. sbit e=P2^2;
  22. sbit rw=P2^3;
  23. sbit rs=P2^4;
  24. uchar code zifu[]=
  25. {
  26. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//,0
  27. 0x00,0x00,0x58,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  

  28. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//。1
  29. 0x00,0x18,0x24,0x24,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

  30. 0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//!2
  31. 0x00,0x00,0x00,0x5F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
  32. };
  33. uchar code ziku[]=
  34. {
  35.   //0x80,0x40,0xF0,0x2C,0x43,0x20,0x98,0x0F,0x0A,0xE8,0x08,0x88,0x28,0x1C,0x08,0x00,//"你",
  36. //0x00,0x00,0x7F,0x00,0x10,0x0C,0x03,0x21,0x40,0x3F,0x00,0x00,0x03,0x1C,0x08,0x00,

  37. 0x80,0x84,0x44,0x44,0x24,0x14,0x04,0xFF,0x04,0x14,0x24,0x24,0x46,0xC4,0x40,0x00,//"李",0 汉字后面的数字表示汉字的代号,方便使用
  38.     0x00,0x08,0x08,0x08,0x09,0x49,0x89,0x7D,0x0D,0x0B,0x09,0x08,0x0C,0x08,0x00,0x00,

  39. 0x10,0x10,0x10,0xFF,0x90,0x50,0xFE,0x92,0x92,0x92,0x92,0x92,0x9A,0xD3,0x82,0x00,//"振",1
  40.     0x02,0x42,0x81,0x7F,0x40,0x30,0x0F,0x00,0xFF,0x40,0x07,0x18,0x28,0x64,0x22,0x00,

  41.   0x80,0x40,0x20,0xF8,0x07,0x48,0x48,0x48,0x48,0xFF,0x48,0x48,0x68,0x4C,0x08,0x00,//"伟",2
  42.     0x00,0x00,0x00,0xFF,0x02,0x02,0x02,0x02,0x02,0xFF,0x02,0x12,0x22,0x1F,0x02,0x00,

  43. 0x00,0x00,0x00,0xC0,0x70,0x20,0x00,0xFF,0x00,0x10,0x20,0xC0,0x80,0x00,0x00,0x00,//小3
  44. 0x04,0x02,0x01,0x00,0x00,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,0x01,0x07,0x02,0x00,

  45. 0x00,0x04,0x84,0x44,0x3C,0x44,0x85,0x06,0x04,0xC4,0x3C,0x44,0x84,0x04,0x00,0x00,//卒4
  46. 0x04,0x05,0x04,0x04,0x04,0x04,0x05,0xFE,0x05,0x04,0x04,0x04,0x05,0x04,0x04,0x00,

  47. 0x40,0x41,0xCE,0x04,0x00,0x80,0x40,0xBE,0x82,0x82,0x82,0xBE,0xC0,0x40,0x40,0x00,//设5
  48. 0x00,0x00,0x7F,0x20,0x90,0x80,0x40,0x43,0x2C,0x10,0x10,0x2C,0x43,0xC0,0x40,0x00,

  49. 0x20,0x21,0x2E,0xE4,0x00,0x00,0x20,0x20,0x20,0x20,0xFF,0x20,0x20,0x20,0x20,0x00,//计6
  50. 0x00,0x00,0x00,0x7F,0x20,0x10,0x08,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,

  51. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//,7
  52. 0x00,0x00,0x58,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  

  53. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//。8
  54. 0x00,0x18,0x24,0x24,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

  55. 0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//!9
  56. 0x00,0x00,0x00,0x5F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00

  57. };

  58. /*void delay(uchar i)   //1ms延时函数
  59. {
  60.     uchar a,b;
  61.     for(b=i;b>0;b--)
  62.         for(a=110;a>0;a--);
  63. }*/
  64. void lcd12864_busy()    //忙标志位函数
  65. {
  66. uchar i;
  67. rw=1;
  68. rs=0;
  69. while(1)
  70. {
  71.   P0=0xff;
  72.   e=1;
  73.   //i=P0;
  74.   e=0;
  75.   i=P0;
  76.   i=i&0x80;
  77.   if(i!=0x80)
  78.   break;
  79. }
  80. }
  81. lcd12864_writedat(uchar dat) //写数据函数
  82. {
  83. //lcd12864_busy();
  84. rw=0;
  85. rs=1;
  86. e=1;
  87. P0=dat;
  88. e=0;
  89. }
  90. lcd12864_writecom(uchar com)  //写命令函数
  91. {
  92. //lcd12864_busy();
  93. rw=0;
  94. rs=0;
  95. e=1;
  96. P0=com;
  97. e=0;
  98. }
  99. void lcd12864_init()   //初始化函数
  100. {
  101.   lcd12864_writecom(0x3f);//开显示 关显示为0x3e
  102.   lcd12864_writecom(0xb8);//设置页地址为0.第一页。
  103.   lcd12864_writecom(0xc0);//设置显示起始行地址,为第一行显示到液晶屏上
  104.   lcd12864_writecom(0x40);//设置列地址
  105. }
  106. lcd12864_pxy(uchar p,uchar x,uchar y) //数据的位置,p=0左半屏,p=1右半屏,p=2两半屏全选,xy为显示的坐标,第四象限,用正值表示。
  107. {
  108.   switch(p)
  109. {
  110.   case 0:cs1=0;cs2=1;break;
  111.   case 1:cs1=1;cs2=0;break;
  112.   case 2:cs1=0;cs2=0;break;
  113. }
  114.   lcd12864_writecom(0xb8+y);
  115.   lcd12864_writecom(0x40+x);
  116. }
  117. lcd12864_zifu(uchar p,uchar x,uchar y,uchar m) //第m个字符的显示位置,与测字的定义一样,只是xy的坐标的值应小于等于7.
  118. {
  119. uchar i;
  120. lcd12864_pxy(p,x*8,y);
  121. for(i=0;i<8;i++)
  122. {
  123.   lcd12864_writedat(zifu[i+m*8]);
  124. }
  125. }
  126. lcd12864_hanzi(uchar p,uchar x,uchar y,uchar m) //第m个汉字的显示位置,p=0左半屏,p=1右半屏,p=2两半屏全选,xy为显示的坐标,第四象限,用正值表示,x或y的值都应小于等于3。m为显示的第m个汉字。
  127. {
  128. uchar i;
  129. lcd12864_pxy(p,x*16,2*y);
  130. for(i=0;i<16;i++)
  131. lcd12864_writedat(ziku[i+m*32]);
  132. lcd12864_pxy(p,x*16,2*y+1);
  133. for(i=0;i<16;i++)
  134. lcd12864_writedat(ziku[i+m*32+16]);
  135. }
  136. void lcd12864_clear()      //清屏函数
  137. {            
  138. uint i;
  139. lcd12864_pxy(2,0,0);      //清左右两屏的第一、二、三、四页
  140. for(i=0;i<256;i++)
  141. {
  142.   lcd12864_writedat(0x00);
  143. }         
  144. lcd12864_pxy(2,0,4);      //清左右两屏的第五、六、七、八页
  145. for(i=0;i<256;i++)
  146. {
  147.   lcd12864_writedat(0x00);
  148. }
  149. }




  150. /******************************************
  151. main.c 主文件
  152. ******************************************/

  153. #include<reg51.h>
  154. #include"lcd12864.h"
  155. void main()
  156. {
  157. lcd12864_init();
  158. lcd12864_clear();
  159. lcd12864_hanzi(0,0,0,0);//李
  160. lcd12864_hanzi(0,1,0,1);//振
  161. lcd12864_hanzi(0,2,0,2);//伟
  162. lcd12864_hanzi(0,3,0,8);// 。
  163. lcd12864_hanzi(0,0,2,3);//小
  164. lcd12864_hanzi(0,1,2,4);//卒
  165. lcd12864_hanzi(0,2,2,5);//设
  166. lcd12864_hanzi(0,3,2,6);//计
  167. lcd12864_hanzi(1,0,2,9);//!
  168. lcd12864_zifu(1,6,6,8); //!的左上部 分开以字符的形式显示
  169. lcd12864_zifu(1,7,6,9); //!的右上部
  170. lcd12864_zifu(1,6,7,10);//!的左下部
  171. lcd12864_zifu(1,7,7,11);//!的右下部
  172. while(1);
  173. }


史迪威将军 发表于 2015-8-17 21:52 | 显示全部楼层
电路图和程序都有了,收下了
yiyigirl2014 发表于 2015-8-18 07:59 | 显示全部楼层
谁知道字库文件如何使用的?
稳稳の幸福 发表于 2015-8-18 08:15 | 显示全部楼层
如果把字库做到一个文件,或者一个存储芯片,然后用的时候按照字符编码取字就返回那个点阵,就爽歪歪了。
大苏牙 发表于 2015-8-18 09:23 | 显示全部楼层
12864LCD用的比较多,也开发过产品
643757107 发表于 2015-8-18 17:10 | 显示全部楼层
字库文件使用的话,应该最好。
IversonCar 发表于 2015-8-18 20:35 | 显示全部楼层
12864的液晶现在用的不多了,写界面太麻烦了
稳稳の幸福 发表于 2015-8-19 16:05 | 显示全部楼层
为何这么多显示屏都是用并口传数据呢?这样有什么优点?
mintspring 发表于 2015-8-21 11:44 | 显示全部楼层
怎么发的是51的程序啊,我以为是新唐的呢。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

36

主题

340

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部