数码之家

 找回密码
 立即注册
搜索
查看: 3486|回复: 8

[C51] 有大神能帮帮解读一段程序吗?lm3122液晶官方演示程序

[复制链接]
发表于 2021-1-27 17:43:39 | 显示全部楼层 |阅读模式
大神能帮我解读下红色箭头的这段程序吗?C语言刚学不久,前面的都能看懂,就是这一句看不懂了;这是一块lm3122(无字库)液晶的官方演示程序;

单纯数字的话能显示,但是是倒过来的,中文的话就显示不正常了

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
发表于 2021-1-27 19:40:05 | 显示全部楼层
本帖最后由 decai 于 2021-1-27 19:49 编辑

指针都是一道坎.要突破的一个瓶颈
在这个函数里.可以把displaydata当成是一个数组
那么这句的意思其实就是tempdata=displaydata[i*202+j]
最里面的括号就没什么好说的了.
中间的括号就是displaydata+xxx,displaydata这个变量表示的地址往后推xxx个u_int的地址
整个括号内的都是在计算变量存放在哪的意思
再在括号前加个*,那就是该地址内存的数据,由括号内计算得到的地址把数据读过来给tempdata
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-27 19:50:19 | 显示全部楼层
decai 发表于 2021-1-27 19:40
指针都是一道坎.要突破的一个瓶颈
在这个函数里.可以把displaydata当成是一个数组
那么这句的意思其实就是t ...

中括号里的数据是按正常的加减乘除吗?
回复 支持 反对

使用道具 举报

发表于 2021-1-27 20:24:54 | 显示全部楼层
displaydata 是个指针

在 u_int * 做了定义

后面 *表示取内容

在主程序里面应该定义有显示缓存,808字节,还不小,一般51装不下,就128的RAM,

好像函数传递指针,这样可以减少编译空间吧。

