找回密码
 立即注册

QQ登录

只需一步,快速开始

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

12864液晶的串行驱动程序 带反白显示,画图等

[复制链接]
跳转到指定楼层
楼主

12864液晶的串行驱动程序 带反白显示,画图等:
12864液晶的串行驱动程序.rar (24.09 KB, 下载次数: 77)

  1. /*******************************************************************
  2. *【文 件 名】:12864s.h                                            *
  3. *【建立日期】:7月1日                                        *
  4. *【修改日期】:7月10日                                       *
  5. *【文件作用】:液晶12864驱动程序,包括所有关于液晶得函数           *
  6. *【说    明】:RW=1,从液晶读数据到MCU;RW=0,写一个数据到液晶;   *
  7. *              (一般RW都设为0,即只向液晶写数据,不读数据)       *
  8. *              RS=1,写入的是数据;RS=0,写入的是指令;            *
  9. *              一般模式:RW=0,RS=1;写数据                         *
  10. *                        RW=0,RS=0;写指令                         *
  11. *------------------------------------------------------------------*
  12. *【作    者】:郭鑫(ben)                                           *
  13. *【版    权】:国家创新性实验项目,编号GCS07001                    *
  14. *******************************************************************/

  15. #ifndef _12864S_08_07_04_
  16. #define _12864S_08_07_04_


  17. /***************************头文件部分*****************************/


  18. #include <REG52.h>
  19. #include <intrins.h>

  20. //------------------------换名定义,方便使用----------------------
  21. #define uchar unsigned char
  22. #define uint unsigned int
  23. #define nop  _nop_()
  24. #define xtal 12

  25. //-------------------------管脚定义--------------------------------
  26. sbit CS = P2^0;                         //RS_LCD
  27. sbit SID = P2^1;                 //RW_LCD
  28. sbit SCLK = P2^2;                  //E_LCD        


  29. /***************************函数声明*******************************/

  30. void delay(uint ms);                           //延时子程序

  31. void lcd_1byte_w(uchar RW, uchar RS, uchar W_data);      //基本操作函数
  32. void lcd_8bits_w(uchar W_bits);

  33. void lcd_dat_w(uchar dat);                             //写数据
  34. void lcd_cmd_w(uchar cmd);                             //写命令
  35. void lcd_str_w(uchar *string);                         //写字符串

  36. void lcd_initial(void);                                //初始化
  37. void lcd_setposition(uchar x, uchar y);

  38. void lcd_black_pic(void);                                //绘图命令,用于反白显示
  39. void lcd_clear_pic(void);
  40. void lcd_row_off(uchar temp);
  41. void lcd_row_on(uchar temp);

  42. void logo(void);              //两个欢迎界面
  43. void logo2(void);



  44. //-----------------------------LCD12864读命令----------------------------
  45. uchar lcd_cmd_r(void)
  46. {
  47.     uchar i;
  48.     uchar temp;
  49.     CS = 0;
  50.     SID = 0;
  51.     SCLK = 0;
  52.     CS = 1;

  53.     //    11111 100
  54.     SID = 1;
  55.     for (i=0;i<5;i++){SCLK = 1;SCLK = 0;}
  56.     SID = 1;
  57.     SCLK = 1;SCLK = 0;
  58.     SID = 0;
  59.     SCLK = 1;SCLK = 0;
  60.     SID = 0;           
  61.     SCLK = 1;SCLK = 0;

  62.     temp = 0;
  63.     for (i=0;i<8;i++)
  64.     {
  65.         SCLK = 1;
  66.         temp <<=1;
  67.         temp |= SID;
  68.         SCLK = 0;
  69.     }
  70.     temp >>= 4;
  71.     for (i=0;i<4;i++)
  72.     {
  73.         SCLK = 1;
  74.         temp <<=1;
  75.         temp |= SID;
  76.         SCLK = 0;
  77.     }
  78.     for (i=0;i<4;i++)
  79.     {
  80.         SCLK = 1;SCLK = 0;
  81.     }

  82.     CS = 0;
  83.     SID = 0;
  84.     SCLK = 0;
  85.     return temp;
  86. }


  87. //-------------------LDC忙检测-------------------------------------
  88. void lcd_busy_check(void)
  89. {
  90.     uchar busy;
  91.     do{
  92.         busy = lcd_cmd_r();
  93.     }while(busy&0x80);
  94. }
















  95. /*******************************************************************
  96. *【函 数 名】:lcd_8bits_w                                         *
  97. *【修改日期】:2008年7月2日                                        *
  98. *【函数作用】:12864写入8位数据                                    *
  99. *------------------------------------------------------------------*
  100. *【备    注】:从高位开始传送                                      *
  101. *******************************************************************/
  102. void lcd_8bits_w(uchar W_bits)
  103. {
  104.         uchar i,Temp_data;

  105.     for(i=0; i<8; i++)
  106.         {
  107.                 Temp_data = W_bits;
  108.                 Temp_data <<= i;
  109.                 if((Temp_data&0x80)==0)         //bit7 is 0
  110.                 {
  111.                          SID = 0;
  112.                         nop;
  113.                         SCLK = 1;
  114.                         nop;
  115.                         nop;
  116.                         SCLK = 0;
  117.                         nop;
  118.                         SID = 0;
  119.                 }
  120.                 else                                                   //bit7 is 1
  121.                 {
  122.                          SID = 1;
  123.                         nop;
  124.                         SCLK = 1;
  125.                         nop;
  126.                         nop;
  127.                         SCLK = 0;
  128.                         nop;
  129.                         SID = 0;
  130.                 }        
  131.         }
  132. }

  133. /*******************************************************************
  134. *【函 数 名】:lcd_1byte_w                                         *
  135. *【修改日期】:2008年7月2日                                        *
  136. *【函数作用】:12864写入一字节,可以是命令或数据                   *
  137. *------------------------------------------------------------------*
  138. *【备    注】:RW RS控制数据OR命令                                 *
  139. *******************************************************************/
  140. void lcd_1byte_w(uchar RW, uchar RS, uchar W_data)
  141. {
  142.         uchar H_data,L_data,S_ID = 0xf8;         //11111RWRS0 ,控制格式命令

  143.     if(RW == 0)
  144.         {
  145.                  S_ID &=~ 0x04;
  146.         }
  147.         else                                        //if(RW==1)
  148.         {
  149.                  S_ID |= 0X04;
  150.         }
  151.         if(RS == 0)
  152.         {
  153.                  S_ID &=~ 0x02;
  154.         }
  155.         else                                        //if(RS==1)
  156.         {
  157.                  S_ID |= 0X02;
  158.         }
  159.         H_data = W_data;
  160.         H_data &= 0xf0;                        //屏蔽低4位的数据
  161.         L_data = W_data;                   //xxxx0000格式
  162.         L_data &= 0x0f;                        //屏蔽高4位的数据
  163.         L_data <<= 4;                        //xxxx0000格式
  164.         CS = 1;
  165.         lcd_8bits_w(S_ID);                 //发送S_ID
  166.         lcd_8bits_w(H_data);        //发送H_data
  167.         lcd_8bits_w(L_data);        //发送L_data
  168.         CS = 0;        
  169. }


  170. /*******************************************************************
  171. *【函 数 名】:lcd_str_w                                           *
  172. *【修改日期】:2008年7月2日                                        *
  173. *【函数作用】:12864写入字符串                                     *
  174. *------------------------------------------------------------------*
  175. *【备    注】:                                                    *
  176. *******************************************************************/
  177. void lcd_str_w(uchar *string)
  178. {
  179.     uchar i=0;
  180.     while(string[i]!='\0')
  181.         lcd_dat_w(string[i++]);      
  182. }

  183. /*******************************************************************
  184. *【函 数 名】:lcd_cmd_w                                           *
  185. *【修改日期】:2008年7月2日                                        *
  186. *【函数作用】:12864写入一条命令                                   *
  187. *------------------------------------------------------------------*
  188. *【备    注】:                                                    *
  189. *******************************************************************/
  190. void lcd_cmd_w(uchar cmd)
  191. {
  192.             lcd_busy_check();       //先检测LCD忙否,忙则等待

  193.     lcd_1byte_w(0,0,cmd);      
  194. }


  195. /*******************************************************************
  196. *【函 数 名】:lcd_dat_w                                           *
  197. *【修改日期】:2008年7月6日                                        *
  198. *【函数作用】:12864写入一个字节数据                               *
  199. *------------------------------------------------------------------*
  200. *【备    注】:                                                    *
  201. *******************************************************************/
  202. void lcd_dat_w(uchar dat)
  203. {
  204.             lcd_busy_check();       //先检测LCD忙否,忙则等待

  205.     lcd_1byte_w(0,1,dat);      
  206. }





  207. /*******************************************************************
  208. *【函 数 名】:lcd_initial                                         *
  209. *【修改日期】:2008年7月6日                                        *
  210. *【函数作用】:12864初始化                                         *
  211. *------------------------------------------------------------------*
  212. *【备    注】:                                                    *
  213. *******************************************************************/
  214. void lcd_initial(void)
  215. {
  216.         CS = 0;
  217.         SCLK = 0;
  218.         SID = 0;
  219.    
  220.    
  221.     lcd_cmd_w(0x30);         //功能设置 8位数据,基本指令
  222.         delay(2);
  223.         lcd_cmd_w(0x0c);        //显示状态 ON,游标OFF,反白OFF
  224.         delay(2);
  225.         lcd_cmd_w(0x01);        //清除显示
  226.         delay(2);
  227.     lcd_cmd_w(0x02);        //地址归位
  228.         delay(2);                        //延时                    
  229. }

  230. /*******************************************************************
  231. *【函 数 名】:lcd_setpostion                                      *
  232. *【修改日期】:2008年7月2日                                        *
  233. *【函数作用】:12864写入8位数据                                    *
  234. *------------------------------------------------------------------*
  235. *【备    注】:从高位开始传送                                      *
  236. *******************************************************************/
  237. void lcd_setposition(uchar row, uchar col)
  238. {
  239.     uchar p;
  240.     switch(row%5)
  241.     {
  242.         case 1: p = 0x80; break; //第一行开始地址
  243.         case 2: p = 0x90; break; //第二行
  244.         case 3: p = 0x88; break; //第三行
  245.         case 4: p = 0x98; break; //第四行
  246.     }               
  247.     p += col;
  248.     lcd_cmd_w(p);
  249. }

  250. /*******************************************************************
  251. *【函 数 名】:delay                                               *
  252. *【修改日期】:2008年7月2日                                        *
  253. *【函数作用】:延时x MS                                            *
  254. *------------------------------------------------------------------*
  255. *【备    注】:                                                    *
  256. *******************************************************************/
  257. void delay(uint ms)
  258. {
  259.     uint i;
  260.     while(ms--)   
  261.    {
  262.      for(i=1;i<1142;i++);
  263.    }   
  264. }



  265. /*******************************************************************
  266. *【函 数 名】:lcd_row_on                                          *
  267. *【修改日期】:2008年7月8日                                        *
  268. *【函数作用】:选择一行反白显示                                    *
  269. *------------------------------------------------------------------*
  270. *【备    注】:                                                    *
  271. *******************************************************************/
  272. void lcd_row_on(uchar temp)
  273. {
  274.         uchar i, j, x, y;
  275.     y = temp - 1;
  276.     if(y >= 2)
  277.     {
  278.         x = 8;
  279.         y = (y-2)*16;
  280.      }
  281.      else
  282.      {
  283.         x = 0;
  284.         y = y*16;
  285.       }

  286.         lcd_cmd_w(0x34);
  287.         lcd_cmd_w(0x36);
  288.         for(i=0; i<16; i++)
  289.         {   
  290.         
  291.         lcd_cmd_w(0x80+y);
  292.         lcd_cmd_w(0x80+x);
  293.         y++;

  294.                 for(j=0; j<16; j++)
  295.                 {
  296.                         lcd_dat_w(0xff);   
  297.          }
  298.         }
  299.     lcd_cmd_w(0x30);
  300.     delay(2);
  301. }

  302. /*******************************************************************
  303. *【函 数 名】:lcd_row_off                                         *
  304. *【修改日期】:2008年7月8日                                        *
  305. *【函数作用】:取消一行反白显示                                    *
  306. *------------------------------------------------------------------*
  307. *【备    注】:                                                    *
  308. *******************************************************************/
  309. void lcd_row_off(uchar temp)
  310. {
  311.         uchar i, j, x, y;
  312.     y = temp - 1;  
  313.     if(y >=2)
  314.     {
  315.         x = 8;
  316.         y = (y-2)*16;
  317.      }
  318.      else
  319.      {
  320.         x = 0;
  321.         y = y*16;
  322.       }

  323.         lcd_cmd_w(0x34);
  324.                 lcd_cmd_w(0x36);
  325.             
  326.         for(i=0; i<16; i++)
  327.             {   
  328.         lcd_cmd_w(0x80+y);
  329.         lcd_cmd_w(0x80+x);
  330.         y++;

  331.                 for(j=0; j<16; j++)
  332.                 {
  333.                         lcd_dat_w(0x00);   
  334.          }
  335.         }
  336.        lcd_cmd_w(0x30);
  337.     delay(2);
  338. }

  339. /*******************************************************************
  340. *【函 数 名】:lcd_clear_pic                                       *
  341. *【修改日期】:2008年7月8日                                        *
  342. *【函数作用】:清除绘图部分,即取消全部反白                        *
  343. *------------------------------------------------------------------*
  344. *【备    注】:                                                    *
  345. *******************************************************************/
  346. void lcd_clear_pic(void)
  347. {
  348.     uchar i, j;

  349.          lcd_cmd_w(0x34);
  350.     lcd_cmd_w(0x36);
  351.         for(i=0; i<32; i++)
  352.         {
  353.         lcd_cmd_w(0x80+i);
  354.         lcd_cmd_w(0x80);
  355.                 for(j=0; j<32; j++)
  356.                 {
  357.                         lcd_dat_w(0x00);   
  358.          }
  359.         }
  360.        lcd_cmd_w(0x30);
  361.     delay(2);
  362. }

  363. /*******************************************************************
  364. *【函 数 名】:lcd_black_pic                                       *
  365. *【修改日期】:2008年7月8日                                        *
  366. *【函数作用】:全屏黑色                                            *
  367. *------------------------------------------------------------------*
  368. *【备    注】:                                                    *
  369. *******************************************************************/
  370. void lcd_black_pic(void)
  371. {
  372.     uchar i, j;
  373.     lcd_cmd_w(0x34);
  374.     lcd_cmd_w(0x36);

  375.         for(i=0; i<32; i++)
  376.         {
  377.         lcd_cmd_w(0x80+i);
  378.         lcd_cmd_w(0x80);
  379.                 for(j=0; j<32; j++)
  380.                 {
  381.                         lcd_dat_w(0xff);   
  382.          }
  383.         }
  384.     lcd_cmd_w(0x30);
  385.     delay(2);
  386. }

  387. /*******************************************************************
  388. *【函 数 名】:lcd_block_on                                        *
  389. *【修改日期】:2008年7月10日                                       *
  390. *【函数作用】:反白2个汉字大小的面积                               *
  391. *------------------------------------------------------------------*
  392. *【备    注】:                                                    *
  393. *******************************************************************/
  394. void lcd_block_on(uchar temp)
  395. {
  396.         uchar i, j, x, y;
  397.     y = temp - 1;
  398.     if(y >= 2)
  399.     {
  400.         x = 8;
  401.         y = (y-2)*16;
  402.      }
  403.      else
  404.      {
  405.         x = 0;
  406.         y = y*16;
  407.       }
  408.                
  409.     lcd_cmd_w(0x34);
  410.     lcd_cmd_w(0x36);

  411.         for(i=0; i<16; i++)
  412.         {   
  413.         
  414.         lcd_cmd_w(0x80+y);
  415.         lcd_cmd_w(0x80+x);
  416.         y++;

  417.                 for(j=0; j<12; j++)
  418.                         lcd_dat_w(0x00);   

  419.         for(j=0; j<4;j++)
  420.             lcd_dat_w(0xff);
  421.         }
  422.     lcd_cmd_w(0x30);
  423.     delay(2);
  424. }
  425. /*******************************************************************
  426. *【函 数 名】:logo                                                *
  427. *【修改日期】:2008年7月2日                                        *
  428. *【函数作用】:系统开机画面                                        *
  429. *------------------------------------------------------------------*
  430. *【备    注】:                                                    *
  431. *******************************************************************/
  432. /*void logo()
  433. {
  434.    
  435.         CS = 0;
  436.         SCLK = 0;
  437.         SID = 0;
  438.         lcd_initial();

  439.         lcd_cmd_w(0x01);
  440.         lcd_setposition(2,0);
  441.     lcd_str_w("便携式叶绿素含量");
  442.         lcd_setposition(3,1);
  443.     lcd_str_w("光电检测仪V2");
  444.         delay(100);
  445.         
  446.         lcd_cmd_w(0x01);
  447.         lcd_setposition(1,1);
  448.         lcd_str_w("国家创新计划");
  449.         lcd_setposition(2,2);
  450.         lcd_str_w("GCS07001");
  451.         lcd_setposition(3,1);
  452.         lcd_str_w("北京林业大学");
  453.         lcd_setposition(4,0);
  454.         lcd_str_w("理学院基础楼305 ");
  455.         delay(100);               

  456. }

  457. /*******************************************************************
  458. *【函 数 名】:logo2                                               *
  459. *【修改日期】:2008年7月8日                                        *
  460. *【函数作用】:系统开机画面                                        *
  461. *------------------------------------------------------------------*
  462. *【备    注】:                                                    *
  463. *******************************************************************/
  464. void logo2()
  465. {
  466.         lcd_initial();
  467.         lcd_black_pic();          //完整刷屏
  468.         delay(10);         
  469.         
  470.         lcd_setposition(2,0);
  471.     lcd_str_w("便携式叶绿素含量");

  472.         lcd_row_off(2);


  473.         lcd_setposition(3,1);
  474.     lcd_str_w("光电检测仪V2");
  475.         lcd_row_off(3);
  476.         delay(100);


  477.         lcd_cmd_w(0x01);
  478.         lcd_row_on(2);
  479.         lcd_row_on(3);
  480.         lcd_setposition(1,1);
  481.         lcd_str_w("国家创新计划");
  482.         lcd_setposition(2,2);
  483.         lcd_str_w("GCS07001");
  484.         lcd_setposition(3,1);
  485.         lcd_str_w("北京林业大学");
  486.         lcd_setposition(4,0);
  487.         lcd_str_w("理学院基础楼305 ");
  488.         delay(100);               
  489.         lcd_clear_pic();

  490. }



  491. #endif
复制代码


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

使用道具 举报

沙发
ID:99250 发表于 2016-12-9 21:31 | 只看该作者
感谢分享
回复

使用道具 举报

板凳
ID:59151 发表于 2017-9-22 15:13 | 只看该作者
首先要感谢楼主分享,程序测试通过了,但反白的过程就象开幕式慢慢地卷动,做菜单效果不爽呀,求解决方法,感谢!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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