前者是 移位寄存器
https://blog.csdn.net/weixin_41445387/article/details/80500046
可以百度 595数码管
是我写的第一个驱动
后者是IIC的 https://item.taobao.com/item.htm?spm=a1z09.2.0.0.1d192e8dn3Zepv&id=40127496123&_u=dvcquvh808b
开始写
https://blog.csdn.net/Tesla_0/article/details/86662224
基于涂鸦的那个吧 刚刚做的STM32
很快成功
1--准备US延时 用TIM1
2--准备GPIO就是正常LED
3--加入软件IIC时许 就是上面文章
测试OK 现在准备看文档吧
$ git remote -v
origin git@github.com:GKoSon/tuyago.git (fetch)
origin git@github.com:GKoSon/tuyago.git (push)
#include "TM1637.h"
#include "main.h"
#define Delay_Us TIM1_Delay
unsigned char Data[] ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsigned char DataDp[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};
struct {
char shi;
char ge;
}Hour;
struct {
char shi;
char ge;
}Min;
void GPIO_Config(void)
{
/* GPIO_InitStruct.Pin = LED_Pin|SCL_Pin|SDA_Pin */
}
/*
时钟线为高时,数据线由高变低
*/
void I2C_Start(void)
{
CLK_1;
DIO_1;
Delay_Us(140);
DIO_0;
Delay_Us(140);
CLK_0;
Delay_Us(140);
}
/*
*时钟线为高时,数据线由低变高
*/
void I2C_stop(void)
{
CLK_0;
Delay_Us(140);
DIO_0;
Delay_Us(140);
CLK_1;
Delay_Us(140);
DIO_1;
Delay_Us(140);
}
//写一个比特位
void TM1637_WriteBit(unsigned char mBit)
{
CLK_0;
Delay_Us(140);
if(mBit)
DIO_1;
else
DIO_0;
Delay_Us(140);
CLK_1;
Delay_Us(140);
}
//写一个字节
void TM1637_WriteByte(unsigned char Byte)
{
char loop = 0;
for(loop = 0;loop<8;loop++)
{
TM1637_WriteBit((Byte>>loop) & 0x01);//先写低位
}
CLK_0;
Delay_Us(140);
DIO_1;
Delay_Us(140);
CLK_1;
Delay_Us(140);
while(HAL_GPIO_ReadPin(TM_DIO_PORT ,TM_DIO_PIN) == GPIO_PIN_SET);
//等待应答信号
}
/*
*写指令函数
*B7:B6 =01 数据命令控制
* 11地址命令控制
* 10显示命令控制
*/
void TM1637_WriteCommand(unsigned char mData)
{
I2C_Start();
TM1637_WriteByte(mData);
I2C_stop();
}
/*
*@note 写入地址和数据
*/
void TM1637_WriteData(unsigned char addr,unsigned char mData)
{
I2C_Start();
TM1637_WriteByte(addr);
TM1637_WriteByte(mData);
I2C_stop();
}
/*
控制显示,配置好数据结构体之后,直接调用该函数就可以显示
*/
void Time_Display(void)
{
Hour.shi = 4;
Hour.ge = 5;
Min.shi = 6;
Min.ge = 7;
TM1637_WriteCommand(0x44);
TM1637_WriteData(0xc0,Data[Hour.shi]);
TM1637_WriteData(0xc1,DataDp[Hour.ge]);
TM1637_WriteData(0xc2, Data[Min.shi]);
TM1637_WriteData(0xc3, Data[Min.ge]);
TM1637_WriteCommand(0x8a);
}
#ifndef _TM1637_H
#define _TM1637_H
#include "gpio.h"
//PB10(SCL),PB11(SDA)
//#define SCL_Pin GPIO_PIN_10
//#define SCL_GPIO_Port GPIOB
//#define SDA_Pin GPIO_PIN_11
//#define SDA_GPIO_Port GPIOB
//DIO和CLK相关引脚的宏定义,用户只需要修改相关宏即可
#define TM_DIO_PORT GPIOB
#define TM_DIO_PIN GPIO_PIN_11
#define TM_CLK_PORT GPIOB
#define TM_CLK_PIN GPIO_PIN_10
//时钟线和数据线高低电平的宏定义,不需修改
#define CLK_1 HAL_GPIO_WritePin(TM_CLK_PORT,TM_CLK_PIN,GPIO_PIN_SET)
#define CLK_0 HAL_GPIO_WritePin(TM_CLK_PORT,TM_CLK_PIN,GPIO_PIN_RESET)
#define DIO_1 HAL_GPIO_WritePin(TM_DIO_PORT,TM_DIO_PIN,GPIO_PIN_SET)
#define DIO_0 HAL_GPIO_WritePin(TM_DIO_PORT,TM_DIO_PIN,GPIO_PIN_RESET)
//相关函数声明
void GPIO_Config(void);
void I2C_Start(void);
void I2C_stop(void);
void TM1637_WriteBit(unsigned char mBit);
void TM1637_WriteByte(unsigned char Byte);
void TM1637_WriteCommand(unsigned char mData);
void TM1637_WriteData(unsigned char addr,unsigned char mData);
void Time_Display(void);
#endif /* _TM1673_H*/
/*********************************************END OF FILE**********************/
阅读规格书
果然OFF 亮度 都可以了
void Time_Display_OFF(void)
{
TM1637_WriteCommand(0x80);
}
/*
0x80==off
0x88
0x89
0x8a
0x8b
ox8c
0x8d
0x8e
0x8f
*/
void Time_Display_LEV(unsigned char lev)
{
TM1637_WriteCommand(lev);
}
#include "TM1637.h"
#include "tuyamodeuart.h"
extern void Time_Display_LEV(unsigned char lev);
uint8_t lev[]={
0x80,
0x88,
0x89,
0x8a,
0x8b,
0x8c,
0x8d,
0x8e,
0x8f,
};
int i=0;
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_TIM1_Init();
MX_TIM2_Init();
MX_USART1_UART_Init();
MX_USART2_UART_Init();
/* USER CODE BEGIN 2 */
TSET_TIMER();
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
tuyamode_init();
SHOWME
Time_Display();
while (1)
{
/* USER CODE END WHILE */
//TEST_LOOP_IO();
//TEST_UARTTXRX();
HAL_Delay(500);
Time_Display_LEV(lev[i]);
if(++i==sizeof(lev))i=0;
3.3+gnd
B11 B10