目錄
- 一.芯片簡介
- 二.模塊介紹
- 三.代碼實作
- 1)一些說明
- 2)上代碼
- 四.文末
一.芯片簡介
| TM1638是帶鍵盤掃描介面的LED(發光二極管顯示幕)驅動控制專用電路,內部集成有MCU 數字介面、資料鎖存器、LED 高壓驅動、鍵盤掃描等電路,主要應用于冰箱、空調 、家庭影院等產品的高段位顯示屏驅動, |
|---|
| ? 采用功率CMOS 工藝 ? 顯示模式 10 段×8 位 ? 鍵掃描(8×3bit)? 輝度調節電路(占空比8 級可調) |
| ? 串行介面(CLK,STB,DIO) ? 振蕩方式:RC 振蕩(450KHz+5%) ? 內置上電復位電路 ? 采用SOP28封裝 |
更多詳細資料請下載TM1638官網資料手冊
二.模塊介紹
- 八位數碼管,八個發光二極管,八個按鍵(這個模塊真吉利)
- 左側引出VCC-GND-STB-CLK-DIO五個引腳

- 平臺用的是手頭的STM32F103C8T6最小系統板,J-Link下載器

三.代碼實作
1)一些說明
- 通過學習其他博主對于該芯片的講解的相關代碼1,我進行了整合與修改,加入了自己的一些元素,部分邏輯我進行了優化,使代碼執行效率提高,但也有不足的地方,還請大家指正,
- TM1638_Display_Num()函式這里的參量可以優化成字串型別的,然后在函式內部利用C語言字串相關函式進行串的相關轉換,這里我就不做了,大家有興趣可以試一下,
2)上代碼
- TM1638.h
#ifndef _TM1638_H_
#define _TM1638_H_
/**
***************************************************************************************
* TM1638模塊功能實作源檔案
* 硬體連接:PA5--STB,PA6--CLK,PA7--DIO
* 創建人:郭凱瑞_carry
* 最后修改時間:2021-2-26
***************************************************************************************
**/
#include "stm32f10x.h"
typedef enum {N = 0x00, Y = 0x80} PointState; //是否帶小數點 Y:帶,N:不帶
typedef enum {OFF = 0x00, ON = 0x01} LightState; //燈開關狀態 On:開,Off:關
//TM1638模塊相關引腳定義
#define STB GPIO_Pin_5
#define CLK GPIO_Pin_6
#define DIO GPIO_Pin_7
#define GPIO_TM1638 GPIOA
#define GPIO_Pin_TM1638 STB|CLK|DIO
#define RCC_TM1638 RCC_APB2Periph_GPIOA
//引腳高低電平設定
#define STB_0() GPIO_ResetBits(GPIO_TM1638,STB)
#define STB_1() GPIO_SetBits(GPIO_TM1638,STB)
#define CLK_0() GPIO_ResetBits(GPIO_TM1638,CLK)
#define CLK_1() GPIO_SetBits(GPIO_TM1638,CLK)
#define DIO_0() GPIO_ResetBits(GPIO_TM1638,DIO)
#define DIO_1() GPIO_SetBits(GPIO_TM1638,DIO)
#define DIO_Read() GPIO_ReadInputDataBit(GPIO_TM1638,DIO)
//用戶層函式
void TM1638_Init(void); //TM1638初始化函式
void TM1638_Display_Num(u32 data); //顯示數字
void TM1638_Display_SEG(unsigned int num,unsigned char seg,PointState p); //選擇數碼管顯示0-F
void TM1638_Display_LED(unsigned int num,LightState light); //指定led亮滅
unsigned char TM1638_ReadKey(void); //TM1638讀鍵掃資料函式
void TM1638_SEG_Off(unsigned char num); //TM1638關閉指定數碼管函式
void TM1638_Clear(void); //TM1638全清
//底層函式
void TM1638_Write_Byte(u8 byte); //TM1638單寫資料,需要在函式外對STB操作
void TM1638_Write_Data(u8 data); //TM1638一個完整資料寫入
void TM1638_Write_Addr_Bond(u8 addr,u8 data); //TM1638指定地址寫入資料
unsigned char TM1638_Read(void); //TM1638讀資料函式
void TM1638_GPIO_Init(void); //TM1638引腳初始化函式
#endif
- TM1638.c
/**
***************************************************************************************
* TM1638模塊功能實作源檔案
* 硬體連接:PA5--STB,PA6--CLK,PA7--DIO
* 創建人:郭凱瑞_carry
* 最后修改時間:2021-2-26
***************************************************************************************
**/
#include "stm32f10x.h" //stm32f10x系列芯片頭檔案
#include "TM1638.h" //tm1638模塊實作頭檔案
unsigned char TM1638_Arr_SEG[]= {0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07, //共陰極數碼管段碼,不帶小數點
0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87, //共陰極數碼管段碼,帶小數點
0xFF,0xEF,0xF7,0xFC,0xB9,0xDE,0xF9,0xF1
}; //0~F,1亮0滅
//共陰極數碼管段碼,不帶小數點,display函式用
unsigned char TM1638_Arr_SEG_Display[]= { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0,0x3F,0x06,0x5B,0x4F,//0-9
0x66,0x6D,0x7D,0x07,0x7F,0x6F, 0, 0, 0, 0,
0, 0, 0,0x77,0x7C,0x39,0x5E,0x79,0x71, 0
};
u8 TM1638_Addr_SEG[8]= {0xC0,0xC2,0xC4,0xC6,0xC8,0xCA,0xCC,0xCE}; //模塊從右到左的八個數碼管
u8 TM1638_Addr_LED[8]= {0xC1,0xC3,0xC5,0xC7,0xC9,0xCB,0xCD,0xCF}; //模塊從右到左的八個發光二極管
void TM1638_Write_Byte(u8 byte) //TM1638單寫資料
{
u8 i;
for(i=0; i<8; i++)
{
CLK_0(); //CLK=0
if(byte&0x01)
{
DIO_1(); //DIO=1
}
else
{
DIO_0(); //DIO=0
}
byte>>=1;
CLK_1(); //CLK=1
}
}
/***************************************************************************************/
/**
* TM1638寫資料/命令函式
* 引數:data:要寫入的8位資料
* 回傳值:無
*/
void TM1638_Write_Data(u8 data) //TM1638寫資料函式
{
STB_0();
TM1638_Write_Byte(data);
STB_1();
}
void (*TM1638_Write_Cmd)(u8)=TM1638_Write_Data;//給函式起一個別名,函式指標
/***************************************************************************************/
/***************************************************************************************/
/**
* TM1638寫地址+數碼組合函式,用于固定地址顯示
* 引數:cmd:要寫入的8位資料
* 回傳值:無
*/
void TM1638_Write_Addr_Bond(u8 addr,u8 data) //TM1638寫資料函式
{
STB_0();
TM1638_Write_Byte(addr);
TM1638_Write_Byte(data);
STB_1();
}
/***************************************************************************************/
/***************************************************************************************/
/**
* TM1638固定地址顯示函式
* 引數1:data:寫入的數字,長度八位
* 回傳值:無
*/
void TM1638_Display_Num(u32 data)
{
unsigned int dataL=0,dataR=0;
dataL=data/10000;
dataR=data%10000;
TM1638_Write_Cmd(0x44);//固定地址,寫資料
TM1638_Write_Cmd(0x88);//顯示開,亮度1
TM1638_Write_Addr_Bond(TM1638_Addr_SEG[0],TM1638_Arr_SEG[dataL/1000]);
TM1638_Write_Addr_Bond(TM1638_Addr_SEG[1],TM1638_Arr_SEG[dataL%1000/100]);
TM1638_Write_Addr_Bond(TM1638_Addr_SEG[2],TM1638_Arr_SEG[dataL%100/10]);
TM1638_Write_Addr_Bond(TM1638_Addr_SEG[3],TM1638_Arr_SEG[dataL%10]);
TM1638_Write_Addr_Bond(TM1638_Addr_SEG[4],TM1638_Arr_SEG[dataR/1000]);
TM1638_Write_Addr_Bond(TM1638_Addr_SEG[5],TM1638_Arr_SEG[dataR%1000/100]);
TM1638_Write_Addr_Bond(TM1638_Addr_SEG[6],TM1638_Arr_SEG[dataR%100/10]);
TM1638_Write_Addr_Bond(TM1638_Addr_SEG[7],TM1638_Arr_SEG[dataR%10]);
}
/***************************************************************************************/
/***************************************************************************************/
/**
* TM1638指定地址顯示數碼,0-F
* 引數1:num:數碼管位置12345678
* 引數2:seg:字符0-F
* 引數3:p:N/Y
* 回傳值:無
*/
void TM1638_Display_SEG(unsigned int num,unsigned char seg,PointState p)
{
TM1638_Write_Cmd(0x44);//固定地址,寫資料
TM1638_Write_Cmd(0x88);//顯示開,亮度1
TM1638_Write_Addr_Bond(TM1638_Addr_SEG[num-1],TM1638_Arr_SEG_Display[seg-32]|p);
}
/***************************************************************************************/
/***************************************************************************************/
/**
* TM1638指定LED亮滅
* 引數1:num:LED位置
* 引數2:light:OFF/ON
* 回傳值:無
*/
void TM1638_Display_LED(unsigned int num,LightState light)
{
TM1638_Write_Cmd(0x44);//固定地址,寫資料
TM1638_Write_Cmd(0x88);//顯示開,亮度1
TM1638_Write_Addr_Bond(TM1638_Addr_LED[num],light);
}
/***************************************************************************************/
/***************************************************************************************/
/**
* TM1638全清
* 引數1:無
* 回傳值:無
*/
void TM1638_Clear(void)
{
u8 i;
TM1638_Write_Data(0x44); //普通模式,固定地址,寫資料到顯示暫存器
TM1638_Write_Data(0x88); //顯示開,亮度第1級
for(i=0; i<16; i++)
{
TM1638_Write_Addr_Bond(0XC0+i,0X00); //全地址寫入0X00
}
}
/***************************************************************************************/
/***************************************************************************************/
/**
* TM1638關閉指定數碼管函式
* 引數:serial:數碼管序號1-8
* 回傳值:無
*/
void TM1638_SEG_Off(unsigned char num) //TM1638關閉指定數碼管函式
{
TM1638_Write_Cmd(0x44);//固定地址,寫資料
TM1638_Write_Cmd(0x88);//顯示開,亮度1
TM1638_Write_Addr_Bond(TM1638_Addr_SEG[num-1],0x80);
}
/***************************************************************************************/
/***************************************************************************************/
/**
* TM1638讀資料函式
* 引數:無
* 回傳值:讀取的8位資料
*/
unsigned char TM1638_Read(void) //讀資料函式
{
unsigned char i,data,temp=0;
DIO_1(); //DIO=1,設定為輸入
for(i=0; i<8; i++)
{
temp>>=1;
CLK_0(); //CLK=0
data = DIO_Read(); //讀取DIO值
if(data) temp|=0x80; //按位或:與0或不變、與1或置1
CLK_1(); //CLK=1
}
return temp;
}
/***************************************************************************************/
/***************************************************************************************/
/**
* TM1638讀鍵掃資料函式
* 引數:無
* 回傳值:讀取的按鍵號,1~8
*/
unsigned char TM1638_ReadKey(void) //TM1638讀鍵掃資料函式
{
unsigned char c[4],i,key_value=0;
STB_0(); //STB=0,開始寫命令
TM1638_Write_Byte(0x42); //普通模式,地址自動增加,讀鍵掃資料
for(i=0; i<4; i++) c[i]=TM1638_Read(); //讀取鍵值
STB_1(); //STB=1,讀鍵值結束
//資料處理
for(i=0; i<4; i++)
key_value|=c[i]<<i;
for(i=0; i<8; i++)
if((0x01<<i)==key_value) break;
return (i+1);//回傳按鍵值,與模塊上的相對應
}
/***************************************************************************************/
/***************************************************************************************/
/**
* TM1638-GPIO初始化函式
* 引數:無
* 回傳值:無
*/
void TM1638_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure; //GPIO引數設定結構體
RCC_APB2PeriphClockCmd(RCC_TM1638,ENABLE); //APB2外設時鐘使能:GPIOA
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_TM1638; //選定引腳
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //作業方式:推挽輸出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //最大速度50MHz
GPIO_Init(GPIO_TM1638, &GPIO_InitStructure); //初始化引腳
}
/***************************************************************************************/
/***************************************************************************************/
/**
* TM1638初始化函式
* 引數:無
* 回傳值:無
*/
void TM1638_Init(void) //TM1638初始化函式
{
TM1638_GPIO_Init();//GPIO初始化
TM1638_Clear();
}
/***************************************************************************************/
- main.h以及完整測驗工程已上傳,正在審核,粉絲們可以在這里下載,
四.文末
最后看一下效果圖吧,后面有時間再做一個看資料手冊寫模塊驅動的文章吧,最近忙比賽去了,

https://blog.csdn.net/qtyt567/article/details/79827436 ??
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/264567.html
標籤:其他