回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-27 20:48:43 | 显示全部楼层
这是程序代码
  1. //-------------------------------------------
  2. // Shenzhen TOPWAY Technology Co. Ltd.
  3. // LCD Module:        LM3122
  4. // Display size:      202x32
  5. // Driver/Controller: AX6120/AX6121
  6. // Date:              2005-02-24
  7. //-------------------------------------------
  8. #include <stdio.h>
  9. #include <reg51.h>
  10. #include <intrins.h>

  11. #define u_char  unsigned char
  12. #define u_int   unsigned int

  13. sbit RES        = P3^5;       
  14. sbit _WR1        = P3^1;
  15. sbit _WR2        = P3^2;
  16. sbit _WR3        = P3^3;
  17. sbit A0                = P3^6;
  18. // DataBus = P1

  19. //====================
  20. // Display Data
  21. //====================
  22. /*--  TOPWAY 202x32     --*/
  23. u_int code Logo1[]={
  24. 0xFE,0xFE,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,
  25. 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0xFE,0xFE,0x00,0x00,0x80,
  26. 0xE0,0x70,0x38,0x18,0x0C,0x06,0x06,0x02,0x03,0x01,0x81,0x81,0x81,0x81,0x81,0x81,
  27. 0x81,0x01,0x03,0x02,0x06,0x06,0x0C,0x1C,0x38,0x70,0xE0,0xC0,0x00,0x00,0x00,0x00,
  28. 0xFE,0xFE,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,
  29. 0x02,0x02,0x02,0x02,0x06,0x04,0x04,0x0C,0x18,0x30,0xE0,0xC0,0x00,0x06,0x7E,0xFA,
  30. 0x82,0x02,0x02,0x02,0x02,0x02,0xFE,0xFE,0x80,0x00,0x00,0x00,0x00,0xF0,0xFE,0x1E,
  31. 0x02,0x02,0x02,0x02,0x02,0x1E,0xFE,0xF0,0x00,0x00,0x00,0x00,0x80,0xFE,0xFE,0x02,
  32. 0x02,0x02,0x02,0x02,0x82,0xFA,0x7E,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  33. 0x00,0xE0,0xFC,0x1E,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x1E,0xFC,0xE0,
  34. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x0E,0x1E,0x7A,0xE2,0x82,0x02,
  35. 0x02,0x02,0x02,0x06,0x1E,0x78,0xE0,0x80,0x00,0x00,0x00,0x80,0xE0,0x78,0x1E,0x06,
  36. 0x02,0x02,0x02,0x02,0x82,0xE2,0x7A,0x1E,0x0E,0x02,0x01,0x01,0x01,0x01,0x01,0x01,
  37. 0x01,0x01,0x01,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x01,0x01,
  38. 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0xF8,0xFF,0x0F,0x01,0x00,0x00,0x00,0x00,0x00,
  39. 0xF0,0xFE,0x0F,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x01,0x03,0x0F,0xFE,0xF0,0x00,
  40. 0x00,0x00,0x00,0x00,0x01,0x07,0xFF,0xF8,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,
  41. 0x00,0x00,0x00,0x7F,0x7F,0x41,0x41,0x41,0x41,0x41,0x41,0x63,0x3E,0x1C,0x00,0x00,
  42. 0x00,0x00,0x00,0x00,0x80,0xFF,0x7F,0x00,0x00,0x07,0xFF,0xF8,0x80,0x00,0x00,0x00,
  43. 0x00,0x3F,0xFF,0xE0,0x00,0xC0,0xFE,0x7F,0x03,0x00,0x80,0xFC,0xFC,0xFC,0x80,0x00,
  44. 0x03,0x7F,0xFE,0xC0,0x00,0xE0,0xFF,0x3F,0x00,0x00,0x00,0x00,0x80,0xF8,0xFF,0x07,
  45. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xF8,0x3F,0x07,0x00,0x00,0x00,0x00,
  46. 0xF0,0xFE,0x0F,0xFE,0xE0,0x00,0x00,0x00,0x00,0x07,0x3F,0xF8,0xC0,0x00,0x00,0x00,
  47. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x07,0x1E,0x38,0xE0,0xC0,0x00,0x00,0x00,
  48. 0x01,0x07,0x1E,0x38,0x1E,0x07,0x01,0x00,0x00,0x00,0xC0,0xE0,0x38,0x1E,0x07,0x01,
  49. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,
  50. 0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  51. 0x00,0x1F,0xFF,0xE0,0x80,0x00,0x00,0x00,0x00,0x00,0x0F,0x7F,0xF0,0xC0,0x80,0x00,
  52. 0x00,0x00,0x00,0x00,0x80,0xC0,0xF0,0x7F,0x0F,0x00,0x00,0x00,0x00,0x00,0x80,0xE0,
  53. 0xFF,0x1F,0x00,0x00,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xE0,0x20,
  54. 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x30,0x10,0x10,0x18,0x0C,0x0E,0x07,0x01,
  55. 0x00,0x00,0x00,0x00,0x00,0x0F,0xFF,0xF8,0x80,0x00,0x00,0x00,0x0F,0xFF,0xFE,0x7F,
  56. 0x03,0x00,0x00,0xE0,0xFF,0x1F,0x00,0x1F,0xFF,0xE0,0x00,0x00,0x03,0x7F,0xFE,0xFF,
  57. 0x0F,0x00,0x00,0x00,0x80,0xF8,0xFF,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,
  58. 0xF8,0x3F,0x07,0x01,0x00,0x00,0x00,0x00,0x78,0x7F,0x47,0x40,0x40,0x40,0x47,0x7F,
  59. 0x78,0x00,0x00,0x00,0x00,0x01,0x0F,0x3F,0xF8,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,
  60. 0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x0F,0xFC,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,
  61. 0x00,0xF8,0xFC,0x0F,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  62. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
  63. 0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x07,0x0E,
  64. 0x1C,0x18,0x30,0x60,0x60,0x40,0xC0,0x80,0x81,0x81,0x81,0x81,0x81,0x81,0x81,0x80,
  65. 0xC0,0x40,0x60,0x60,0x30,0x18,0x1C,0x0E,0x07,0x01,0x00,0x00,0x00,0x00,0xFF,0xFF,
  66. 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  67. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  68. 0x00,0x0F,0xFF,0xF0,0x80,0x80,0x80,0x81,0x81,0x80,0x80,0x80,0xF8,0xFF,0x07,0x00,
  69. 0x00,0x00,0x07,0xFF,0xF8,0x80,0x80,0x80,0x81,0x81,0x80,0x80,0x80,0xF0,0xFF,0x0F,
  70. 0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xF0,0xFE,0x8F,0x81,0x80,0x80,0x80,0x80,0xC0,
  71. 0xF8,0x38,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x38,0xF8,0xC0,0x80,0x80,
  72. 0x80,0x80,0x81,0x8F,0xFE,0xF0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  73. 0x00,0x00,0xFF,0xFF,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xFF,0xFF,0x00,0x00,0x00,
  74. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};

  75. //====================
  76. // delay routine
  77. //====================
  78. void delay100us(void)        //delay 100us for 12MHz
  79. {
  80. u_char data i;
  81. for(i=0;i<=70;i++)
  82.         {_nop_(); _nop_();}
  83. }

  84. void delay1ms(void)                //delay 1ms for 12MHz
  85. {
  86. u_char data i;
  87. for(i=0;i<=250;i++)
  88.         {_nop_(); _nop_();}
  89. }

  90. void delay100ms(void)
  91. {
  92. u_char data j;
  93. for(j=0;j<=100;j++)
  94.         {delay1ms();}       
  95. }


  96. //====================
  97. // write command
  98. //====================
  99. void wr_command(u_char ChipNo,command)
  100. {
  101. P1 = command;
  102. A0=0;
  103. _nop_();
  104. switch(ChipNo)
  105.         {
  106.         case 0:        _WR1=0; _WR2=0; _WR3=0;  break;// write into all driver
  107.         case 1:        _WR1=0; _WR2=1; _WR3=1;  break;// write into 1st driver
  108.         case 2:        _WR1=1; _WR2=0; _WR3=1;  break;// write into 2nd driver
  109.         case 3:        _WR1=1; _WR2=1; _WR3=0;  break;// write into 3rd driver
  110.         }
  111. _WR1=1; _WR2=1; _WR3=1;
  112. delay100us();
  113. }

  114. //====================
  115. // write data
  116. //====================
  117. void wr_data(u_char ChipNo,ddata)
  118. {
  119. P1 = ddata;
  120. A0=1;
  121. _nop_();
  122. switch(ChipNo)
  123.         {
  124.         case 0:        _WR1=0; _WR2=0; _WR3=0; break; // write into all driver
  125.         case 1:        _WR1=0; _WR2=1; _WR3=1; break; // write into 1st driver
  126.         case 2:        _WR1=1; _WR2=0; _WR3=1; break; // write into 2nd driver
  127.         case 3:        _WR1=1; _WR2=1; _WR3=0; break; // write into 3rd driver
  128.         }
  129. _WR1=1; _WR2=1; _WR3=1;
  130. }

  131. //====================
  132. // clear screen
  133. //====================
  134. void ClrScreen()        // fill 00h into DD RAM
  135. {
  136. u_char i,j;
  137. for(i=0;i<4;i++)
  138.             {
  139.             wr_command(0,0xb8 | i);        // select page
  140.             wr_command(0,0x00);        // start form column 0
  141.             for(j=0;j<80;j++)
  142.                     {
  143.                     wr_data(0,0x00);// fill 00h in to DD RAM
  144.                     }
  145.             }
  146. }

  147. //====================
  148. // Write a Screen
  149. //====================
  150. void WriteScreen(u_int *DisplayData)        // DisplayData should be 202x32/8 = 808 bytes
  151. {
  152.         u_char TempData;
  153.         u_char i, j;
  154.         for(i=0;i<4;i++)
  155.         {
  156.             wr_command(0,0xb8 | i);        // select page
  157.             wr_command(0,0);        // all chip start form column 0
  158.              for(j=0;j<201;j++)
  159.                      {
  160.                      TempData=(*(DisplayData+(i*202)+j));
  161.                      if (j<61)
  162.                         {
  163.                              wr_data(1,TempData);        // 0-60 column goto chip1
  164.                         }
  165.                     else if ((j>=61)&(j<=140))
  166.                         {
  167.                              wr_data(2,TempData);        // 61-141 column goto chip2
  168.                         }
  169.                     else
  170.                         {
  171.                              wr_data(3,TempData);        // 141-201 column goto chip3
  172.                         }
  173.                 }
  174.             }
  175.            
  176. }

  177. //====================
  178. // Init LCD module
  179. //====================
  180. void initLCDM(void)
  181. {
  182.         _WR1=1; _WR2=1; _WR3=1;        // init WR status
  183.         RES = 0;
  184.         delay1ms();
  185.         RES = 1;
  186.         delay1ms();
  187.         RES = 0;                // RES=0, 80 I/F mode
  188.         wr_command(0,0xa9);        // set duty cycle 1/32
  189.         wr_command(0,0xa4);        // static drive = OFF
  190.         wr_command(0,0xa0);        // adc=0
  191.         wr_command(0,0xc0);        // display start line =0;
  192.         wr_command(0,0xaf);        // display ON;
  193.         //wr_command(0,0xee);   // read modify write=Off;
  194. }

  195. //************************
  196. // Main Program
  197. //************************
  198. void main(void)
  199. {
  200. SP = 0x60;                        // stack pointer
  201. EA = 0;                         // disable interrupts

  202. initLCDM();                // init LCD module
  203. ClrScreen();                // clear DD RAM
  204. WriteScreen(Logo1);        //send a screen of display

  205. while(1)                        // end of program
  206.         {
  207.         _nop_();
  208.         }
  209. }
复制代码
回复 支持 反对

使用道具 举报

发表于 2021-1-28 08:53:06 | 显示全部楼层
如果显示方向不对,查初始化代码
回复 支持 反对

使用道具 举报

发表于 2021-1-28 11:17:55 | 显示全部楼层
字模方向不符合要求
回复 支持 反对

使用道具 举报

发表于 2021-1-28 11:20:02 | 显示全部楼层
应该根据LCD屏的驱动芯片的型号查找数据手册,而后才能调整字体的显示方式以及字符取模的设置方式,现在已经可以显示数字了,接下来应该好弄了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-28 17:32:07 | 显示全部楼层
慕名而来 发表于 2021-1-28 11:20
应该根据LCD屏的驱动芯片的型号查找数据手册,而后才能调整字体的显示方式以及字符取模的设置方式,现在已 ...

已经显示正常了,之前参数没调对
回复 支持 反对

使用道具 举报

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

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-5-13 10:45 , Processed in 0.218400 second(s), 11 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

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