32G12K128系列 驱动TM1621D显示段码LCD例子搞了两个月希望你们不要再搞这么久
/*段码LCD屏显示方法用法总节为什么要用LCD显示。 便宜 省电0.5-2元左右
为什么选插脚 好焊好调试
为什么选TM1621DSSOP24脚少个小 省电 省钱够用。 专业芯片用于处理显示LCD淘宝几毛
为什么用 32G12K128 做测试因为简单一个主文件搞定 分立模块
最近是2024年11月用到不到两个月把这个简简单单的东西看明白分享记录一下。希望以后的人别用这么多的时间!
关于程序。这个程序用的是TM1621D的官方例子改的。用逻辑分析仪测试正常。用的是P2口做的驱通信口。
这个是可以用的程序。
最后看了太多的论坛还有CSDN上的文章,基本没有人说出真正可以用的例子用51单片机驱动TM1621D显示LCD。为什么是这样我也不懂。那就让我来说一下吧。
关于单片机方面就不用说了就用 32G8K64还是 32G12K128 都可以 用32脚是为了好手工焊接。开P2为准双向口用于发送数据。用P3M0 |= 0x30; P3M1 &= ~0x30; //3435用于给屏供电
关于TM1621D 这个的规格书在百度上一找就可以找到。
关于TM1621D SSOP24 的引脚排列可以在立创上看。
4个COM对应好屏上的COM口。
SEG9-SEG22画版的时候用了哪些写代码的时候就操作哪些。然后自己对应。
关于屏幕要选不带LCD的经角少便宜的 1/3偏压 4公共口的做测试。
关于程序:用这样的一组就用这个程序就可以了。主要用下面的代码做测试
// WriteOneData(0x09,0x04); //意思是写到seg09 上COM写0001 0010 01001000 对应0x 010204 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元左右
为什么选插脚 好焊好调试
为什么选TM1621Dqsop24脚少个小 省电 省钱够用。 专业芯片用于处理显示LCD淘宝几毛
为什么用STC32G做测试因为简单一个主文件搞定 分立模块
最近是2024年11月用到不到两个月把这个简简单单的东西看明白分享记录一下。希望以后的人别用这么多的时间!
关于程序。这个程序用的是TM1621D的官方例子改的。用逻辑分析仪测试正常。用的是P2口做的驱通信口。
这个是可以用的程序。
最后看了太多的论坛还有CSDN上的文章,基本没有人说出真正可以用的例子用51单片机驱动TM1621D显示LCD。为什么是这样我也不懂。那就让我来说一下吧。
关于单片机方面就不用说了就用STC32G 8K64还是12K128都可以 用32脚是为了好手工焊接。开P2为准双向口用于发送数据。用P3M0 |= 0x30; P3M1 &= ~0x30; //3435用于给屏供电
关于TM1621D 这个的规格书在百度上一找就可以找到。
关于TM1621D SSOP24 的引脚排列可以在立创上看。
4个COM对应好屏上的COM口。
SEG9-SEG22画版的时候用了哪些写代码的时候就操作哪些。然后自己对应。
关于屏幕要选不带LCD的经角少便宜的 1/3偏压 4公共口的做测试。
关于程序:用这样的一组就用这个程序就可以了。主要用下面的代码做测试
// WriteOneData(0x09,0x04); //意思是写到seg09 上COM写0001 0010 01001000 对应0x 010204 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 22P34 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={0x05,0xff,0xc7,0xE5,0x6C,0xAD,0xaf,0xE0,0xef,0xed,0xee,0x2f,0x8b,0x67,0x8f,0x8e};//0~F字型码
uchar code Tab0={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 22P34 35 用于给TM1621D和屏供电 1621D驱动*/
void main()
{
/*断码LCD屏显示方法-定义和其它功能无关的LCD显示功能的引脚还有操作程序用P20 21 22P34 35 用于给TM1621D和屏供电 1621D驱动*/
P3M0 |= 0x30; P3M1 &= ~0x30; //3435
P2M0 &= ~0x07; P2M1 &= ~0x07;
P34=0;
P35=1;
/*断码LCD屏显示方法-定义和其它功能无关的LCD显示功能的引脚还有操作程序用P20 21 22P34 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 013b
09 023c
09 043d
09 08空
0a 013a
0a 023g
0a 043e
0a 08空
0b 01电池1
0b 022f
0b 041p
0b 08空
0c 012b
0c 022c
0c 042d
0c 08空
0d 012a
0d 022g
0d 042e
0d 08空
0e 01电池空
0e 021f
0e 04电池3
0e 08空
0f 011b
0f 021c
0f 041d
0f 08空
10 011a
10 021g
10 041e
10 08空
*/
//WriteOneData(0x0a,0x0f);
//WriteOneData(0x0b,0x0f);
//WriteOneData(0x0B,0x07);
//WriteOneData(0x15,0x0f);
//WriteOneData(0x12,0x0f); //G2 93
//WriteOneData(0x0b,0x01); //G3 71
//WriteOneData(0x0b,0x02); //c2 82
//WriteOneData(0x0b,0x04); //D2 91
//WriteOneData(0x0b,0x08); //c1 102
//WriteOneData(0x0b,0x01); //D2 71
/*
WriteOneData(0x0c,0x01); //E3 72
WriteOneData(0x0c,0x02); //G2 93
WriteOneData(0x0c,0x04); //G2 93
WriteOneData(0x0c,0x08); //G3 73
WriteOneData(0x0d,0x01); //f3 74
WriteOneData(0x0d,0x02); //b2 83
WriteOneData(0x0d,0x04); //f2 94
WriteOneData(0x0d,0x08); //b1 103
*/
//第二位基本可以显示
/*
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);
*/
/*
//101001110 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);
*/
上面的TM1621D
下面我再传源码包别的还需要什么。告诉我。
页:
[1]