找回密码
 立即注册

QQ登录

只需一步,快速开始

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

这个单片机st7920液晶程序里面Write_Data(00);的作用?

[复制链接]
跳转到指定楼层
楼主
ID:721008 发表于 2020-9-16 17:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
此程序是一个开发板(51单片机的12684显示)的教程程序,void DisplayCGRAM(unsigned char x,unsigned char y)这个函数是如何对void CGRAM()函数进行显示的,Display是一个关键字吗?还有Write_Data(00);这条语句的作用是什么?如何去理解?
求大神解答,谢谢。
  1. /*-----------------------------------------------
  2.   名称:st7920字库液晶显示
  3.   修改:无
  4.   内容:通过显示字符、数字、汉字和图片测试液晶基本功能
  5. ------------------------------------------------*/
  6. #include <reg52.h>
  7. #include <intrins.h>
  8. #include "delay.h"

  9. sbit RS = P2^4;
  10. sbit RW = P2^5;
  11. sbit E  = P2^6;
  12. sbit RES = P2^3;
  13. sbit PSB = P2^1;
  14. sbit PAUSE = P3^0;

  15. #define DataPort P0        //MCU P0<------> LCM



  16. unsigned char code user16x16[]={ //笑脸图片
  17. 0x0F,0xF0,0x10,0x08,0x20,0x04,0x40,0x02,0x9C,0x39,0xBE,0x7D,0x80,0x01,0x80,0x01,
  18. 0x80,0x01,0x88,0x11,0x84,0x21,0x43,0xC2,0x20,0x04,0x10,0x08,0x0F,0xF0,0x00,0x00,
  19. };
  20. unsigned char code pic1[]=      // 图片代码
  21. {
  22. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
  23. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
  24. 0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,
  25. 0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,
  26. 0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,
  27. 0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,
  28. 0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,
  29. 0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,
  30. 0xC0,0x1F,0xFF,0x81,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,
  31. 0xC0,0x1F,0xFF,0x81,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,
  32. 0xC0,0x18,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x08,0x00,0x00,0x00,0x03,
  33. 0xC0,0x1F,0xFF,0x80,0x00,0x00,0x04,0x07,0x81,0xE0,0x10,0x10,0x03,0xC0,0x30,0x03,
  34. 0xC0,0x1F,0xFF,0x80,0x00,0x00,0x0C,0x0C,0xC3,0x30,0x08,0x20,0x0C,0xE0,0x70,0x03,
  35. 0xC0,0x18,0x01,0x87,0xFF,0xFE,0x3C,0x18,0x66,0x18,0x04,0x40,0x0C,0x60,0x70,0x03,
  36. 0xC0,0x1F,0xFF,0x87,0xFF,0xFE,0x0C,0x18,0x66,0x18,0x02,0x80,0x18,0x00,0xB0,0x03,
  37. 0xC0,0x1F,0xFF,0x80,0x06,0x00,0x0C,0x18,0x66,0x18,0x01,0x00,0x1B,0x81,0x30,0x03,
  38. 0xC0,0x01,0x98,0x00,0x06,0x00,0x0C,0x00,0xE3,0x30,0x02,0x80,0x1C,0xC1,0x30,0x03,
  39. 0xC0,0x19,0x99,0x80,0x66,0x60,0x0C,0x00,0xC1,0xE0,0x04,0x40,0x18,0x62,0x30,0x03,
  40. 0xC0,0x19,0x99,0x80,0x66,0x30,0x0C,0x01,0x83,0x30,0x08,0x20,0x18,0x66,0x30,0x03,
  41. 0xC0,0x0D,0x9B,0x00,0xC6,0x38,0x0C,0x03,0x06,0x18,0x10,0x10,0x18,0x67,0xFC,0x03,
  42. 0xC0,0x0D,0x9B,0x01,0xC6,0x1C,0x0C,0x06,0x06,0x18,0x20,0x08,0x18,0x60,0x30,0x03,
  43. 0xC0,0x01,0x98,0x03,0x86,0x0C,0x0C,0x0C,0x06,0x18,0x00,0x00,0x08,0x60,0x30,0x03,
  44. 0xC0,0x7F,0xFF,0xE3,0x06,0x00,0x0C,0x18,0x03,0x30,0x00,0x00,0x0C,0xC0,0x30,0x03,
  45. 0xC0,0x7F,0xFF,0xE0,0x1E,0x00,0x0C,0x1F,0xE1,0xE0,0x00,0x00,0x07,0x80,0x30,0x03,
  46. 0xC0,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,
  47. 0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,
  48. 0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,
  49. 0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,
  50. 0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,
  51. 0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,
  52. 0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,
  53. 0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,
  54. 0xC0,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x00,0x18,0x00,0x00,0x00,0x06,0x0C,0x03,
  55. 0xC3,0xFF,0xFC,0x3F,0xF0,0x80,0x0C,0x00,0x3F,0x18,0x01,0xFF,0xFE,0x06,0x0C,0x03,
  56. 0xC3,0xFF,0xFC,0x3F,0xF1,0x80,0x0F,0xFC,0x3F,0x18,0x01,0xFF,0xFE,0x06,0x0C,0x03,
  57. 0xC3,0x0C,0x0C,0x0C,0xC3,0x00,0x0F,0xFC,0x33,0x7F,0xE1,0x86,0x06,0x06,0x0C,0x03,
  58. 0xC3,0x1F,0xCC,0x0C,0xC6,0x00,0x0C,0x00,0x33,0x7F,0xE1,0x8F,0xE6,0x06,0x0C,0x03,
  59. 0xC3,0x3F,0xCC,0x0C,0xCC,0x00,0x0C,0x00,0x36,0x30,0x01,0x9F,0xE6,0x07,0xFF,0xE3,
  60. 0xC3,0x79,0x8C,0x0C,0xC8,0x00,0xFF,0xF0,0x36,0x36,0x01,0xBC,0xC6,0x07,0xFF,0xE3,
  61. 0xC3,0x6F,0x0C,0x7F,0xF0,0xC0,0xFF,0xF0,0x36,0x66,0x01,0xB7,0x86,0x06,0x00,0x03,
  62. 0xC3,0x0F,0x0C,0x7F,0xF1,0x80,0xC0,0x30,0x36,0x7F,0xC1,0x87,0x86,0x06,0x00,0x03,
  63. 0xC3,0x79,0xEC,0x0C,0xC3,0x00,0xC0,0x30,0x33,0x7F,0xC1,0xBC,0xF6,0x06,0x00,0x03,
  64. 0xC3,0x76,0xEC,0x0C,0xC6,0x00,0xC0,0x30,0x33,0x06,0x01,0xBB,0x76,0x07,0xFF,0x03,
  65. 0xC3,0x07,0x0C,0x0C,0xCC,0x20,0xFF,0xF0,0x33,0x06,0x01,0x83,0x86,0x07,0xFF,0x03,
  66. 0xC3,0x03,0x0C,0x18,0xC8,0x60,0xFF,0xF0,0x3F,0x06,0x01,0x81,0x86,0x06,0x03,0x03,
  67. 0xC3,0x1C,0x0C,0x18,0xC0,0xC0,0x00,0x00,0x3E,0xFF,0xE1,0x8E,0x06,0x06,0x03,0x03,
  68. 0xC3,0x1F,0x0C,0x18,0xC1,0x81,0xB1,0x8C,0x30,0xFF,0xE1,0x8F,0x86,0x06,0x03,0x03,
  69. 0xC3,0x03,0x0C,0x30,0xC7,0x01,0xB1,0x8C,0x30,0x06,0x01,0x81,0x86,0x0C,0x03,0x03,
  70. 0xC3,0xFF,0xFC,0x70,0xDE,0x03,0x18,0xC6,0x30,0x06,0x01,0xFF,0xFE,0x0C,0x03,0x03,
  71. 0xC3,0xFF,0xFC,0x20,0x18,0x03,0x18,0xC6,0x30,0x06,0x01,0xFF,0xFE,0x18,0x03,0x03,
  72. 0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,
  73. 0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,
  74. 0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,
  75. 0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,
  76. 0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,
  77. 0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,
  78. 0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,
  79. 0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,
  80. 0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,
  81. 0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,
  82. 0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,
  83. 0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,
  84. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
  85. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,

  86. };

  87. /*------------------------------------------------
  88.                     检测忙位
  89. ------------------------------------------------*/
  90. void Check_Busy()
  91. {  
  92.     RS=0;
  93.     RW=1;
  94.     E=1;
  95.     DataPort=0xff;
  96.     while((DataPort&0x80)==0x80);//忙则等待
  97.     E=0;
  98. }
  99. /*------------------------------------------------
  100.                    写命令
  101. ------------------------------------------------*/
  102. void Write_Cmd(unsigned char Cmd)
  103. {
  104.         Check_Busy();
  105.         RS=0;
  106.         RW=0;
  107.         E=1;
  108.         DataPort=Cmd;
  109.         DelayUs2x(5);
  110.         E=0;
  111.         DelayUs2x(5);
  112. }
  113. /*------------------------------------------------
  114.                     写数据
  115. ------------------------------------------------*/
  116. void Write_Data(unsigned char Data)
  117. {
  118.         Check_Busy();
  119.         RS=1;
  120.         RW=0;
  121.         E=1;
  122.         DataPort=Data;
  123.         DelayUs2x(5);
  124.         E=0;
  125.         DelayUs2x(5);
  126. }
  127. /*------------------------------------------------
  128.                    液晶屏初始化
  129. ------------------------------------------------*/
  130. void Init_ST7920()
  131. {  
  132.    DelayMs(40);           //大于40MS的延时程序
  133.    PSB=1;                 //设置为8BIT并口工作模式
  134.    DelayMs(1);            //延时
  135.    RES=0;                 //复位
  136.    DelayMs(1);            //延时
  137.    RES=1;                 //复位置高
  138.    DelayMs(10);
  139.    Write_Cmd(0x30);       //选择基本指令集
  140.    DelayUs2x(50);         //延时大于100us
  141.    Write_Cmd(0x30);       //选择8bit数据流
  142.    DelayUs2x(20);         //延时大于37us
  143.    Write_Cmd(0x0c);       //开显示(无游标、不反白)
  144.    DelayUs2x(50);         //延时大于100us
  145.    Write_Cmd(0x01);       //清除显示,并且设定地址指针为00H
  146.    DelayMs(15);           //延时大于10ms
  147.    Write_Cmd(0x06);       //指定在资料的读取及写入时,设定游标的移动方向及指定显示的移位,光标从右向左加1位移动
  148.    DelayUs2x(50);         //延时大于100us
  149. }
  150. /*------------------------------------------------
  151.                    用户自定义字符
  152. ------------------------------------------------*/
  153. void CGRAM()
  154. {
  155.      int i;
  156.      Write_Cmd(0x30);
  157.      Write_Cmd(0x40);
  158.      for(i=0;i<16;i++)
  159.        {
  160.             Write_Data(user16x16[i*2]);
  161.         Write_Data(user16x16[i*2+1]);
  162.       }
  163. }   
  164. /*------------------------------------------------
  165.                    显示用户自定义字符
  166. ------------------------------------------------*/
  167. void DisplayCGRAM(unsigned char x,unsigned char y)
  168. {
  169. switch(y)
  170.      {
  171.           case 1: Write_Cmd(0x80+x);break;
  172.           case 2: Write_Cmd(0x90+x);break;
  173.           case 3: Write_Cmd(0x88+x);break;
  174.           case 4: Write_Cmd(0x98+x);break;
  175.       default:break;
  176.          }
  177.     Write_Data(00);
  178.     Write_Data(00);

  179. }         
  180. /*------------------------------------------------
  181.                    显示字符串
  182. x:横坐标值,范围0~8
  183. y:纵坐标值,范围1~4
  184. ------------------------------------------------*/
  185. void LCD_PutString(unsigned char x,unsigned char y,unsigned char code *s)
  186. {
  187. switch(y)
  188.      {
  189.           case 1: Write_Cmd(0x80+x);break;
  190.           case 2: Write_Cmd(0x90+x);break;
  191.           case 3: Write_Cmd(0x88+x);break;
  192.           case 4: Write_Cmd(0x98+x);break;
  193.       default:break;
  194.          }
  195. while(*s>0)
  196.    {
  197.       Write_Data(*s);
  198.       s++;
  199.       DelayUs2x(50);
  200.    }
  201. }
  202. /*------------------------------------------------
  203.                       清屏
  204. ------------------------------------------------*/
  205. void ClrScreen()
  206. {
  207.    Write_Cmd(0x01);
  208.    DelayMs(15);
  209. }
  210.          
  211. /*------------------------------------------------
  212.                    显示图片
  213. ------------------------------------------------*/
  214. void LCD_PutGraphic(unsigned char code *img)
  215. {
  216. int i,j;
  217. //显示上半屏内容设置
  218.    for(i=0;i<32;i++)            
  219.     {
  220.       Write_Cmd(0x80 + i); //SET  垂直地址 VERTICAL ADD
  221.       Write_Cmd(0x80);     //SET  水平地址 HORIZONTAL ADD
  222.       for(j=0;j<16;j++)
  223.        {
  224.          Write_Data(*img);
  225.          img++;
  226.        }
  227.     }
  228. //显示下半屏内容设置
  229.    for(i=0;i<32;i++)            
  230.     {
  231.       Write_Cmd(0x80 + i); //SET 垂直地址 VERTICAL ADD
  232.       Write_Cmd(0x88);     //SET 水平地址 HORIZONTAL ADD
  233.       for(j=0;j<16;j++)
  234.        {
  235.          Write_Data(*img);
  236.          img++;
  237.        }
  238.     }  

  239. }
  240. /*------------------------------------------------
  241.                  设置到绘图模式
  242. ------------------------------------------------*/
  243. void SetGraphicMode()
  244. {
  245.    Write_Cmd(0x36);       //选择8bit数据流 图形模式
  246.    DelayUs2x(20);

  247. }
  248. /*------------------------------------------------
  249.                  主程序
  250. ------------------------------------------------*/
  251. main()
  252. {
  253.   unsigned char i;
  254.    CGRAM();     //写入自定义字符
  255.    while(1)
  256.    {

  257.       Init_ST7920();   //初始化
  258.       LCD_PutString(0,1,"  单片机  ");
  259.           LCD_PutString(0,2,"技术论坛");
  260.           LCD_PutString(0,3,"LCD12864点阵液晶");
  261.       LCD_PutString(0,4,"ST7920  测试程序");   
  262.           DisplayCGRAM(7,1); //在第一行第一个位置和
  263.           DisplayCGRAM(0,1);//最后一个位置写入自定义图片笑脸
  264.           //延时30x200ms   
  265.       for(i=0;i<30;i++)
  266.           DelayMs(200);

  267.           LCD_PutString(0,1,"  专用技术论坛  ");
  268.           LCD_PutString(0,2," wwwxxxx.net ");
  269.           LCD_PutString(0,3," wwwxxxxxcom ");
  270.       LCD_PutString(0,4,"  专业成就卓越! ");   
  271.           DisplayCGRAM(0,1); //写入自定义图片笑脸
  272.           DisplayCGRAM(0,4);
  273.           //延时30x200ms   
  274.       for(i=0;i<30;i++)
  275.           DelayMs(200);

  276.           ClrScreen();          //清屏
  277.           SetGraphicMode();     //设置成绘图模式
  278.       LCD_PutGraphic(pic1); //调入一幅图画
  279.       //延时20x200ms
  280.       for(i=0;i<20;i++)
  281.           DelayMs(200);

  282.           ClrScreen();
  283.          


  284.    }
  285. }
复制代码



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

使用道具 举报

沙发
ID:328014 发表于 2020-9-16 21:10 | 只看该作者
这个是往st7920寄存器里面写数据,要弄懂这个必须得先精通液晶的寄存器才行
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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