找回密码
 立即注册

QQ登录

只需一步,快速开始

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

STC8H单片机驱动ST7565R 12864 LCD的测试代码

  [复制链接]
跳转到指定楼层
楼主
本帖最后由 michaelchain 于 2022-1-4 23:51 编辑

在这里放一份, 方便测试屏幕的时候用, 这样不需要临时找
pin脚定义



代码看附件, 项目只有一个main.c, 需要修改的是这部分, 因为使用GPIO模拟的SPI, 所以基本上可以换成任意IO口
  1. sbit     CS=P3^5;
  2. sbit     RESET=P3^7;
  3. sbit     CD=P3^6;
  4. sbit     SCL=P3^2;
  5. sbit     SDA=P3^4;
复制代码

部分代码
  1. #include <reg51.h>

  2. sfr P3M0    = 0xB2;
  3. sfr P3M1    = 0xB1;
  4. sfr P_SW1   = 0xA2;

  5. sbit     CS=P3^5;
  6. sbit     RESET=P3^7;
  7. sbit     CD=P3^6;
  8. sbit     SCL=P3^2;
  9. sbit     SDA=P3^4;

  10. sbit     KEY_PRESS=P1^3;
  11. sbit     DEC_KEY=P1^2;
  12. sbit     EXIT_KEY=P1^1;

  13. /**********************************/
  14. /*      Parameter Define          */
  15. /**********************************/
  16. #define  CONTRAST=0x0C
  17. #define  DATA0=0x40
  18. #define  DATA1=0x41
  19. unsigned char  page_width;
  20. unsigned char  seg_width;

  21. unsigned char Buf_1,Buf_2,Buf_3,conversion;
  22. unsigned char *char_point;
  23. int  contrast;
  24. /**********************************/
  25. /*      Picture data              */
  26. /**********************************/
  27. unsigned char code row_table[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};

  28. unsigned char code char_0[]={62,65,65,62,0 };
  29. unsigned char code char_1[]={0,66,127,64,0 };
  30. unsigned char code char_2[]={98,81,73,70,0};
  31. unsigned char code char_3[]={34,73,73,54,0 };
  32. unsigned char code char_4[]={28,18,127,16,0 };
  33. unsigned char code char_5[]={39,69,69,57,0};
  34. unsigned char code char_6[]={62,73,73,50,0};
  35. unsigned char code char_7[]={1,121,7,1,0};
  36. unsigned char code char_8[]={54,73,73,54,0 };
  37. unsigned char code char_9[]={6,73,73,62,0};

  38. /**********************************/
  39. /*      Time Delay                */
  40. /**********************************/
  41. void Delay(long i)
  42. {
  43.      while(i!=0)
  44.         {
  45.               i--;
  46.          }
  47. }


  48. /**********************************/
  49. /*      Transfer Commmand         */
  50. /**********************************/
  51. void Write_Command(unsigned char command)
  52. {
  53.      int i,j;
  54.      j=0x80;
  55.      CS=0;
  56.      CD=0;
  57.      for(i=0;i<8;i++)
  58.      {
  59.         SCL=0;
  60.         if(command&j)SDA=1;
  61.         else SDA=0;
  62.         SCL=1;
  63.         j=j>>1;
  64.      }
  65.      CS=1;
  66. }

  67. /**********************************/
  68. /*      Transfer Data             */
  69. /**********************************/
  70. void Write_Data(unsigned char data1)
  71. {
  72.      int i,j;
  73.      j=0x80;
  74.      CS=0;
  75.      CD=1;
  76.      for(i=0;i<8;i++)
  77.      {
  78.         SCL=0;
  79.         if(data1&j)SDA=1;
  80.         else SDA=0;
  81.         SCL=1;
  82.         j=j>>1;
  83.      }
  84.      CS=1;
  85. }
  86. //-------------------------------------------------------------------
  87. void Set_column_addr(unsigned char add)
  88. {
  89.      unsigned char temp;
  90.      temp=add;
  91.      add=add>>4;
  92.      add=add&0x0f;
  93.      add=add|0x10;
  94.      Write_Command(add);        //Set upper addr;
  95.      add=temp;
  96.      add=add&0x0F;
  97.      Write_Command(add);        //Set lower addr;
  98. }
  99. //-----------------------------------------------------------------
  100. void Set_row_addr(unsigned char row)
  101. {
  102.      row=row&0x0F;
  103.      row=row|0x0B0;
  104.      Write_Command(row);                //page addr set        
  105. }        
  106. /**********************************/
  107. /*      LCD Initial Code          */
  108. /**********************************/
  109. void Lcd_Set()
  110. {
  111.      RESET=0;
  112.      Delay(1000);
  113.      RESET=1;
  114.      Delay(1000);

  115.      Write_Command(0xE2);          //Software Reset
  116.      Write_Command(0xA2);          //Set Bias        0xA2
  117.      Write_Command(0xA0);          //Segment Direction Select ,bit0=1,reverse;=0,normal;
  118.      Write_Command(0xC8);          //Common Direction Select,bit3=1,reverse direction;=0,normal;     
  119.      Write_Command(0x2C);          //Power Control Set
  120.      Delay(10);
  121.      Write_Command(0x2E);          //Power Control Set
  122.      Delay(10);
  123.      Write_Command(0x2F);          //Power Control Set
  124.      Delay(10);
  125.      Write_Command(0x24);          //set ra/rb 0x25
  126.      Write_Command(0x81);          //Set Contrast     
  127.      Write_Command(0x2C);          //29
  128.      Write_Command(0xAF);          //Display ON
  129. }

  130. /**********************************/
  131. /*      Clear Display             */
  132. /**********************************/
  133. void Display_Clear(data1,data2)
  134. {
  135.     int i,j,m;
  136.     m=0xb0;
  137.     for(i=0;i<9;i++)
  138.     {
  139.         Write_Command(m);
  140.         Write_Command(0x10);
  141.         Write_Command(0x00);
  142.         for(j=0;j<66;j++)
  143.         {
  144.             Write_Data(data1);
  145.             Write_Data(data2);
  146.         }
  147.         m++;
  148.      }
  149. }

  150. void show_three_h_bar(int row)
  151. {
  152.     int i,page,row_data;
  153.     page=row/8;
  154.     i=row%8;
  155.     row_data=row_table[i];

  156.     Set_row_addr(page-1); //清除前一条横线
  157.     Set_column_addr(00);
  158.     for(i=0;i<132;i++)
  159.     {
  160.         Write_Data(0x00);
  161.     }
  162.     Set_row_addr(page); //清除前一条横线
  163.     Set_column_addr(00);
  164.     for(i=0;i<132;i++)
  165.     {
  166.         Write_Data(0x00);
  167.     }

  168.     Set_row_addr(page);
  169.     Set_column_addr(00);
  170.     for(i=0;i<132;i++)
  171.     {
  172.         Write_Data(row_data);
  173.     }
  174. }

  175. /**********************************/
  176. /*      three vertical bar         */
  177. /**********************************/
  178. void show_three_v_bar(int bar)
  179. {
  180.      int i;
  181.      Set_column_addr(bar-1);
  182.      for(i=0;i<9;i++)
  183.         {
  184.             Set_row_addr(i);
  185.             Set_column_addr(bar-1);
  186.             Write_Data(0x00);
  187.          }
  188.      Set_column_addr(bar);
  189.      for(i=0;i<9;i++)
  190.         {
  191.             Set_row_addr(i);
  192.             Set_column_addr(bar);
  193.             Write_Data(0x0ff);
  194.          }
  195.      for(i=0;i<9;i++)
  196.         {
  197.             Set_row_addr(i);
  198.             Set_column_addr(bar+1);
  199.             Write_Data(0x0ff);
  200.          }
  201.      for(i=0;i<9;i++)
  202.         {
  203.             Set_row_addr(i);
  204.             Set_column_addr(bar+2);
  205.             Write_Data(0x0ff);
  206.          }
  207. }

  208. /**********************************/
  209. /*      one vertical bar         */
  210. /**********************************/
  211. void show_one_v_bar(int bar)
  212. {
  213.      int i;
  214.      Set_column_addr(bar-1);
  215.      for(i=0;i<9;i++)
  216.         {
  217.             Set_row_addr(i);
  218.             Set_column_addr(bar-1);
  219.             Write_Data(0x00);
  220.          }
  221.      Set_column_addr(bar);
  222.      for(i=0;i<9;i++)
  223.         {
  224.             Set_row_addr(i);
  225.             Set_column_addr(bar);
  226.             Write_Data(0x0ff);
  227.          }
  228. }

  229. /**********************************/
  230. /*      one horizontal bar         */
  231. /**********************************/
  232. void show_one_h_bar(int row)
  233. {
  234.      int i,page,row_data;
  235.      page=row/8;
  236.      i=row%8;
  237.      row_data=row_table[i];
  238.      
  239.      Set_row_addr(page-1);                //清除前一条横线
  240.      Set_column_addr(00);
  241.      for(i=0;i<132;i++)
  242.         {
  243.             Write_Data(0x00);
  244.          }
  245.      Set_row_addr(page);                //清除前一条横线
  246.      Set_column_addr(00);
  247.      for(i=0;i<132;i++)
  248.         {
  249.             Write_Data(0x00);
  250.          }

  251.      Set_row_addr(page);
  252.      Set_column_addr(00);
  253.      for(i=0;i<132;i++)
  254.         {
  255.             Write_Data(row_data);
  256.          }
  257. }
  258. /**********************************/
  259. /*      Display Font              */
  260. /**********************************/
  261. void Display_Font(unsigned char page0,seg0,unsigned char *p)
  262. {
  263.      int i,m,n;
  264.      m=((seg0&0xf0)>>4)|0x10;
  265.      n=seg0&0x0f;
  266.      Write_Command(page0);
  267.      Write_Command(m);
  268.      Write_Command(n);
  269.      for(i=0;i<5;i++)
  270.         {
  271.             Write_Data(*p++);
  272.          }
  273. }

  274. /**********************************/
  275. /*      Display Hanzi             */
  276. /**********************************/
  277. void Display_Hanzi(unsigned char page0,seg0,unsigned char *p)
  278. {
  279.      int i,m,n;
  280.      m=((seg0&0xf0)>>4)|0x10;
  281.      n=seg0&0x0f;
  282.      Write_Command(page0);
  283.      Write_Command(m);
  284.      Write_Command(n);
  285.      for(i=0;i<16;i++)
  286.         {
  287.             Write_Data(*p++);
  288.          }
  289.      m=((seg0&0xf0)>>4)|0x10;
  290.      n=seg0&0x0f;
  291.      Write_Command(page0+1);
  292.      Write_Command(m);
  293.      Write_Command(n);
  294.      for(i=0;i<16;i++)
  295.         {
  296.             Write_Data(*p++);
  297.          }
  298. }

  299. /**********************************/
  300. /*      Display Character         */
  301. /**********************************/
  302. void Display_Character(unsigned char page0,seg0,unsigned char *p0)
  303. {
  304.     int step0=10;
  305.     int step1=5;
  306.     Display_Font(page0,seg0,p0);
  307.     seg0=seg0+step0;
  308.     p0=p0+step1;
  309.     Display_Font(page0,seg0,p0);
  310.     seg0=seg0+step0;  
  311.     p0=p0+step1;
  312.     Display_Font(page0,seg0,p0);
  313.     seg0=seg0+step0;
  314.     p0=p0+step1;  
  315.     Display_Font(page0,seg0,p0);
  316.     seg0=seg0+step0;
  317.     p0=p0+step1;   
  318.     Display_Font(page0,seg0,p0);
  319.     seg0=seg0+step0;
  320.     p0=p0+step1;   
  321.     Display_Font(page0,seg0,p0);
  322.     seg0=seg0+step0;
  323.     p0=p0+step1;  
  324.     Display_Font(page0,seg0,p0);
  325.     seg0=seg0+step0;
  326.     p0=p0+step1;
  327.     Display_Font(page0,seg0,p0);
  328.     seg0=seg0+step0;
  329.     p0=p0+step1;  
  330.     Display_Font(page0,seg0,p0);
  331.     seg0=seg0+step0;
  332.     p0=p0+step1;  
  333.     Display_Font(page0,seg0,p0);
  334.     seg0=seg0+step0;
  335.     p0=p0+step1;
  336.     Display_Font(page0,seg0,p0);
  337.     seg0=seg0+step0;
  338.     p0=p0+step1;
  339.     Display_Font(page0,seg0,p0);
  340.     seg0=seg0+step0;
  341.     p0=p0+step1;
  342.     Display_Font(page0,seg0,p0);
  343. }


  344. void Show_one_char(unsigned char xs,unsigned char page,unsigned char *p)
  345. {
  346.     int i;
  347.     Set_column_addr(xs);                //column addr set   
  348.     Set_row_addr(page);
  349.     for(i=0;i<5;i++)                //5X8 font
  350.     {
  351.         Write_Data(*(p++));
  352.         //Write_Data(*(p++));
  353.     }
  354. }

  355. void Conversion_T0_char(int number)
  356. {
  357.     Buf_1=number/100;
  358.     conversion=number%100;
  359.     Buf_2=conversion/10;
  360.     Buf_3=conversion%10;           
  361. }

  362. char *Get_addr(int num)
  363. {
  364.     unsigned char *pt;
  365.     switch(num)
  366.     {
  367.         case 0: pt=char_0;break;
  368.         case 1: pt=char_1;break;
  369.         case 2: pt=char_2;break;
  370.         case 3: pt=char_3;break;
  371.         case 4: pt=char_4;break;
  372.         case 5: pt=char_5;break;
  373.         case 6: pt=char_6;break;        
  374.         case 7: pt=char_7;break;        
  375.         case 8: pt=char_8;break;
  376.         case 9: pt=char_9;break;
  377.     }
  378.     return pt;
  379. }        

  380. void show_three_number(unsigned char x,y,int n)
  381. {
  382.          Conversion_T0_char(n);
  383.          char_point=Get_addr(Buf_1);
  384.          Show_one_char(x,y,char_point);
  385.          char_point=Get_addr(Buf_2);
  386.          x=x+5;
  387.          Show_one_char(x,y,char_point);
  388.          char_point=Get_addr(Buf_3);
  389.          x=x+5;
  390.          Show_one_char(x,y,char_point);
  391. }

  392. void Wait_Press()
  393. {
  394.         while(KEY_PRESS);
  395.         Delay(0x5000);         
  396. }

  397. /**********************************/
  398. /*      Draw a image              */
  399. /**********************************/
  400. void Display_Image(unsigned char page0,seg0,pagew,segw,unsigned char *p)
  401. {
  402. int i,j,m,n;
  403. m=((seg0&0xf0)>>4)|0x10;
  404. n=seg0&0x0f;
  405. for(i=0;i<pagew;i++)
  406. {
  407.     Write_Command(page0);
  408.     Write_Command(m);
  409.     Write_Command(n);
  410.     for(j=0;j<segw;j++)
  411.     {   
  412.         Write_Data(*(p++));
  413.     }
  414.     page0++;
  415. }
  416. }

  417. //REGULATE CONTRAST
  418. void Regulate_contrast()
  419. {
  420.         
  421.         while(EXIT_KEY&&01)
  422.         {
  423.             if(KEY_PRESS==0)
  424.             {
  425.                     contrast=contrast+1;
  426.                      Write_Command(0x81);          //Set Contrast     
  427.                      Write_Command(contrast);                             
  428.                      Delay(0x5000);
  429.             }
  430.             if(DEC_KEY==0)
  431.             {
  432.                     contrast=contrast-1;
  433.                      Write_Command(0x81);          //Set Contrast     
  434.                      Write_Command(contrast);                             
  435.                 Delay(0x5000);
  436.             }               
  437.         }        
  438. }

  439. void main()
  440. {
  441.     int i;
  442.     int j=0x40;
  443.     contrast=0x0C;
  444.     //P_SW1 |= 0x0C;
  445.     P3M0 = 0x00;
  446.     P3M1 = 0x00;

  447.     Lcd_Set();     
  448.     while(1)
  449.     {
  450.         Display_Image(0xb0,0x01,8,128,description1);
  451.         Wait_Press();        //Delay(0x5000);
  452.         Display_Image(0xb0,0x01,8,128,description2);
  453.         Wait_Press();        //Delay(0x5000);
  454.         Display_Image(0xb0,0x01,8,128,description3);
  455.         Wait_Press();        //Delay(0x5000);
  456.         Display_Image(0xb0,0x01,8,128,description4);
  457.         Wait_Press();        //Delay(0x5000);

  458.         Display_Image(0xb0,0x01,8,128,description5);
  459.         Wait_Press();        //Delay(0x5000);

  460.                 Display_Clear(0x00,0x00);
  461.                 Display_Clear(0x55,0xaa);                        //SNOW
  462.                 Wait_Press();
  463.                 Display_Clear(0x00,0x00);
  464.                 Display_Clear(0xFF,0xFF);                        //BLACK
  465.                 Wait_Press();
  466.                
  467.                 Display_Clear(0x00,0x00);
  468.                 Display_Clear(0xff,0x00);                        //V_BAR
  469.                 Wait_Press();
  470.                
  471.                 Display_Clear(0x00,0x00);
  472.                 Display_Clear(0x55,0x55);                        //H_BAR
  473.                 Wait_Press();                  
  474.                
  475.                 Display_Clear(0x00,0x00);
  476.                 //Display_Clear(0xFF,0xFF);                        //BLACK
  477.                 for(i=0;i<65;i++)
  478.                 {
  479.                    show_one_h_bar(i);
  480.                    show_three_number(4,3,i);
  481.                    Wait_Press();
  482.                 }

  483.     }
  484. }
