本帖最后由 lmn2005 于 2023-5-10 19:23 编辑
本人参考https://bbs.21ic.com/icview-3060796-1-1.html一文,用CH32V103驱动TM1637数码管成功,代码很简单,望各位大佬勿喷。
TM1637.h:
#ifndef __TM1637_H__
#define __TM1637_H__
#include "ch32v10x_conf.h"
#define TM1637_DIO_H GPIO_SetBits(GPIOA,GPIO_Pin_1) //配置SDA接口高电平
#define TM1637_DIO_L GPIO_ResetBits(GPIOA,GPIO_Pin_1) //配置SDA接口低电平
#define TM1637_CLK_H GPIO_SetBits(GPIOA,GPIO_Pin_2) //配置SCL接口高电平
#define TM1637_CLK_L GPIO_ResetBits(GPIOA,GPIO_Pin_2) //配置SCL接口低电平
#define TM1637_SDA_READ() GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1) //读SDA口线状态
void TM1637_Init(void); //初始化TM1637引脚
void TM1637_start(void); // IIC开始
void TM1637_ack(void); // IIC应答
void TM1637_stop(void); // IIC停止
void TM1637_Write(unsigned char DATA); // 写数据函数
void TM1637_SetBRI(unsigned char i); // 设置亮度
void TM1637_display(unsigned char a, unsigned char b,
unsigned char c, unsigned char d); // 按顺序显示
#endif
TM1637.c:
#include "TM1637.h"
unsigned char tab[] =
{
0x3F, /*0*/
0x06, /*1*/
0x5B, /*2*/
0x4F, /*3*/
0x66, /*4*/
0x6D, /*5*/
0x7D, /*6*/
0x07, /*7*/
0x7F, /*8*/
0x6F, /*9*/
0x77, /*10 A*/
0x7C, /*11 b*/
0x58, /*12 c*/
0x5E, /*13 d*/
0x79, /*14 E*/
0x71, /*15 F*/
0x76, /*16 H*/
0x38, /*17 L*/
0x54, /*18 n*/
0x73, /*19 P*/
0x3E, /*20 U*/
};
void TM1637_Init(void)//初始化TM1637引脚
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE );
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_2;//使用PA1和PA2作为模拟IIC引脚,PA1对应SDA,PA2对应SCL
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP ; //推挽输出模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//IIC_Idle_State();
}
void TM1637_start(void) // IIC开始
{
TM1637_CLK_H;
TM1637_DIO_H;
Delay_Us(2);
TM1637_DIO_L;
}
void TM1637_ack(void) // IIC应答
{
u8 i=0;
TM1637_CLK_L;
Delay_Us(5);
TM1637_CLK_H;
while (TM1637_SDA_READ() == 1 && (i < 250))
i++;
TM1637_CLK_H;
Delay_Us(2);
TM1637_CLK_L;
}
void TM1637_stop(void) // IIC停止
{
TM1637_CLK_L;
Delay_Us(2);
TM1637_DIO_L;
Delay_Us(2);
TM1637_CLK_H;
Delay_Us(2);
TM1637_DIO_H;
Delay_Us(2);
}
void TM1637_Write(unsigned char DATA) // 写数据函数
{
unsigned char i;
for (i = 0; i < 8; i++)
{
TM1637_CLK_L;
if (DATA & 0x01)
TM1637_DIO_H;
else
TM1637_DIO_L;
Delay_Us(2);
DATA = DATA >> 1;
TM1637_CLK_H;
Delay_Us(2);
}
// TM1637_ack();
}
void TM1637_display(unsigned char a, unsigned char b, unsigned char c, unsigned char d) // 按顺序显示
{
TM1637_start();
TM1637_Write(0x40);
TM1637_ack();
TM1637_stop();
TM1637_start();
TM1637_Write(0xc0);
TM1637_ack();
TM1637_Write(tab[a]);
TM1637_ack();
TM1637_Write(tab[b]);
TM1637_ack();
TM1637_Write(tab[c]);
TM1637_ack();
TM1637_Write(tab[d]);
TM1637_ack();
TM1637_stop();
}
void TM1637_SetBRI(unsigned char i) // 设置亮度
{
TM1637_start();
TM1637_Write(0x87 + i);
TM1637_ack();
TM1637_stop();
}
|