IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> STM32模拟IO控制TM1638驱动数码管 -> 正文阅读

[嵌入式]STM32模拟IO控制TM1638驱动数码管

芯片:STM32F103C8T6、TM1638
驱动方式:模拟IO(需要驱动88个数码管,每个TM1638可以驱动8个数码管,一共需要11个TM1638芯片,需要11个IO口)
数码管:共阴方式



前言

TM1638数据手册的解读可以参考[文章](https://blog.csdn.net/qq_39829913/article/details/104661381),写得非常详细,相信可以帮助新手理解,我这篇文章主要是想给出一个工程的例子。

一、项目详情

1、引脚连接

STM32
PA5–>TM1638_CLK;
PA7–>TM1638_DIO;
PB0–>STB_1
PB1–>STB_2

依次连接11个TM1638芯片;
TM1638
SEG1~10:连接数码管的对应引脚;
GRID1~8:连接两个TM1638的对应引脚;
2、实现效果
编写了一个动画,具体看后面介绍。

二、代码

1.所用结构体和数组

/* 一共有11块数码管芯片   控制88个数码管*/
#define NUM_OF_TMCHIP   11
#define NUM_OF_SEGLED   88

/* 数码管的段码表*/
const uint8_t CODE[17]={
/*   0    1    2    3    4    5    6    7    8    9  */
  0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,
/*   A    B    C    D    E    F*/
  0x77,0x7C,0x39,0x5E,0x79,0x71,0x00
};

  /*   颜色的段码表  */
const uint8_t COLOR[8]={ 
/* 无   绿   蓝  淡蓝  红   黄  粉色  白   */
  0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
};

/*定义片选引脚结构*/
typedef struct NSS_IO{ 
  GPIO_TypeDef * NSS_Port;
  uint16_t NSS_PIN;
}NSS_IO_t;

/*TM1638片选引脚列表*/    
static NSS_IO_t NSS_List[NUM_OF_TMCHIP]={ 
{SEGLED_STB1_GPIO_Port,SEGLED_STB1_Pin},
{SEGLED_STB2_GPIO_Port,SEGLED_STB2_Pin},
{SEGLED_STB3_GPIO_Port,SEGLED_STB3_Pin},
{SEGLED_STB4_GPIO_Port,SEGLED_STB4_Pin},
{SEGLED_STB5_GPIO_Port,SEGLED_STB5_Pin},
{SEGLED_STB6_GPIO_Port,SEGLED_STB6_Pin},
{SEGLED_STB7_GPIO_Port,SEGLED_STB7_Pin},
{SEGLED_STB8_GPIO_Port,SEGLED_STB8_Pin},
{SEGLED_STB9_GPIO_Port,SEGLED_STB9_Pin},
{SEGLED_STB10_GPIO_Port,SEGLED_STB10_Pin},
{SEGLED_STB11_GPIO_Port,SEGLED_STB11_Pin},
};

2.函数

void TM1638_GPIO_Init()
{
  GPIO_InitTypeDef  GPIO_InitStructure;
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB, ENABLE);	//使能PA,PB端口时钟
	 
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;			   //PB0    STB_1
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 	
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;	 
  GPIO_Init(GPIOB, &GPIO_InitStructure);			    
  GPIO_SetBits(GPIOB,GPIO_Pin_0);					   //PB.0 输出高
	 
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;	           //PB1  STB_2
  GPIO_Init(GPIOB, &GPIO_InitStructure);	  	    
  GPIO_SetBits(GPIOB,GPIO_Pin_1); 			   		  //PB.1 输出高 	  
	 
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;	          //PA7  DIO
  GPIO_Init(GPIOA, &GPIO_InitStructure);	  	    

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;	          //PA5  CLK
  GPIO_Init(GPIOA, &GPIO_InitStructure);	  	 
}

GPIO初始化。