复制代码

完整项目看附件

stc8h_st7565r.zip (12.71 KB, 下载次数: 98)


评分

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

查看全部评分

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

使用道具 举报

沙发
ID:820289 发表于 2022-1-5 06:02 | 只看该作者
感谢分享 对小白帮助很大
回复

使用道具 举报

板凳
ID:46065 发表于 2022-1-5 08:43 | 只看该作者
是老王店里的吗?
回复

使用道具 举报

地板
ID:477512 发表于 2022-1-5 17:16 | 只看该作者
无线电话机上常见到这种屏!
回复

使用道具 举报

5#
ID:230742 发表于 2022-1-5 21:26 | 只看该作者
留个记号,感谢分享。
回复

使用道具 举报

6#
ID:912806 发表于 2022-1-6 01:45 | 只看该作者
wxxl 发表于 2022-1-5 08:43
是老王店里的吗?

不是, 老王店里的, 是ST7567, 今天看好像又上架了

不过这两者的驱动基本上是一样的, 除了两点: 睡眠模式的命令不同, 还有ST7567允许写内存自动换页而ST7565不允许, 其它完全一样.

老王的ST7567我也写了驱动了,
W806的: https://github.com/IOsetting/wm- ... demo/spi/st7567_lcd
STC8H的: https://github.com/IOsetting/FwL ... ter/demo/spi/st7567

