TM1650代码记录(基于51单片机)

文章目录
一、TM1650
0、介绍
1、典型应用电路
2、原理图
3、PCB
4、实物图
5、键盘扫描码
二、代码记录
1、C文件:
2、H文件
三、结束语
一、TM1650
0、介绍
功能特点:

TM1650用于驱动共阴极显示器
两种显示模式:8段×4位和7段×4位
段驱动电流大于25mA,位驱动电流大于150mA
提供8级亮度控制
键盘扫描:7×4bit内部集成三极管驱动
高速两线式串行接口
内置时钟振荡电路
内置上电复位电路
支持2.8V-5.5V电源电压
提供DIP16及SOP16封装
1
2
3
4
5
6
7
8
9
10
1、典型应用电路


2、原理图


3、PCB


4、实物图

 


5、键盘扫描码

哔哩哔哩演示视频:TM1650数码管显示及按键扫描

二、代码记录
1、C文件:
头文件引用、定义数组、定义引脚

#include "allhead.h"

// ------------------------------------------------------------
// IO口模拟I2C通信
// SCL_T接P3^3
// SDA_T接P3^4
// ------------------------------------------------------------
sbit SCL_T = P3^3; //串行时钟
sbit SDA_T = P3^4; //串行数据

/*********************TM1650数码管显示数组************************************/
unsigned char code dig1[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
//0、1、2、3、4、5、6、7、8、9、-//不带小数点

unsigned char code dig2[11]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0xc0};
//0、1、2、3、4、5、6、7、8、9、-//带小数点

unsigned char key_data = 0; //键盘扫描码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
IIC起始位:

/**********************************************
//TM Start//起始位
**********************************************/
void TM_Start()
{
SCL_T = 1;
SDA_T = 1;
Delay5us_TM();
SDA_T = 0;
}
1
2
3
4
5
6
7
8
9
10
IIC结束位:

/**********************************************
//TM Stop//结束位
**********************************************/
void TM_Stop()
{
SCL_T = 1;
SDA_T = 0;
Delay5us_TM();
SDA_T = 1;
}
1
2
3
4
5
6
7
8
9
10
ACK信号:

