找回密码
 立即注册
查看: 823|回复: 0

32G12K128系列 驱动TM1621D显示段码LCD例子搞了两个月希望你们不要再搞这么久

[复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:378
  • 最近打卡:2025-05-01 07:48:27

43

主题

336

回帖

591

积分

高级会员

积分
591
发表于 2024-11-23 13:22:56 | 显示全部楼层 |阅读模式
/*段码LCD屏显示方法用法总节
为什么要用LCD显示。   便宜   省电  0.5-2元左右
为什么选插脚      好焊好调试
为什么选TM1621D  SSOP24  脚少个小 省电 省钱够用。 专业芯片用于处理显示LCD  淘宝几毛
为什么用 32G12K128 做测试  因为简单一个主文件搞定 分立模块
最近是2024年11月用到不到两个月把这个简简单单的东西看明白分享记录一下。希望以后的人别用这么多的时间!
关于程序。这个程序用的是TM1621D的官方例子改的。用逻辑分析仪测试正常。用的是P2口做的驱通信口。
这个是可以用的程序。

最后看了太多的论坛还有CSDN上的文章,基本没有人说出真正可以用的例子用51单片机驱动TM1621D显示LCD。  为什么是这样我也不懂。那就让我来说一下吧。
关于单片机方面就不用说了就用 32G8K64  还是 32G12K128 都可以 用32脚是为了好手工焊接。开P2为准双向口用于发送数据。用P3M0 |= 0x30; P3M1 &= ~0x30;   //34  35  用于给屏供电

关于TM1621D 这个的规格书在百度上一找就可以找到。
关于TM1621D SSOP24 的引脚排列可以在立创上看。
4个COM对应好屏上的COM口。

SEG9-SEG22  画版的时候用了哪些写代码的时候就操作哪些。然后自己对应。

关于屏幕要选不带LCD的经角少便宜的 1/3偏压 4公共口  的做测试。

关于程序:用这样的一组就用这个程序就可以了。主要用下面的代码做测试

//        WriteOneData(0x09,0x04);         //意思是写到seg09 上  COM写0001   0010   0100  1000   对应0x 01  02  04   08正常会显示一个笔画。


关于我踩过的坑
1 屏没拿到厂家的对的真值表
2 屏的COM认错
3 通信脚没有改
4 通信脚没做IO设置
5 问专业的人不给钱人家也没法给你找到错的地方。
6 屏的尺寸看错PCB孔距画错
7 没认真看TM1621D的规格书。直到到了20多次以后
8 问不懂的销售没什么用。
9 TM1621D的2013年的例子没有详细的注释
10 买屏一定要要到规格书要到对的规格书。
11 如果显示乱码大概率就是COM搞错了。
12 VCC和VLCD之间看规格书说需要接个可调电阻这个不要省。最少加个10K多的电阻
13 实践出真知
14 之前显示不到用了很久才又买了逻辑分析仪之前的找不到了。
15 验证发送数据是对的之后才可以确定程序对不对。本程序已经修改了少量代码使通信波形更稳定
16 为了以后别人和我都可以看懂下面的代码。主机对这个做上有用的注释方便移槙。
17 为什么没写出显示0123456789的代码  因为画的板不一样写法不一样。
*/

  1. /* 如果要在程序中使用此代码,请在程序中注明使用了STC的资料及程序            */
  2. /*************  功能说明    **************
  3. 本例程基于STC32G为主控芯片的实验箱进行编写测试。
  4. 使用Keil C251编译器,Memory Model推荐设置XSmall模式,默认定义变量在edata,单时钟存取访问速度快。
  5. edata建议保留1K给堆栈使用,空间不够时可将大数组、不常用变量加xdata关键字定义到xdata空间。
  6. 下载时, 选择时钟 11.0592MHz ******************************************/
  7. #include "comm\STC32G.h" //STC官方文件没做修改用的是STC32GLQFP32 32脚的芯片
  8. #include "stdio.h"
  9. #include "intrins.h"
  10. #define uchar unsigned char                                 //数据类型宏定义
  11. #define uint unsigned int                                 //数据类型宏定义
  12. /*断码LCD屏显示方法用法总节
  13. 为什么要用LCD显示。   便宜   省电  0.5-2元左右
  14. 为什么选插脚      好焊好调试
  15. 为什么选TM1621D  qsop24  脚少个小 省电 省钱够用。 专业芯片用于处理显示LCD  淘宝几毛
  16. 为什么用STC32G做测试  因为简单一个主文件搞定 分立模块
  17. 最近是2024年11月用到不到两个月把这个简简单单的东西看明白分享记录一下。希望以后的人别用这么多的时间!
  18. 关于程序。这个程序用的是TM1621D的官方例子改的。用逻辑分析仪测试正常。用的是P2口做的驱通信口。
  19. 这个是可以用的程序。
  20. 最后看了太多的论坛还有CSDN上的文章,基本没有人说出真正可以用的例子用51单片机驱动TM1621D显示LCD。  为什么是这样我也不懂。那就让我来说一下吧。
  21. 关于单片机方面就不用说了就用STC32G   8K64  还是12K128都可以 用32脚是为了好手工焊接。开P2为准双向口用于发送数据。用P3M0 |= 0x30; P3M1 &= ~0x30;   //34  35  用于给屏供电
  22. 关于TM1621D 这个的规格书在百度上一找就可以找到。
  23. 关于TM1621D SSOP24 的引脚排列可以在立创上看。
  24. 4个COM对应好屏上的COM口。
  25. SEG9-SEG22  画版的时候用了哪些写代码的时候就操作哪些。然后自己对应。
  26. 关于屏幕要选不带LCD的经角少便宜的 1/3偏压 4公共口  的做测试。
  27. 关于程序:用这样的一组就用这个程序就可以了。主要用下面的代码做测试
  28. //        WriteOneData(0x09,0x04);         //意思是写到seg09 上  COM写0001   0010   0100  1000   对应0x 01  02  04   08正常会显示一个笔画。
  29. 关于我踩过的坑
  30. 1 屏没拿到厂家的对的真值表
  31. 2 屏的COM认错
  32. 3 通信脚没有改
  33. 4 通信脚没做IO设置
  34. 5 问专业的人不给钱人家也没法给你找到错的地方。
  35. 6 屏的尺寸看错PCB孔距画错
  36. 7 没认真看TM1621D的规格书。直到到了20多次以后
  37. 8 问不懂的销售没什么用。
  38. 9 TM1621D的2013年的例子没有详细的注释
  39. 10 买屏一定要要到规格书要到对的规格书。
  40. 11 如果显示乱码大概率就是COM搞错了。
  41. 12 VCC和VLCD之间看规格书说需要接个可调电阻这个不要省。最少加个10K多的电阻
  42. 13 实践出真知
  43. 14 之前显示不到用了很久才又买了逻辑分析仪之前的找不到了。
  44. 15 验证发送数据是对的之后才可以确定程序对不对。本程序已经修改了少量代码使通信波形更稳定
  45. 16 为了以后别人和我都可以看懂下面的代码。主机对这个做上有用的注释方便移槙。
  46. 17 为什么没写出显示0123456789的代码  因为画的板不一样写法不一样。
  47. */
  48. /*断码LCD屏显示方法-定义和其它功能无关的LCD显示功能的引脚还有操作程序用P20 21 22  P34 35 用于给TM1621D和屏供电 1621D驱动*/
  49. #define nop _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); //宏定义
  50. /******************TM1621D模块命令定义*********************/
  51. #define SYSDIS   0x00    //关系统振荡器和LCD偏压发生器        
  52. #define SYSEN    0x02    //打开系统振荡器      
  53. #define LCDOFF   0x04    //关LCD偏压
  54. #define LCDON    0x06    //开LCD偏压                                                         
  55. #define RC       0x30    //内部RC振荡      
  56. #define BIAS     0x52    //1/3偏压 4公共口      
  57. #define WDTDIS   0x0a    //禁止看门狗
  58. #define WDTEN    0x0e    //开启看门狗
  59. /*根据屏设置用内部LCD偏压也就是显示不显示到LCD 关看门狗 适合//1/3偏压 4公共口  需求屏*/
  60. /********************定义控制端口这里要根据实际情况接线**********************/
  61. sbit CS=P2^0;
  62. sbit WRITE=P2^1;
  63. sbit DATA=P2^2;
  64. /********************定义数据这里可以说是没有用的TM1621D官方代码*************************/
  65. uchar code Smg[16]={0x05,0xff,0xc7,0xE5,0x6C,0xAD,0xaf,0xE0,0xef,0xed,0xee,0x2f,0x8b,0x67,0x8f,0x8e};  //0~F字型码
  66. uchar code Tab0[16]={0x08,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; //清屏
  67. /********************延时函数*************************/
  68. void delay_nms(uint n)
  69. {
  70.    uint i;
  71.    while(n--)
  72.      for(i=0;i<500;i++);
  73. }
  74. /********************从高位写入数据*************************/
  75. void Write_Data_H(uchar Data, uchar Cnt)           //Data的高cnt位写入TM1621D,高位在前
  76. {
  77. uchar i;
  78. for(i=0;i<Cnt;i++)
  79. {
  80.   WRITE=0;
  81.         
  82.   if(Data&0x80)                                   //从最高位发送
  83.     DATA=1;               
  84.   else
  85.     DATA=0;
  86.   nop;
  87.   WRITE=1;
  88.   nop;
  89.   Data<<=1;
  90. }
  91. WRITE=0;
  92. DATA=0;
  93. }
  94. /********************从低位写入数据*************************/
  95. void Write_Data_L(uchar Data,uchar Cnt) //Data 的低cnt位写入TM1621D,低位在前
  96. {
  97. unsigned char i;
  98. for(i=0;i<Cnt;i++)
  99. {
  100.    WRITE=0;
  101.                 nop;
  102.    if(Data&0x01)                                 //从低位发送
  103.      DATA=1;  
  104.    else
  105.      DATA=0;
  106.         nop;
  107.         WRITE=1;
  108.                  nop;
  109.         Data>>=1;
  110. }
  111.   WRITE=0;
  112.   DATA=0;  
  113. }
  114. /********************写入控制命令*************************/
  115. void WriteCmd(uchar Cmd)
  116. {
  117. CS=0;
  118. nop;
  119. Write_Data_H(0x80,4);     //写入命令标志100
  120. Write_Data_H(Cmd,8);      //写入命令数据
  121. CS=1;
  122. nop;
  123. }
  124. /*********指定地址写入数据,实际写入后4位************/
  125. void WriteOneData(uchar Addr, uchar Data)
  126. {
  127.         
  128. Addr=Addr<<2;
  129. CS=0;
  130. nop;
  131. Write_Data_H(0xa0,3);     //写入数据标志101
  132.         
  133. Write_Data_H(Addr,6);  //写入地址数据
  134. Write_Data_L(Data,4);     //写入数据
  135. nop;        
  136. CS=1;
  137. nop;
  138. }
  139. /*********连续写入方式,每次数据为8位,写入数据(基本不用可以去掉)************/
  140. void WriteAllData(uchar Addr,uchar *p,uchar cnt)
  141. {
  142. uchar i;
  143. CS=0;
  144. Write_Data_H(0xa0,3);          //写入数据标志101
  145. Write_Data_H(Addr<<2,6);        //写入地址数据
  146. for(i=0;i<cnt;i++)                //写入数据
  147. {
  148.    Write_Data_L(*p,8);            
  149.    p++;
  150. }
  151. CS=1;
  152. nop;
  153. }
  154. /*******************TM1621D初始化**********************/
  155. void TM1621D_init()
  156. {
  157. CS=1;
  158. WRITE=1;
  159. DATA=1;
  160. nop;
  161. delay_nms(1);                        
  162. WriteCmd(BIAS);                 //1/3偏压 4公共口
  163. WriteCmd(RC);                         //内部RC振荡        
  164. WriteCmd(SYSDIS);                 //关系统振荡器和LCD偏压发生器
  165. WriteCmd(WDTDIS);                                                                 //禁止看门狗
  166. WriteCmd(SYSEN);                 //打开系统振荡器
  167. WriteCmd(LCDON);                 //开LCD偏压
  168. }
  169. /*************TM1621清屏函数用了这个对1621D应该是全屏清空才是对的*****************/
  170. void Clear1621()
  171. {
  172. uchar i;
  173. for(i=0;i<32;i++) //9-21可以清屏
  174. {
  175. WriteOneData(i, 0x00);
  176. }
  177. }
  178. /*************TM1621全屏函数 如果用了没有全显示则有不对的地方,主要是屏焊接的问题*****************/
  179. void quanping1621()
  180. {
  181. uchar i;
  182. for(i=9;i<22;i++) //9-21可以清屏
  183. {
  184. WriteOneData(i, 0x0f);
  185. }
  186. }
  187. /*断码LCD屏显示方法-定义和其它功能无关的LCD显示功能的引脚还有操作程序用P20 21 22  P34 35 用于给TM1621D和屏供电 1621D驱动*/
  188. void main()
  189. {        
  190. /*断码LCD屏显示方法-定义和其它功能无关的LCD显示功能的引脚还有操作程序用P20 21 22  P34 35 用于给TM1621D和屏供电 1621D驱动*/
  191.         P3M0 |= 0x30; P3M1 &= ~0x30;   //34  35
  192.   P2M0 &= ~0x07; P2M1 &= ~0x07;
  193.   P34=0;
  194.         P35=1;
  195. /*断码LCD屏显示方法-定义和其它功能无关的LCD显示功能的引脚还有操作程序用P20 21 22  P34 35 用于给TM1621D和屏供电 1621D驱动*/
  196. TM1621D_init();                //开机初始化(可以重复初使化主到主循环如果有需要的话)
  197. delay_nms(1);
  198. //WriteAllData(0,Tab0,16);         //LCD清显存
  199.         
  200.         //WriteOneData(0x0e, 0x06);               
  201.         
  202.         
  203.         Clear1621();//LCD清显存
  204.         
  205. //quanping1621();  //应该可以全显示才对
  206.         
  207. while(1)
  208. {        
  209.         
  210. }
  211. }
  212.         
  213. /*
  214.         WriteOneData(0x01,0x00);           
  215.         WriteOneData(0x02,0x00);           
  216.         WriteOneData(0x03,0x00);           
  217.         WriteOneData(0x04,0x00);           
  218.         WriteOneData(0x05,0x00);           
  219.         WriteOneData(0x06,0x00);           
  220.         WriteOneData(0x07,0x00);           
  221.         WriteOneData(0x08,0x00);           
  222.         WriteOneData(0x09,0x00);
  223. */
  224.         //第一位显示8
  225. //        WriteOneData(0x09,0x0f);
  226. //        WriteOneData(0x0e,0x0e);
  227.         //第二位显示5
  228.         
  229. //        WriteOneData(0x0c,0x0A);
  230. //        WriteOneData(0x0d,0x0d);
  231.         
  232.         
  233.         
  234.                 //第三位显示2
  235.         
  236. //        WriteOneData(0x10,0x04);        
  237. /*
  238. 09 01  3b
  239. 09 02  3c
  240. 09 04  3d
  241. 09 08  空
  242. 0a 01  3a
  243. 0a 02  3g
  244. 0a 04  3e
  245. 0a 08  空
  246. 0b 01  电池1
  247. 0b 02  2f
  248. 0b 04  1p
  249. 0b 08  空
  250. 0c 01  2b
  251. 0c 02  2c
  252. 0c 04  2d
  253. 0c 08  空
  254. 0d 01  2a
  255. 0d 02  2g
  256. 0d 04  2e
  257. 0d 08  空
  258. 0e 01  电池空
  259. 0e 02  1f
  260. 0e 04  电池3
  261. 0e 08  空
  262. 0f 01  1b
  263. 0f 02  1c
  264. 0f 04  1d
  265. 0f 08  空
  266. 10 01  1a
  267. 10 02  1g
  268. 10 04  1e
  269. 10 08  空
  270. */
  271.         
  272.         
  273.         
  274.         
  275.         //WriteOneData(0x0a,0x0f);
  276.         //WriteOneData(0x0b,0x0f);
  277.         
  278.         //WriteOneData(0x0B,0x07);
  279.         
  280.         //WriteOneData(0x15,0x0f);
  281.         
  282.         
  283.         
  284.         //WriteOneData(0x12,0x0f);   //G2   9  3
  285.                  
  286.         
  287.         
  288.         //WriteOneData(0x0b,0x01);   //G3   7  1
  289.                  
  290.         //WriteOneData(0x0b,0x02);   //c2   8  2
  291.         
  292.         //WriteOneData(0x0b,0x04);   //D2   9  1  
  293.         
  294.         
  295.         //WriteOneData(0x0b,0x08);   //c1   10  2
  296. //WriteOneData(0x0b,0x01);   //D2   7  1   
  297. /*
  298. WriteOneData(0x0c,0x01);   //E3   7  2   
  299. WriteOneData(0x0c,0x02);   //G2   9  3
  300. WriteOneData(0x0c,0x04);   //G2   9  3
  301. WriteOneData(0x0c,0x08);   //G3   7  3
  302. WriteOneData(0x0d,0x01);   //f3   7  4
  303. WriteOneData(0x0d,0x02);   //b2   8  3
  304. WriteOneData(0x0d,0x04);   //f2   9  4
  305. WriteOneData(0x0d,0x08);   //b1   10  3
  306. */
  307.         
  308.         //第二位基本可以显示
  309.         /*
  310. WriteOneData(0x0e,0x03);
  311. WriteOneData(0x0f,0x07);
  312. WriteOneData(0x10,0x03);   
  313. */
  314.         
  315.         /*
  316.         
  317.         WriteOneData(0x01,0x00);           
  318.         WriteOneData(0x02,0x00);           
  319.         WriteOneData(0x03,0x00);           
  320.         WriteOneData(0x04,0x00);           
  321.         WriteOneData(0x05,0x00);           
  322.         WriteOneData(0x06,0x00);           
  323.         WriteOneData(0x07,0x00);           
  324.         WriteOneData(0x08,0x00);           
  325.         WriteOneData(0x09,0x00);           
  326.         WriteOneData(0x0a,0x00);
  327.         
  328.         
  329.         
  330.         
  331.         
  332.         
  333.         WriteOneData(0x11,0x00);           
  334.         WriteOneData(0x12,0x00);           
  335.         WriteOneData(0x13,0x00);           
  336.         WriteOneData(0x14,0x00);           
  337.         WriteOneData(0x15,0x00);           
  338.         WriteOneData(0x16,0x00);           
  339.         WriteOneData(0x17,0x00);           
  340.         WriteOneData(0x18,0x00);           
  341.         WriteOneData(0x19,0x00);           
  342.         WriteOneData(0x1a,0x00);           
  343.         WriteOneData(0x1b,0x00);           
  344.         WriteOneData(0x1c,0x00);           
  345.         WriteOneData(0x1d,0x00);           
  346.         WriteOneData(0x1e,0x00);           
  347.         WriteOneData(0x1f,0x00);           
  348.         WriteOneData(0x20,0x00);           
  349.         WriteOneData(0x21,0x00);           
  350.         WriteOneData(0x22,0x00);           
  351.         WriteOneData(0x23,0x00);           
  352.         WriteOneData(0x24,0x00);           
  353.         WriteOneData(0x25,0x00);           
  354.         WriteOneData(0x26,0x00);           
  355.         
  356.         
  357.         */
  358. /*
  359.         //101  001110   0001 1100
  360.          //WriteOneData(0x0a,0x0d);
  361.         
  362.         //WriteOneData(0x0d,0x0f);
  363.         
  364. //        WriteOneData(0x10,0x02);          //LCD SEG10到SEG21显示0~5
  365.         
  366.         
  367.         // WriteOneData(0x0b,0x00);
  368.         // WriteOneData(0x0c,0x08);
  369.         
  370.         
  371. //         WriteOneData(0x0d,0x00);
  372. //         WriteOneData(0x0e,0x0a);
  373.         
  374.         //WriteOneData(0x0b, 0x00);
  375.         //WriteOneData(0x0A, 0x05);
  376.         //WriteOneData(0x0b, 0x0b);
  377.                         //WriteOneData(0x0f, 0x04);
  378.         //WriteOneData(0x09, 0x01);
  379.         //        WriteOneData(0x09, 0x0b);                                                                                                               
  380.                                                                                                 
  381.         //        WriteOneData(0x0b, 0x0b);                                                                                                               
  382.         //        WriteOneData(0x0c, 0x0b);                                                                                                               
  383. //WriteOneData(0x09, 0x0d);               
  384.         //WriteOneData(0x0f, 0x02);        
  385.         
  386.         //ping1621();
  387.          //
  388.         
  389.         
  390.         
  391.         
  392.         
  393.         
  394. //WriteOneData(0x0e, 0x02);               
  395. //WriteOneData(0x0e, 0x04);               
  396. //WriteOneData(0x09, 0x0d);               
  397. //WriteAllData(0x09,Smg,1);         //LCD清显存
  398.         
  399.         //Clear1621();
  400.         
  401.                         //WriteOneData(0x0f,0x08);
  402. //        WriteOneData(0x09, 0x05);
  403.         
  404. */
复制代码
LCD驱动芯片TM1621D『官方最新规格书』.pdf (1.98 MB, 下载次数: 76)
上面的TM1621D
下面我再传源码包别的还需要什么。告诉我。
lCdstc32GGGGGGGGGGGG.rar (63.12 KB, 下载次数: 70)

回复

使用道具 举报 送花

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

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 02:40 , Processed in 0.127372 second(s), 49 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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