//写入一个字节
void Write_Byte(u8 byte)
{
	u8 i;
	u8 temp;
	temp=byte;
	
	for(i=0;i<8;i++)
	{
		GPIO_ResetBits(SEGLED_SCLK_GPIO_Port,SEGLED_SCLK_Pin);     //CLK=0
		delay_us(3);
		
		if(temp & 0x01)  GPIO_SetBits(SEGLED_DIO_GPIO_Port,SEGLED_DIO_Pin);    //DIO=1;
		else GPIO_ResetBits(SEGLED_DIO_GPIO_Port,SEGLED_DIO_Pin);							//DIO=0;
		delay_us(3);
		
		GPIO_SetBits(SEGLED_SCLK_GPIO_Port,SEGLED_SCLK_Pin);	//CLK=1 读取DIO的电平
		
		delay_us(3);
		temp >>= 1;
	}
}
//写入一个命令(一个字节)
void Write_Cmd(GPIO_TypeDef* NSS_Port, uint16_t NSS_PIN, u8 cmd)
{
		GPIO_SetBits(NSS_Port,NSS_PIN);							  //STB_x=1;
		delay_us(3);
		GPIO_ResetBits(NSS_Port,NSS_PIN);						//STB_x=0;
		delay_us(3);
		Write_Byte(cmd);
}

STB先拉高,再拉低,就可以开始写入数据或命令了。

//在指定地址处,写入两个字节的数据
void 	Write_Data(GPIO_TypeDef* NSS_Port, uint16_t NSS_PIN, u8 addr, u8 data, u8 data2 )
{
	Write_Cmd(NSS_Port, NSS_PIN, 0x8F);     					//显示控制设置,亮度为0x07H;
	Write_Cmd(NSS_Port, NSS_PIN, 0x40);     					//数据命令设置,自动地址增加
	Write_Cmd(NSS_Port, NSS_PIN, 0xC0 | addr);				//地址命令设置,起始地址为0x00H
	Write_Byte(data);
	Write_Byte(data2);
	delay_us(3);
	GPIO_SetBits(NSS_Port,NSS_PIN);	   								//STB_1=1;
}

根据数据手册的流程图,先写入若干命令。

//在TM1638写入两个字节的数据(确定第几个数码管,显示的数字、颜色)
void TM1638_SendData(u8 chipNum, u8 data, u8 data2)
{
	u8 temp;
	temp=data2;
	temp=temp>>2;
	temp=temp<<7;
	Write_Data(NSS_List[chipNum/8].NSS_Port,  NSS_List[chipNum/8].NSS_PIN, chipNum%8*2, data |temp ,data2 & 0x03);
}

此函数用于在指定的数码管显示数字和颜色。

void TM1638_clear(void)
{
	u8 i;
	for(i=0;i<NUM_OF_SEGLED;i++)
	{
		TM1638_SendData(i,0x00,0x00);
	}
}

用于数码管清零。

//动画效果
void TM1638_SHOW()
{
	TM1638_clear();
	u8 i;
	
	for(i=0;i<=3;i++)
	{
		TM1638_SendData(i,CODE[5],Color_LessBlue);
		delay_ms(40);
	}
	delay_ms(1000);
	TM1638_clear();
	for(i=4;i<=7;i++)
	{
		TM1638_SendData(i,CODE[4],Color_Blue);
		delay_ms(40);
	}
	delay_ms(1000);
	TM1638_clear();
	for(i=8;i<=11;i++)
	{
		TM1638_SendData(i,CODE[3],Color_Green);
		delay_ms(40);
	}
	delay_ms(1000);
	TM1638_clear();
	for(i=12;i<=15;i++)
	{
		TM1638_SendData(i,CODE[2],Color_Pink);
		delay_ms(40);
	}
	delay_ms(1000);
	TM1638_clear();
	for(i=0;i<=15;i++)
	{
		TM1638_SendData(i,CODE[1],COLOR[i%7+1]);
		delay_ms(60);
	}
	delay_ms(1000);
	TM1638_clear();
	
	for(i=0;i<=15;i++)
	{
		TM1638_SendData(i,0x00,Color_Blue);
		TM1638_SendData(15-i,0x00,Color_Green);
		delay_ms(60);
		TM1638_clear();
		delay_ms(10);
	}
		for(i=0;i<=15;i++)
	{
		TM1638_SendData(i,0x00,COLOR[i%7+1]);
		TM1638_SendData(15-i,0x00,COLOR[i%7+1]);
		delay_ms(60);
		TM1638_clear();
		delay_ms(10);
	}
}

编写了一个动画效果:首先是5、4、3、2、1的倒计时,然后彩色的灯同时从左到右、从右到左循环两次。
实现效果如下:

TM1638驱动数码管动态效果


总结

网上的资料质量参差不齐,希望这篇文章对大家学习TM1638有所帮助。

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-07-23 10:57:52  更:2021-07-23 10:58:12 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 18:17:04-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码