标题:
STC32G系列LQFP32驱动TM1621D显示LCD例子搞了两个月希望你们不要再搞这么
[打印本页]
作者:
15031773670
时间:
2024-11-23 13:26
标题:
STC32G系列LQFP32驱动TM1621D显示LCD例子搞了两个月希望你们不要再搞这么
/*断码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的代码 因为画的板不一样写法不一样。
*/
/* 如果要在程序中使用此代码,请在程序中注明使用了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, 下载次数: 0)
2024-11-23 13:25 上传
点击文件名下载附件
LCD驱动芯片TM1621D『官方最新规格书
下载积分: 黑币 -5
规格书
lCdstc32GGGGGGGGGGGG.rar
(63.12 KB, 下载次数: 0)
2024-11-23 13:26 上传
点击文件名下载附件
绝对通过的源码
下载积分: 黑币 -5
绝对通过的源码
作者:
15031773670
时间:
2024-11-24 15:25
谢谢老大认可
作者:
rsx9583
时间:
2024-11-25 10:35
资料挺好的。认真看了一下。给楼主提个小建议,要提高一下文字表述的水平。很多语句写得不通顺,语义表达也不是很到位,有点影响阅读。
很多工程师不注重文字表达,结果在项目沟通、个人知识产权保护、推广方面都会吃亏。好东西不能光靠嘴说,需要形成规范的文件材料,才能更好地把技术交流出去。
作者:
15031773670
时间:
2024-12-26 12:57
rsx9583 发表于 2024-11-25 10:35
资料挺好的。认真看了一下。给楼主提个小建议,要提高一下文字表述的水平。很多语句写得不通顺,语义表达也 ...
非常感谢。的确很多时候表达不好。平时基本不说话的。把精力多用到了研究东西上了。这个研究了小两个月。真是太感慨了。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1