找回密码
 立即注册

QQ登录

只需一步,快速开始

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

LCD12864.h头文件下载 不带字库12864液晶显示及proteus仿真源程序

[复制链接]
跳转到指定楼层
楼主
51单片机驱动的不带字库的lcd12864液晶屏显示及其proteus仿真图如下:


单片机驱动12864液晶的头文件LCD12864.H源程序如下(附件里面有调用方法 很简单):
  1. //===========LCD12864.H===============
  2. #ifndef _LCD12864_H__
  3. #define _LCD12864_H__

  4. /*********************************************************************************************/
  5. #include <reg52.h> // 包含头文件
  6. #include <string.h> //用于指针
  7. typedef         unsigned char uchar ;
  8. typedef  unsigned int  uint ;
  9. /*********************************************************************************************
  10. //接口定义
  11. //
  12. /*********************************************************************************************/
  13. #define LCD12864_DATABUS P1                                         // 定义LCD12864的数据总线
  14. sbit LCD12864_RS = P2^6;                                                 // 定义LCD12864的RS控制线
  15. sbit LCD12864_RW = P2^7;                                                 // 定义LCD12864的RW控制线
  16. sbit LCD12864_E  = P3^0;                                                 // 定义LCD12864的E控制线
  17. sbit LCD12864_CS1 = P3^1;                                         // 定义LCD12864的CS1控制线
  18. sbit LCD12864_CS2 = P3^2;                                         // 定义LCD12864的CS2控制线
  19. //sbit LCD12864_RESET = P2 ^ 5;                                         // 定义LCD12864的RESET控制线
  20. //sbit LCD12864_LEDK = P2 ^ 0;                                         // 定义LCD12864的LEDK(BLK)控制线
  21. /*********************************************************************************************
  22. //数据定义
  23. //定义LCD12864的命令字
  24. /*********************************************************************************************/
  25. #define LCD12864_DISP_ON          0x3F // 打开LCD12864显示
  26. #define LCD12864_DISP_OFF         0x3E // 关闭LCD12864显示
  27. #define LCD12864_START_ROW         0xC0 // 显示起始行,可以用LCD12864_START_ROW+x设置起始行。(x<64)
  28. #define LCD12864_PAGE_ADDR         0xB8 // 页起始地址,可以用LCD12864_PAGE_ADDR+x设置当前页。(x<8)
  29. #define LCD12864_COL_ADDR          0x40 // 列起始地址,可以用LCD12864_COL_ADDR+x设置当前列。(x<64)
  30. //在BUSY和REST状态时,除读状态指令外,其他指令均不对LCD12864产生作用。
  31. //在对LCD12864操作之前要查询BUSY状态,以确定是否可以对LCD12864进行操作。
  32. #define LCD12864_STATUS_BUSY 0x80                 // LCD12864忙状态屏蔽码
  33. #define LCD12864_STATUS_DISP_OFF 0x20   // LCD12864显示关闭状态屏蔽码
  34. #define LCD12864_STATUS_REST 0x10                 // LCD12864复位状态屏蔽码

  35. void LCD12864_WriteCMD(uchar LCD_com);
  36. void LCD12864_WriteData(unsigned char LCD12864_data);
  37. void Delay(unsigned int count);




  38. /*********************************************************************************************
  39. //字符/图像定义库
  40. /*********************************************************************************************/
  41. /*-- 文字: 欢 --*/
  42. /*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
  43. //0x55,0xaa,0x55,0xaa,0x55,0xaa,0x55,0xaa,0x55,0x55,0xaa,0xaa,0x55,0x55,0xaa,0xaa,
  44. //0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0xaa,0x55,0xaa,0x55,0xaa,0x55,0xaa,
  45. //0x00,0x00,0x00,0x00,0x11,0x11,0x11,0x1F,0x22,0x22,0x22,0x00,0x00,0x00,0x00,0x00,
  46. //0x00,0x08,0x08,0x08,0x08,0x08,0x08,0xF0,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00,
  47. /* 纵向取模,字节倒序 */
  48. unsigned char code zheng[]={
  49. 0x00,0x80,0xA0,0xA4,0xA8,0xF0,0x54,0x52,0x00,0xF0,0x08,0x68,0x98,0x08,0x00,0x00,
  50. 0x00,0x00,0x10,0x08,0x06,0x01,0x02,0x04,0x00,0x7F,0x00,0x02,0x04,0x07,0x00,0x00,
  51. };
  52. unsigned char code zhou[]={
  53. 0x00,0x00,0xE0,0x00,0xFC,0x00,0xE0,0x00,0xFC,0x20,0xC0,0x00,0xFE,0x00,0x00,0x00,
  54. 0x00,0x21,0x10,0x0C,0x03,0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,
  55. };
  56. unsigned char code jin[]={
  57. 0x00,0x80,0x40,0x20,0x90,0x8C,0xC3,0x44,0x48,0x10,0x20,0x60,0x40,0x40,0x40,0x00,
  58. 0x01,0x00,0x20,0x24,0x2A,0x22,0x3F,0x11,0x19,0x15,0x10,0x10,0x00,0x00,0x00,0x00,
  59. };
  60. unsigned char code te[]={
  61. 0x80,0x60,0x58,0x20,0xFE,0xA0,0x40,0x50,0x50,0x7F,0xE8,0xA8,0xA0,0xA0,0x20,0x00,
  62. 0x04,0x04,0x02,0x01,0x3F,0x00,0x01,0x05,0x09,0x21,0x7F,0x00,0x00,0x00,0x00,0x00,
  63. };
  64. unsigned char code lai[]={
  65. 0x00,0x08,0x08,0x48,0xAE,0x24,0xF4,0x14,0x9C,0x57,0x04,0x04,0x04,0x00,0x00,0x00,
  66. 0x00,0x20,0x22,0x12,0x0A,0x05,0x7F,0x03,0x05,0x09,0x19,0x11,0x10,0x10,0x00,0x00,
  67. };
  68. unsigned char code dian[]={
  69. 0x00,0x00,0xF0,0x10,0x90,0x90,0xFF,0x48,0x08,0x08,0xF8,0x00,0x00,0x00,0x00,0x00,
  70. 0x00,0x00,0x00,0x03,0x02,0x02,0x1F,0x21,0x21,0x21,0x20,0x20,0x20,0x1C,0x00,0x00,
  71. };
  72. unsigned char code zi[]={
  73. 0x00,0x40,0x40,0x40,0x44,0x44,0x44,0x72,0xCA,0x26,0x22,0x20,0x20,0x20,0x00,0x00,
  74. 0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x20,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  75. };
  76. unsigned char code you[]={
  77. 0x00,0x08,0x08,0x88,0x48,0xF8,0x4C,0x4B,0x28,0x24,0xE4,0x04,0x04,0x04,0x00,0x00,
  78. 0x04,0x02,0x01,0x00,0x00,0x7F,0x05,0x05,0x25,0x40,0x3F,0x00,0x00,0x00,0x00,0x00,
  79. };
  80. unsigned char code xian[]={
  81. 0x00,0xF8,0x04,0xB4,0xCC,0x00,0xFC,0xD4,0x54,0x42,0x3E,0x80,0x00,0x00,0x00,0x00,
  82. 0x00,0x3F,0x00,0x00,0x00,0x00,0x3F,0x10,0x09,0x02,0x05,0x0C,0x08,0x08,0x08,0x00,
  83. };
  84. unsigned char code gong[]={
  85. 0x00,0x00,0x80,0x60,0x18,0x00,0x82,0x02,0x0C,0x10,0x20,0x40,0xC0,0x80,0x80,0x00,
  86. 0x02,0x01,0x00,0x18,0x14,0x12,0x11,0x08,0x0A,0x0C,0x18,0x00,0x00,0x00,0x00,0x00,
  87. };
  88. unsigned char code si[]={
  89. 0x00,0x00,0x80,0xA0,0xA4,0x94,0x54,0xD2,0x02,0x02,0x02,0xFE,0x00,0x00,0x00,0x00,
  90. 0x00,0x00,0x03,0x04,0x04,0x04,0x02,0x03,0x00,0x10,0x20,0x1F,0x00,0x00,0x00,0x00,
  91. };
  92. /********************************************************************************************
  93. //软件延时 Delay()
  94. *********************************************************************************************/
  95. void Delay(unsigned int count)
  96. {
  97.         unsigned char i;
  98.         while(--count != 0)
  99.            {
  100.                   for(i = 0; i < 125; i++); // ";" 表示空语句,CPU空转。
  101.            } // i 从0加到125,在12M晶体下CPU大概耗时1毫秒
  102. }
  103. /*********************************************************************************************
  104. //LCD12864测忙函数 LCD12864_TestBusy()
  105. **********************************************************************************************/
  106. //void LCD12864_TestBusy(void)
  107. //{
  108. //        LCD12864_RW = 1;
  109. //        LCD12864_RS = 0;
  110. //        LCD12864_E  = 0;                        //???????????????
  111. //        //Delay(1);
  112. //        LCD12864_E  = 1;
  113. //        while(LCD12864_DATABUS & LCD12864_STATUS_BUSY);
  114. //}
  115. /*********************************************************************************************
  116. //写指令到LCD12864 LCD12864_WriteCMD()
  117. **********************************************************************************************/
  118. void LCD12864_WriteCMD(uchar LCD_com)
  119. {
  120.         //LCD12864_TestBusy();
  121.         LCD12864_RW = 0;
  122.         LCD12864_RS = 0;
  123.         LCD12864_DATABUS = LCD_com;
  124.         LCD12864_E = 0;                          
  125.         LCD12864_E = 1;
  126.         //Delay(1);
  127.         LCD12864_E = 0;
  128.         //LCD12864_TestBusy();
  129. }
  130. /*********************************************************************************************
  131. //写数据到LCD12864 LCD12864_WriteData()
  132. **********************************************************************************************/
  133. void LCD12864_WriteData(unsigned char LCD12864_data)
  134. {
  135.         LCD12864_RW = 0;
  136.         LCD12864_RS = 1;
  137.         LCD12864_DATABUS = LCD12864_data;
  138.         LCD12864_E = 0;                                   
  139.         LCD12864_E = 1;
  140.         //Delay(1);
  141.         LCD12864_E = 0;
  142.         //LCD12864_TestBusy();
  143. }
  144. /********************************************************************************************
  145. //从LCD12864读数据 LCD12864_ReadData()
  146. *********************************************************************************************/
  147. //unsigned char LCD12864_ReadData(void)
  148. //{
  149. //        unsigned char LCD12864_data;
  150. //        LCD12864_E = 0;
  151. //        LCD12864_RW = 1; LCD12864_RS = 1;
  152. //        LCD12864_E = 1;
  153. //        LCD12864_data = LCD12864_DATABUS; //送入8位数据
  154. //        LCD12864_TestBusy(); //读LCM忙
  155. //        return LCD12864_data;
  156. //}
  157. /********************************************************************************************
  158. //向LCD12864指定点写一字节数据 LCD12864_Write1Byte_X_Y()
  159. //x(0-127) y(0-63)为坐标值 LCD12864_data 为所要写的数据
  160. /********************************************************************************************/
  161. //void LCD12864_Write1Byte_X_Y( uchar x,uchar y,uchar LCD12864_data)
  162. //{
  163. //        x = x&0x7f;
  164. //        y = y&0x3f; //参数过滤
  165. //        LCD12864_CS1 = 1;
  166. //        LCD12864_CS2 = 1; //不选中左半屏及右半屏
  167. //        if(x<64)
  168. //          {         
  169. //           LCD12864_CS1 = 0; // 选中左半屏
  170. //          }
  171. //        else
  172. //          {
  173. //                LCD12864_CS2 = 0; // 选中右半屏
  174. //                x = x-64;
  175. //           }
  176. //        LCD12864_WriteCMD(LCD12864_COL_ADDR+x); // 设置当前列地址,即x坐标
  177. //        LCD12864_WriteCMD(LCD12864_PAGE_ADDR+y); // 设置当前页地址,即y坐标
  178. //        LCD12864_WriteData(LCD12864_data);       // 向LCD12864写数据
  179. //}
  180. /********************************************************************************************
  181. //从LCD12864指定点读取一字数据 LCD12864_Read1Byte_X_Y()
  182. /********************************************************************************************/
  183. //unsigned char LCD12864_Read1Byte_X_Y( uchar x,uchar y)
  184. //{
  185. //        uchar LCD12864_data;
  186. //        x = x&0x7f;
  187. //        y = y&0x3f; //参数过滤
  188. //        LCD12864_CS1 = 1; LCD12864_CS2 = 1; //不选中左半屏及右半屏
  189. //        if(x<64)
  190. //          { // 判断选择左、右半屏
  191. //                LCD12864_CS1 = 0; // 选中左半屏
  192. //          }
  193. //        else
  194. //          {
  195. //                LCD12864_CS2 = 0; // 选中右半屏
  196. //                x = x-64;
  197. //          }
  198. //        LCD12864_WriteCMD(LCD12864_COL_ADDR+x); // 设置当前列地址,即x坐标
  199. //        LCD12864_WriteCMD(LCD12864_PAGE_ADDR+y); // 设置当前页地址,即y坐标
  200. //        LCD12864_data = LCD12864_ReadData(); // 向LCD12864写数据
  201. //        return LCD12864_data;
  202. //}
  203. /********************************************************************************************
  204. //向LCD12864填充数据 LCD12864_Fill_Screen()
  205. //设置涮屏速度(为1不涮屏,默认为60)        //欲写入的数据
  206. *********************************************************************************************/
  207. void LCD12864_Fill_Screen( uchar refresh_rate,uchar LCD_Data)         
  208. {
  209. unsigned char x,y;
  210. LCD12864_CS1 = 0;                                                                       // 选中左半屏
  211. LCD12864_CS2 = 0;                                                                        // 选中右半屏
  212. LCD12864_WriteCMD(LCD12864_START_ROW+0);                       // 显示起始行设置为0
  213. for(x=0;x<8;x++)
  214.   {
  215.         Delay(refresh_rate);                                                       // 刷屏速度延时
  216.         LCD12864_WriteCMD(LCD12864_PAGE_ADDR+x); // 设置页地址
  217.         LCD12864_WriteCMD(LCD12864_COL_ADDR);    // 设置列地址
  218.         for(y=0;y<128;y++)                                                   //64
  219.           {LCD12864_WriteData( LCD_Data );}
  220.    }
  221. LCD12864_CS1 = 1;                                                                    // 不选中左半屏
  222. LCD12864_CS2 = 1;                                                                    // 不选中右半屏
  223. }
  224. /********************************************************************************************
  225. //LCD12864清屏 LCD12864_Clear_Screen()
  226. *********************************************************************************************/
  227. void LCD12864_Clear_Screen(void)
  228. {
  229.         LCD12864_Fill_Screen(20,0x00);                                    //写入0到每个显示区
  230. }
  231. /********************************************************************************************
  232. //LCD12864黑屏 LCD12864_Clear_black()
  233. *********************************************************************************************/
  234. //void LCD12864_Clear_black(void)
  235. //{
  236. //        LCD12864_Fill_Screen(60,0xff);                                    //可写入其它数值以填满LCD屏
  237. //}
  238. /********************************************************************************************
  239. //显示128*64图片 LCD12864_Disp_Bitmap_12864()
  240. *********************************************************************************************/
  241. //void LCD12864_Disp_Bitmap_12864( uchar t,uchar code *bitmap_12864)
  242. //{ //128*64点阵图像所在数组表
  243. //unsigned char j,k;                                          
  244. //for(k=0;k<8;k++)
  245. //  { //设置8页的显示
  246. //        Delay(t);
  247. //        LCD12864_CS1 = 0;
  248. //        LCD12864_CS2 = 1; //半屏选中
  249. //        LCD12864_WriteCMD(LCD12864_PAGE_ADDR+k); //选中页
  250. //        LCD12864_WriteCMD(LCD12864_COL_ADDR+0); //选中列
  251. //        for(j=0;j<64;j++)                         //64
  252. //          {
  253. //                LCD12864_WriteData(bitmap_12864[k*128+j]); //开始写入数据
  254. //      }
  255. //        LCD12864_CS1 = 0;
  256. //        LCD12864_CS2 = 0;
  257. //        LCD12864_WriteCMD(LCD12864_PAGE_ADDR+k);
  258. //        LCD12864_WriteCMD(LCD12864_COL_ADDR+0);
  259. //        for(j=64;j<128;j++)
  260. //           {
  261. //                LCD12864_WriteData(bitmap_12864[k*128+j]);
  262. //       }
  263. //    }
  264. //}
  265. /********************************************************************************************
  266. //在LCD12864的指定点显示16*16点阵汉字 LCD12864_Disp_Chinese_16_16()
  267. //设置书写速度(为1直接显示,默认为12)//输入8:8*16字符,16:16*16字符
  268. //LCD12864的页地址(0~7)//LCD12864的列地址(0~128)注意:右半屏起始是64  huan
  269. *********************************************************************************************/
  270. void LCD12864_Disp16(uchar b,uchar LCD12864_page,uchar LCD12864_col,uchar code *Chardata)  
  271. { //16*16点阵汉字字模(纵向取模,字节倒序)
  272.         unsigned char j=0,i=0;
  273.         if(LCD12864_col < 64 )
  274.           {
  275.                 LCD12864_CS1 = 0;
  276.                 LCD12864_CS2 = 1; //判断屏幕使能
  277.            }
  278.         else
  279.            {
  280.                 LCD12864_CS1 = 1;
  281.                 LCD12864_CS2 = 0;
  282.                 LCD12864_col = LCD12864_col - 64;
  283.            }
  284.         for(j=0;j<2;j++)
  285.           {
  286.                 LCD12864_WriteCMD(LCD12864_PAGE_ADDR+LCD12864_page+j);
  287.                 LCD12864_WriteCMD(LCD12864_COL_ADDR+LCD12864_col);
  288.                 for(i=0;i<b;i++)
  289.                   {
  290.                         LCD12864_WriteData(Chardata[b*j+i]);
  291.                         Delay(10);
  292.                    }
  293.            }
  294. }

  295. /********************************************************************************************
  296. //LCD12864初始化 LCD12864_Init()
  297. //
  298. *********************************************************************************************/
  299. void LCD12864_Init(void)
  300. {
  301.         //LCD12864_RESET = 0; //复位
  302.         //Delay(300);
  303. ……………………

  304. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码


所有资料51hei提供下载:
LCD12864源码及proteus仿真.rar (88.01 KB, 下载次数: 134)


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

使用道具 举报

沙发
ID:329346 发表于 2018-5-18 19:39 | 只看该作者
请问一下调用方法在哪呢 楼主
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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