找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于51单片机的ST7920芯片lcd12864液晶显示程序

[复制链接]
跳转到指定楼层
楼主
有助新人学习12864液晶的资料

ST7920驱动程序:
  1. /*********************************************************************************
  2. * 【编写时间】: 2017年3月19日
  3. * 【作    者】: 清翔电子:03
  4. * 【版    本】: 1.0
  5. * 【实验平台】: QX-MCS51 单片机开发板
  6. * 【外部晶振】: 11.0592mhz       
  7. * 【主控芯片】: STC89C52RC
  8. * 【编译环境】: Keil μVisio4       
  9. * 【程序功能】: 12864液晶显示测试                                                                                           
  10. * 【使用说明】: 使用液晶前拔下数码管J6跳帽
  11. 12864屏幕向板子外插,插在L1排母上
  12. **********************************************************************************/

  13. #include <reg52.h>
  14. #include <string.h>

  15. #define uchar unsigned char
  16. #define uint  unsigned int

  17. uchar code IC_DAT[];
  18. uchar code pic1[];
  19. uchar code pic2[];
  20. uchar code pic3[];

  21. sbit RS  = P0^7;
  22. sbit WRD = P0^6;
  23. sbit E   = P0^5;
  24. sbit PSB = P0^4;
  25. sbit RES = P0^3;

  26. void TransferData(char data1,bit DI);
  27. void display(void);
  28. void display_grapic(void);
  29. void delayms(uint n);
  30. void DisplayLine(uchar line1,uchar line2);
  31. void DisplayGraphic(uchar code *adder);
  32. void delay(uint m);
  33. void lcd_mesg(uchar code *adder1);

  34. uchar code IC_DAT[]={
  35. "    智能小车    "  
  36. "    俱乐部      "
  37. "    QQ 群号:     "
  38. "   12933307    "
  39. };

  40. uchar code IC_DAT2[]={
  41. "  床前明月光,  "                        //0x80
  42. "  疑是地上霜,  "                        //0x90
  43. "  举头望明月。  "                        //0x88
  44. "  低头思故乡。  "                        //0x98
  45. };

  46. /********************************************************************
  47. * 名称 : Convert(uchar In_Date)
  48. * 功能 : 因为电路设计时,P0.0--P0.7接法刚好了资料中的相反,所以设计该函数。
  49. * 输入 : 1602资料上的值
  50. * 输出 : 送到1602的值
  51. ***********************************************************************/
  52. unsigned char Convert(unsigned char In_Date)
  53. {
  54.     unsigned char i, Out_Date = 0, temp = 0;
  55.     for(i=0; i<8; i++)
  56.     {
  57.         //temp = (In_Date >> i) & 0x01;
  58.         //Out_Date |= (temp << (7 - i));
  59.                 Out_Date=  In_Date;

  60.     }
  61.     return Out_Date;
  62. }

  63. void initinal(void)           //LCD字库初始化程序
  64. {
  65.            delay(40);             //大于40MS的延时程序
  66.            PSB=1;                 //设置为8BIT并口工作模式
  67.            delay(1);              //延时
  68.            RES=0;                 //复位
  69.            delay(1);              //延时
  70.            RES=1;                 //复位置高
  71.            delay(10);
  72.            TransferData(0x30,0);  //Extended Function Set :8BIT设置,RE=0: basic instruction set, G=0 :graphic display OFF
  73.            delay(100);            //大于100uS的延时程序
  74.            TransferData(0x30,0);  //Function Set
  75.            delay(37);             ////大于37uS的延时程序
  76.            TransferData(0x08,0);  //Display on Control
  77.            delay(100);            //大于100uS的延时程序
  78.            TransferData(0x10,0);  //Cursor Display Control光标设置
  79.            delay(100);            //大于100uS的延时程序
  80.            TransferData(0x0C,0);  //Display Control,D=1,显示开
  81.            delay(100);            //大于100uS的延时程序
  82.            TransferData(0x01,0);  //Display Clear
  83.            delay(10);             //大于10mS的延时程序
  84.            TransferData(0x06,0);  //Enry Mode Set,光标从右向左加1位移动
  85.            delay(100);            //大于100uS的延时程序
  86.           }

  87. /********************************************************************
  88. * 名称 : Main()
  89. * 功能 : 主函数
  90. * 输入 : 无
  91. * 输出 : 无
  92. ***********************************************************************/
  93. void     initina2(void)           //LCD显示图片(扩展)初始化程序
  94.           {
  95.            delay(40);             //大于40MS的延时程序
  96.            PSB=1;                 //设置为8BIT并口工作模式
  97.            delay(1);              //延时
  98.            RES=0;                 //复位
  99.            delay(1);              //延时
  100.            RES=1;                 //复位置高
  101.            delay(10);

  102.            TransferData(0x36,0);  //Extended Function Set RE=1: extended instruction
  103.            delay(100);            //大于100uS的延时程序
  104.            TransferData(0x36,0);  //Extended Function Set:RE=1: extended instruction set
  105.            delay(37);             ////大于37uS的延时程序
  106.            TransferData(0x3E,0);  //EXFUNCTION(DL=8BITS,RE=1,G=1)
  107.            delay(100);            //大于100uS的延时程序
  108.            TransferData(0x01,0);  //CLEAR SCREEN
  109.            delay(100);            //大于100uS的延时程序
  110.           }

  111. /********************************************************************
  112. * 名称 : Main()
  113. * 功能 : 主函数
  114. * 输入 : 无
  115. * 输出 : 无
  116. ***********************************************************************/
  117. void    main(void)
  118.      {
  119.          while(1)
  120.             {
  121.                   initina2();            //调用LCD显示图片(扩展)初始化程序
  122.   
  123.           DisplayGraphic(pic2);  //显示图片2
  124.           delayms(200);                          

  125.           initinal();                    //调用LCD字库初始化程序
  126.           delay(100);            //大于100uS的延时程序
  127.           lcd_mesg(IC_DAT);      //显示中文汉字1
  128.           delayms(240);
  129.           delayms(240);
  130.           
  131.           initinal();                    //调用LCD字库初始化程序
  132.           delay(100);            //大于100uS的延时程序
  133.           lcd_mesg(IC_DAT2);     //显示中文汉字2
  134.           delayms(240);
  135.                   delayms(240);
  136.                   initinal();  
  137.         }
  138.       }

  139. /********************************************************************
  140. * 名称 : Main()
  141. * 功能 : 主函数
  142. * 输入 : 无
  143. * 输出 : 无
  144. ***********************************************************************/
  145. void   lcd_mesg(unsigned char code *adder1)
  146. {
  147.         unsigned char i;
  148.         TransferData(0x80,0);  //Set Graphic Display RAM Address
  149.         delay(100);
  150.         for(i=0;i<32;i++)
  151.                 {
  152.                           TransferData(*adder1,1);
  153.                            adder1++;
  154.                 }

  155.         TransferData(0x90,0);  //Set Graphic Display RAM Address
  156.         delay(100);
  157.         for(i=32;i<64;i++)
  158.                 {
  159.                           TransferData(*adder1,1);
  160.                            adder1++;
  161.                 }
  162. }

  163. /********************************************************************
  164. * 名称 : Main()
  165. * 功能 : 主函数
  166. * 输入 : 无
  167. * 输出 : 无
  168. ***********************************************************************/
  169. void    TransferData(char data1,bit DI)  //传送数据或者命令,当DI=0是,传送命令,当DI=1,传送数据.
  170.           {
  171.             WRD=0;
  172.             RS=DI;
  173.             delay(1);
  174.             P2=Convert(data1);
  175.             E=1;
  176.             delay(1);
  177.             E=0;
  178.            }

  179. /********************************************************************
  180. * 名称 : Main()
  181. * 功能 : 主函数
  182. * 输入 : 无
  183. * 输出 : 无
  184. ***********************************************************************/
  185. void    delayms(unsigned int n)            //延时10×n毫秒程序
  186.                    {
  187.                       unsigned int i,j;
  188.                       for(i=0;i<n;i++)
  189.                          for(j=0;j<2000;j++);
  190.                    }

  191. /********************************************************************
  192. * 名称 : Main()
  193. * 功能 : 主函数
  194. * 输入 : 无
  195. * 输出 : 无
  196. ***********************************************************************/
  197. void    delay(unsigned int m)            //延时程序
  198.                    {
  199.                       unsigned int i,j;
  200.                       for(i=0;i<m;i++)
  201.                          for(j=0;j<10;j++);
  202.                    }

  203. /********************************************************************
  204. * 名称 : Main()
  205. * 功能 : 主函数
  206. * 输入 : 无
  207. * 输出 : 无
  208. ***********************************************************************/
  209. void DisplayGraphic(unsigned char code *adder)
  210. {

  211.    int i,j;
  212. //*******显示上半屏内容设置
  213.    for(i=0;i<32;i++)              //
  214.     {
  215.       TransferData((0x80 + i),0); //SET  垂直地址 VERTICAL ADD
  216.       TransferData(0x80,0);       //SET  水平地址 HORIZONTAL ADD
  217.       for(j=0;j<16;j++)
  218.        {
  219.          TransferData(*adder,1);
  220.          adder++;
  221.        }
  222.     }          
  223. //*******显示下半屏内容设置
  224.    for(i=0;i<32;i++)              //
  225.     {
  226.       TransferData((0x80 + i),0); //SET 垂直地址 VERTICAL ADD
  227.       TransferData(0x88,0);       //SET 水平地址 HORIZONTAL ADD
  228.       for(j=0;j<16;j++)
  229.        {
  230.          TransferData(*adder,1);
  231.          

  232. …………余下代码请下载附件…………
复制代码

下载:
实验23 12864液晶测试程序.rar (40.5 KB, 下载次数: 108)

评分

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

查看全部评分

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

使用道具 举报

沙发
ID:189835 发表于 2018-8-10 09:13 | 只看该作者
这个程序LCD读写不会出错吗?TransferData(char data1,bit DI) ,我看时序图,
回复

使用道具 举报

板凳
ID:189835 发表于 2018-8-10 09:15 | 只看该作者
void    TransferData(char data1,bit DI)  //传送数据或者命令,当DI=0是,传送命令,当DI=1,传送数据.           {             WRD=0;             RS=DI;             delay(1);             P2=Convert(data1);             E=1;             delay(1);             E=0;            },,感觉应该是先 E=1;P2=Convert(data1); delay(1);             E=0;
回复

使用道具 举报

地板
ID:135635 发表于 2018-11-28 15:02 | 只看该作者
太好了,支持!谢谢楼主!
回复

使用道具 举报

5#
ID:451441 发表于 2018-12-26 08:23 | 只看该作者
好资料,正在学12864,太及时了,谢谢LZ
回复

使用道具 举报

6#
ID:458251 发表于 2018-12-29 20:30 | 只看该作者
你们有花屏的情况吗
回复

使用道具 举报

7#
ID:385135 发表于 2019-4-7 22:36 来自手机 | 只看该作者
感谢分享
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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