/*段码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的代码 因为画的板不一样写法不一样。
*/
- /* 如果要在程序中使用此代码,请在程序中注明使用了STC的资料及程序 */
- /************* 功能说明 **************
- 本例程基于STC32G为主控芯片的实验箱进行编写测试。
- 使用Keil C251编译器,Memory Model推荐设置XSmall模式,默认定义变量在edata,单时钟存取访问速度快。
- edata建议保留1K给堆栈使用,空间不够时可将大数组、不常用变量加xdata关键字定义到xdata空间。
- 下载时, 选择时钟 11.0592MHz ******************************************/
-
-
- #include "comm\STC32G.h" //STC官方文件没做修改用的是STC32GLQFP32 32脚的芯片
-
- #include "stdio.h"
- #include "intrins.h"
-
-
-
-
- #define uchar unsigned char //数据类型宏定义
- #define uint unsigned int //数据类型宏定义
-
- /*断码LCD屏显示方法用法总节
- 为什么要用LCD显示。 便宜 省电 0.5-2元左右
- 为什么选插脚 好焊好调试
- 为什么选TM1621D qsop24 脚少个小 省电 省钱够用。 专业芯片用于处理显示LCD 淘宝几毛
- 为什么用STC32G做测试 因为简单一个主文件搞定 分立模块
- 最近是2024年11月用到不到两个月把这个简简单单的东西看明白分享记录一下。希望以后的人别用这么多的时间!
- 关于程序。这个程序用的是TM1621D的官方例子改的。用逻辑分析仪测试正常。用的是P2口做的驱通信口。
- 这个是可以用的程序。
-
- 最后看了太多的论坛还有CSDN上的文章,基本没有人说出真正可以用的例子用51单片机驱动TM1621D显示LCD。 为什么是这样我也不懂。那就让我来说一下吧。
- 关于单片机方面就不用说了就用STC32G 8K64 还是12K128都可以 用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的代码 因为画的板不一样写法不一样。
- */
-
-
-
- /*断码LCD屏显示方法-定义和其它功能无关的LCD显示功能的引脚还有操作程序用P20 21 22 P34 35 用于给TM1621D和屏供电 1621D驱动*/
- #define nop _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_(); //宏定义
- /******************TM1621D模块命令定义*********************/
- #define SYSDIS 0x00 //关系统振荡器和LCD偏压发生器
- #define SYSEN 0x02 //打开系统振荡器
- #define LCDOFF 0x04 //关LCD偏压
- #define LCDON 0x06 //开LCD偏压
- #define RC 0x30 //内部RC振荡
- #define BIAS 0x52 //1/3偏压 4公共口
- #define WDTDIS 0x0a //禁止看门狗
- #define WDTEN 0x0e //开启看门狗
- /*根据屏设置用内部LCD偏压也就是显示不显示到LCD 关看门狗 适合//1/3偏压 4公共口 需求屏*/
-
- /********************定义控制端口这里要根据实际情况接线**********************/
- sbit CS=P2^0;
- sbit WRITE=P2^1;
- sbit DATA=P2^2;
-
- /********************定义数据这里可以说是没有用的TM1621D官方代码*************************/
- uchar code Smg[16]={0x05,0xff,0xc7,0xE5,0x6C,0xAD,0xaf,0xE0,0xef,0xed,0xee,0x2f,0x8b,0x67,0x8f,0x8e}; //0~F字型码
- uchar code Tab0[16]={0x08,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; //清屏
- /********************延时函数*************************/
- void delay_nms(uint n)
- {
- uint i;
- while(n--)
- for(i=0;i<500;i++);
- }
- /********************从高位写入数据*************************/
- void Write_Data_H(uchar Data, uchar Cnt) //Data的高cnt位写入TM1621D,高位在前
- {
- uchar i;
- for(i=0;i<Cnt;i++)
- {
- WRITE=0;
-
- if(Data&0x80) //从最高位发送
- DATA=1;
- else
- DATA=0;
- nop;
-
- WRITE=1;
- nop;
- Data<<=1;
- }
- WRITE=0;
- DATA=0;
- }
- /********************从低位写入数据*************************/
- void Write_Data_L(uchar Data,uchar Cnt) //Data 的低cnt位写入TM1621D,低位在前
- {
- unsigned char i;
- for(i=0;i<Cnt;i++)
- {
- WRITE=0;
- nop;
- if(Data&0x01) //从低位发送
- DATA=1;
- else
- DATA=0;
- nop;
-
- WRITE=1;
- nop;
- Data>>=1;
- }
- WRITE=0;
- DATA=0;
- }
-
- /********************写入控制命令*************************/
- void WriteCmd(uchar Cmd)
- {
- CS=0;
- nop;
- Write_Data_H(0x80,4); //写入命令标志100
- Write_Data_H(Cmd,8); //写入命令数据
- CS=1;
- nop;
- }
-
- /*********指定地址写入数据,实际写入后4位************/
- void WriteOneData(uchar Addr, uchar Data)
- {
-
- Addr=Addr<<2;
- CS=0;
- nop;
- Write_Data_H(0xa0,3); //写入数据标志101
-
- Write_Data_H(Addr,6); //写入地址数据
- Write_Data_L(Data,4); //写入数据
- nop;
- CS=1;
- nop;
- }
-
- /*********连续写入方式,每次数据为8位,写入数据(基本不用可以去掉)************/
- void WriteAllData(uchar Addr,uchar *p,uchar cnt)
- {
- uchar i;
- CS=0;
- Write_Data_H(0xa0,3); //写入数据标志101
- Write_Data_H(Addr<<2,6); //写入地址数据
- for(i=0;i<cnt;i++) //写入数据
- {
- Write_Data_L(*p,8);
- p++;
- }
- CS=1;
- nop;
- }
-
- /*******************TM1621D初始化**********************/
- void TM1621D_init()
- {
- CS=1;
- WRITE=1;
- DATA=1;
- nop;
- delay_nms(1);
- WriteCmd(BIAS); //1/3偏压 4公共口
- WriteCmd(RC); //内部RC振荡
- WriteCmd(SYSDIS); //关系统振荡器和LCD偏压发生器
- WriteCmd(WDTDIS); //禁止看门狗
- WriteCmd(SYSEN); //打开系统振荡器
- WriteCmd(LCDON); //开LCD偏压
- }
-
- /*************TM1621清屏函数用了这个对1621D应该是全屏清空才是对的*****************/
- void Clear1621()
- {
- uchar i;
- for(i=0;i<32;i++) //9-21可以清屏
- {
- WriteOneData(i, 0x00);
- }
- }
- /*************TM1621全屏函数 如果用了没有全显示则有不对的地方,主要是屏焊接的问题*****************/
- void quanping1621()
- {
- uchar i;
- for(i=9;i<22;i++) //9-21可以清屏
- {
- WriteOneData(i, 0x0f);
- }
- }
- /*断码LCD屏显示方法-定义和其它功能无关的LCD显示功能的引脚还有操作程序用P20 21 22 P34 35 用于给TM1621D和屏供电 1621D驱动*/
-
-
-
- void main()
- {
- /*断码LCD屏显示方法-定义和其它功能无关的LCD显示功能的引脚还有操作程序用P20 21 22 P34 35 用于给TM1621D和屏供电 1621D驱动*/
- P3M0 |= 0x30; P3M1 &= ~0x30; //34 35
- P2M0 &= ~0x07; P2M1 &= ~0x07;
- P34=0;
- P35=1;
- /*断码LCD屏显示方法-定义和其它功能无关的LCD显示功能的引脚还有操作程序用P20 21 22 P34 35 用于给TM1621D和屏供电 1621D驱动*/
- TM1621D_init(); //开机初始化(可以重复初使化主到主循环如果有需要的话)
- delay_nms(1);
- //WriteAllData(0,Tab0,16); //LCD清显存
-
- //WriteOneData(0x0e, 0x06);
-
-
- Clear1621();//LCD清显存
-
- //quanping1621(); //应该可以全显示才对
-
- while(1)
- {
-
- }
- }
-
-
- /*
- WriteOneData(0x01,0x00);
- WriteOneData(0x02,0x00);
- WriteOneData(0x03,0x00);
- WriteOneData(0x04,0x00);
- WriteOneData(0x05,0x00);
- WriteOneData(0x06,0x00);
- WriteOneData(0x07,0x00);
- WriteOneData(0x08,0x00);
- WriteOneData(0x09,0x00);
- */
- //第一位显示8
- // WriteOneData(0x09,0x0f);
- // WriteOneData(0x0e,0x0e);
- //第二位显示5
-
- // WriteOneData(0x0c,0x0A);
- // WriteOneData(0x0d,0x0d);
-
-
-
- //第三位显示2
-
- // WriteOneData(0x10,0x04);
- /*
-
- 09 01 3b
- 09 02 3c
- 09 04 3d
- 09 08 空
-
- 0a 01 3a
- 0a 02 3g
- 0a 04 3e
- 0a 08 空
-
-
- 0b 01 电池1
- 0b 02 2f
- 0b 04 1p
- 0b 08 空
-
- 0c 01 2b
- 0c 02 2c
- 0c 04 2d
- 0c 08 空
-
-
- 0d 01 2a
- 0d 02 2g
- 0d 04 2e
- 0d 08 空
-
- 0e 01 电池空
- 0e 02 1f
- 0e 04 电池3
- 0e 08 空
-
-
-
- 0f 01 1b
- 0f 02 1c
- 0f 04 1d
- 0f 08 空
-
-
- 10 01 1a
- 10 02 1g
- 10 04 1e
- 10 08 空
-
-
- */
-
-
-
-
- //WriteOneData(0x0a,0x0f);
- //WriteOneData(0x0b,0x0f);
-
- //WriteOneData(0x0B,0x07);
-
- //WriteOneData(0x15,0x0f);
-
-
-
- //WriteOneData(0x12,0x0f); //G2 9 3
-
-
-
- //WriteOneData(0x0b,0x01); //G3 7 1
-
- //WriteOneData(0x0b,0x02); //c2 8 2
-
- //WriteOneData(0x0b,0x04); //D2 9 1
-
-
- //WriteOneData(0x0b,0x08); //c1 10 2
-
- //WriteOneData(0x0b,0x01); //D2 7 1
-
-
- /*
- WriteOneData(0x0c,0x01); //E3 7 2
- WriteOneData(0x0c,0x02); //G2 9 3
- WriteOneData(0x0c,0x04); //G2 9 3
- WriteOneData(0x0c,0x08); //G3 7 3
-
-
-
- WriteOneData(0x0d,0x01); //f3 7 4
- WriteOneData(0x0d,0x02); //b2 8 3
- WriteOneData(0x0d,0x04); //f2 9 4
- WriteOneData(0x0d,0x08); //b1 10 3
-
-
-
- */
-
-
-
-
-
-
-
-
- //第二位基本可以显示
- /*
- WriteOneData(0x0e,0x03);
- WriteOneData(0x0f,0x07);
- WriteOneData(0x10,0x03);
- */
-
-
- /*
-
- WriteOneData(0x01,0x00);
- WriteOneData(0x02,0x00);
- WriteOneData(0x03,0x00);
- WriteOneData(0x04,0x00);
- WriteOneData(0x05,0x00);
- WriteOneData(0x06,0x00);
- WriteOneData(0x07,0x00);
- WriteOneData(0x08,0x00);
- WriteOneData(0x09,0x00);
- WriteOneData(0x0a,0x00);
-
-
-
-
-
-
-
- WriteOneData(0x11,0x00);
- WriteOneData(0x12,0x00);
- WriteOneData(0x13,0x00);
- WriteOneData(0x14,0x00);
- WriteOneData(0x15,0x00);
- WriteOneData(0x16,0x00);
- WriteOneData(0x17,0x00);
- WriteOneData(0x18,0x00);
- WriteOneData(0x19,0x00);
- WriteOneData(0x1a,0x00);
- WriteOneData(0x1b,0x00);
- WriteOneData(0x1c,0x00);
- WriteOneData(0x1d,0x00);
- WriteOneData(0x1e,0x00);
- WriteOneData(0x1f,0x00);
- WriteOneData(0x20,0x00);
- WriteOneData(0x21,0x00);
- WriteOneData(0x22,0x00);
- WriteOneData(0x23,0x00);
- WriteOneData(0x24,0x00);
- WriteOneData(0x25,0x00);
- WriteOneData(0x26,0x00);
-
-
- */
-
-
-
-
- /*
-
-
- //101 001110 0001 1100
- //WriteOneData(0x0a,0x0d);
-
- //WriteOneData(0x0d,0x0f);
-
-
- // WriteOneData(0x10,0x02); //LCD SEG10到SEG21显示0~5
-
-
- // WriteOneData(0x0b,0x00);
- // WriteOneData(0x0c,0x08);
-
-
- // WriteOneData(0x0d,0x00);
- // WriteOneData(0x0e,0x0a);
-
-
- //WriteOneData(0x0b, 0x00);
- //WriteOneData(0x0A, 0x05);
- //WriteOneData(0x0b, 0x0b);
- //WriteOneData(0x0f, 0x04);
- //WriteOneData(0x09, 0x01);
- // WriteOneData(0x09, 0x0b);
-
- // WriteOneData(0x0b, 0x0b);
- // WriteOneData(0x0c, 0x0b);
-
- //WriteOneData(0x09, 0x0d);
- //WriteOneData(0x0f, 0x02);
-
- //ping1621();
- //
-
-
-
-
-
-
-
- //WriteOneData(0x0e, 0x02);
- //WriteOneData(0x0e, 0x04);
- //WriteOneData(0x09, 0x0d);
-
-
- //WriteAllData(0x09,Smg,1); //LCD清显存
-
-
- //Clear1621();
-
- //WriteOneData(0x0f,0x08);
- // WriteOneData(0x09, 0x05);
-
- */
-
-
-
-
-
复制代码
LCD驱动芯片TM1621D『官方最新规格书』.pdf
(1.98 MB, 下载次数: 76)
上面的TM1621D
下面我再传源码包别的还需要什么。告诉我。
lCdstc32GGGGGGGGGGGG.rar
(63.12 KB, 下载次数: 70)
|