/**********************************************
//TM Ack//ACK信号
**********************************************/
void TM_Ack()
{
unsigned char timeout = 1;
SCL_T = 1;
Delay5us_TM();
SCL_T = 0;
while((SDA_T) && (timeout <= 100))
{
timeout++;
}
Delay5us_TM();
SCL_T = 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
写一个字节:

/**********************************************
// 通过总线写一个字节
**********************************************/
void Write_TM_Byte(unsigned char TM_Byte)
{
unsigned char i;
SCL_T = 0;
Delay1us_TM();
for(i=0;i<8;i++)
{
if(TM_Byte & 0x80)
SDA_T = 1;
else
SDA_T = 0;
SCL_T = 0;
Delay5us_TM();
SCL_T = 1;
Delay5us_TM();
SCL_T = 0;
TM_Byte <<= 1;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
读一个字节:

/**********************************************
// 通过总线读一个字节
**********************************************/
unsigned char Read_TM_Byte()
{
unsigned char i;
unsigned char j;
unsigned char TM_Byte;

for(i=0;i<8;i++)
{
SCL_T = 0;
Delay5us_TM();

TM_Byte <<= 1;

j = SDA_T;

TM_Byte += j;

SCL_T = 1;
Delay5us_TM();
}

SCL_T = 0;
Delay1us_TM();

return TM_Byte;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
TM1650写数据:

/*********************TM1650写数据************************************/
void TM_WrDat(unsigned char add,unsigned char dat)
{
TM_Start();
Write_TM_Byte(add);//显存地址
TM_Ack();
Write_TM_Byte(dat);//显示数据
TM_Ack();
TM_Stop();
}
1
2
3
4
5
6
7
8
9
10
TM1650写命令:

/*********************TM1650写命令************************************/
void TM_WrCmd(unsigned char Bri)
{
TM_Start();
Write_TM_Byte(0x48);//显示模式
TM_Ack();
Write_TM_Byte(Bri);
TM_Ack();
TM_Stop();
}
1
2
3
4
5
6
7
8
9
10
TM1650初始化:

/*********************TM1650初始化************************************/
void TM_Init()
{
TM_WrCmd(0x11);//1级亮度//8段显示//开显示
TM_WrDat(0x68,0xff);//DIG1
TM_WrDat(0x6a,0xff);//DIG2
TM_WrDat(0x6c,0xff);//DIG3
TM_WrDat(0x6e,0xff);//DIG4
}
1
2
3
4
5
6
7
8
9
TM1650显示(可自行修改):

/*********************TM1650显示**************************************/
void Dis_TM(unsigned char dig1,unsigned char dig2,unsigned char dig3,unsigned char dig4)
{
TM_WrDat(0x68,dig1);//DIG1
TM_WrDat(0x6a,dig2);//DIG2
TM_WrDat(0x6c,dig3);//DIG3
TM_WrDat(0x6e,dig4);//DIG4
}
1
2
3
4
5
6
7
8
TM1650读按键:

/*********************TM1650读按键************************************/
void TM_ReCmd()
{
TM_Start();
Write_TM_Byte(0x49);//读取模式
TM_Ack();
key_data = Read_TM_Byte();//读取键盘扫描码
TM_Ack();
TM_Stop();
}
1
2
3
4
5
6
7
8
9
10
TM1650读处理(显示键盘扫描码和显示按键位置二选一)
显示键盘扫描码:

/*********************TM1650读处理************************************/
void Read_TM()
{
//数码管显示键盘扫描码
unsigned char a = 0;
unsigned char b = 0;
unsigned char c = 0;

TM_ReCmd();//TM1650读按键

a = key_data/100;
b = key_data/10%10;
c = key_data%10;
Dis_TM(dig1[0],dig1[a],dig1[b],dig2[c]); //数码管显示键盘扫描码
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
显示按键位置:

/*********************TM1650读处理************************************/
void Read_TM()
{
//数码管显示按键位置
unsigned char a = 0;
unsigned char b = 0;

TM_ReCmd();//TM1650读按键

switch(key_data)
{
//第一行
case 0x44: a = 1; b = 1; break;
case 0x4c: a = 1; b = 2; break;
case 0x54: a = 1; b = 3; break;
case 0x5c: a = 1; b = 4; break;
case 0x64: a = 1; b = 5; break;
case 0x6c: a = 1; b = 6; break;
case 0x74: a = 1; b = 7; break;

//第二行
case 0x45: a = 2; b = 1; break;
case 0x4d: a = 2; b = 2; break;
case 0x55: a = 2; b = 3; break;
case 0x5d: a = 2; b = 4; break;
case 0x65: a = 2; b = 5; break;
case 0x6d: a = 2; b = 6; break;
case 0x75: a = 2; b = 7; break;

//第三行
case 0x46: a = 3; b = 1; break;
case 0x4e: a = 3; b = 2; break;
case 0x56: a = 3; b = 3; break;
case 0x5e: a = 3; b = 4; break;
case 0x66: a = 3; b = 5; break;
case 0x6e: a = 3; b = 6; break;
case 0x76: a = 3; b = 7; break;

//第四行
case 0x47: a = 4; b = 1; break;
case 0x4f: a = 4; b = 2; break;
case 0x57: a = 4; b = 3; break;
case 0x5f: a = 4; b = 4; break;
case 0x67: a = 4; b = 5; break;
case 0x6f: a = 4; b = 6; break;
case 0x77: a = 4; b = 7; break;

default: a = 0; b = 0; break;
}

Dis_TM(0x00,dig1[a],dig1[10],dig2[b]); //数码管显示按键位置
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
TM1650延时函数:

/*********************TM1650驱动程序用的延时程序************************************/
void Delay1us_TM() //@24.000MHz
{
unsigned char i;

i = 6;
while (--i);
}


void Delay5us_TM() //@24.000MHz
{
unsigned char i;

i = 38;
while (--i);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2、H文件
#ifndef _TM1650_H_
#define _TM1650_H_
/*************************************************/
//数码管显示数组
extern unsigned char code dig1[11]; //无小数点
extern unsigned char code dig2[11]; //有小数点
extern unsigned char key_data; //键盘扫描码

//TM1650延时函数
void Delay1us_TM(); //@24.000MHz
void Delay5us_TM(); //@24.000MHz

//TM1650外调函数
void TM_Init();//TM1650初始化
void Dis_TM(unsigned char dig1,unsigned char dig2,unsigned char dig3,unsigned char dig4);//TM1650四位显示
void Read_TM();//TM1650读处理

/*************************************************/
#endif
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
三、结束语
该代码测试运行环境:
基于51单片机
主控:STC8G1K17
晶振:24Mhz(内部晶振)
主板:控制板-2-20mm-V4.0

哔哩哔哩演示视频:TM1650数码管显示及按键扫描

哔哩哔哩:风筝见证-雪夜
单片机QQ交流群:210560687
欢迎大家加入,一起交流学习,一起进步
————————————————
版权声明:本文为CSDN博主「风筝见证-雪夜」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/GUDU548/article/details/122139188

posted @ 2022-12-04 10:30  苍月代表我  阅读(3937)  评论(0)    收藏  举报