回复

使用道具 举报

7#
ID:261025 发表于 2022-1-11 20:31 | 只看该作者
最开始那几屏显示的是什么啊  我这显示的是乱码  只有后面全屏点阵横条竖条这些显示正常

51hei截图20220111202802.png (371.11 KB, 下载次数: 31)

51hei截图20220111202802.png

51hei截图20220111202822.png (142.53 KB, 下载次数: 27)

51hei截图20220111202822.png

51hei截图20220111203017.png (142.38 KB, 下载次数: 40)

51hei截图20220111203017.png

51hei截图20220111203032.png (200.26 KB, 下载次数: 23)

51hei截图20220111203032.png

51hei截图20220111203056.png (207.5 KB, 下载次数: 33)

51hei截图20220111203056.png

51hei截图20220111203108.png (239.52 KB, 下载次数: 25)

51hei截图20220111203108.png
回复

使用道具 举报

8#
ID:912806 发表于 2022-1-12 01:02 | 只看该作者
418854190 发表于 2022-1-11 20:31
最开始那几屏显示的是什么啊  我这显示的是乱码  只有后面全屏点阵横条竖条这些显示正常

两个图片, 一个图片里显示的是两行文字, 64-C0G! WGM-128, 另一个应该是插入卡之类的.

你这样点亮了基本上就没什么大问题了, 调调参数很快就能正常用了.

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

9#
ID:261025 发表于 2022-1-12 07:16 来自手机 | 只看该作者
michaelchain 发表于 2022-1-12 01:02
两个图片, 一个图片里显示的是两行文字, 64-C0G! WGM-128, 另一个应该是插入卡之类的.

你这样点亮了基 ...

c语言我玩不转  打算把程序精简一下只保留最基本的显示  然后反编译成汇编  参考19264的汇编程序用
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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