您的位置:首页 > 大数据 > 人工智能

TM1650/AIP650数码管驱动显示STM32驱动程序HAL库

2020-06-07 11:46 561 查看

钉钉、微博极速扩容黑科技,点击观看阿里云弹性计算年度发布会!>>>

参考例程讲解

一、 Display显示DEMO:

1、 硬件:

 

 

 

图1.1 数码管模块原理图

    由图1.1可知MCU通过DAT&CLK(I2C)两个引脚去控制数码管驱动IC,从而达到控制数码管的显示;打开TM1650/AIP650规格书,

 

 

 

 

图1.2 控制命令

我们知道TM1650/AIP650可以通过显示命令控制控制数码管的显示。

 

 

 

图1.3显存地址

 

通过往显存地址里面写数据可以就可以实现数字&字母在数码管的显示效果。

 

 

 

图1.3完整的写显示时序

完整的写显示时序如图1.3所示。这就MCU& TM1650/AIP650的通信协议,也就是说,通过软件实现写显示时序,我们就能实现我们所要的显示效果,接下来请看软件部分

 

2、 软件:

/**
* @brief  The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */
u16 number=0;
/* 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 */
delay_init(72);
/* USER CODE END SysInit */

/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_USART1_UART_Init();
/* USER CODE BEGIN 2 */
delay_ms(500);

TM1650_Init();

printf("TM1650 Test Demo!\r\n");
/* USER CODE END 2 */

/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{

if(++number>9999)
{
number=0;
}
DisplayNumber_4BitDig(number);
DigitalScan();
printf("TM1650 Running:%d\r\n",number);
delay_ms(1000);

/* USER CODE END WHILE */

/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}

        打开我们的例程Display,找到main函数,while之前都是函数的初始化过程,while里面是我们实现的功能:通过数码管显示从0~9999变量number,并通过串口打印出来;要实现这样的一个功能,我们就需要初始化I2C接口和UART,我们的I2C是通过IO模拟的,所以我们初始化IO口即可,这部分代码不做讲解,不同MCU各有不同

我们的IO口定义如下

#define TM_DAT_Pin GPIO_PIN_0

#define TM_DAT_GPIO_Port GPIOB

#define TM_CLK_Pin GPIO_PIN_1

#define TM_CLK_GPIO_Port GPIOB

 

    接下来我们实现完整的写显示时序:

void TM1650_Init(void){

IIC_SCL=1;

IIC_SDA=1;

TM1650_SendCommand(0x48,0x71);

}

void TM1650_SendCommand(u8 CMD1,u8 CMD2)

{

IIC_Start();

IIC_Send_Byte(CMD1);

IIC_Wait_Ack();

IIC_Send_Byte(CMD2);

IIC_Wait_Ack();

IIC_Stop();

}

 

这个初始化过程是写显示时序中Commant1和Commant2,再接下来我们实现写显示时序中的往ADDRESS发送DATA即可:

我们通过DisplayNumber_4BitDig给四位数码管变量赋值(码表)

void DisplayNumber_4BitDig(u16 num)

{

Dig1_Data=Digital_Table[num/1000];

Dig2_Data=Digital_Table[num/100%10];

Dig3_Data=Digital_Table[num/10%10];

Dig4_Data=Digital_Table[num%10];

}

 

如需要显示小数点,如个位的小数点则Dig1_Data=Digital_Table[num/1000]&0x08;

码表是通过共阴极数码管的码表得来,我们的驱动IC可以直接驱动数码管,这里我们可以通过附件中的数码管工具得来,然后我们调用DigitalScan,通过Aip650_SendDigData函数给驱动IC的地址ADDRESS(DIG0~ DIG3)发送DATA(Dig1_Data~ Dig4_Data)

void DigitalScan( void )

{

Aip650_SendDigData(DIG0,Dig1_Data);

Aip650_SendDigData(DIG1,Dig2_Data);

Aip650_SendDigData(DIG2,Dig3_Data);

Aip650_SendDigData(DIG3,Dig4_Data);

}

 

void Aip650_SendDigData(u8 Dig,u8 Dat)

{

IIC_Start();

IIC_Send_Byte(Dig);

IIC_Wait_Ack();

IIC_Send_Byte(Dat);

IIC_Wait_Ack();

IIC_Stop();

}

 

至此软件部分到此结束;

3、 下载验证:(略)

 

二、 KEY按键扫描DEMO:(略)

1、 硬件:(略)

2、 软件:(略)

3、 下载验证:(略)

 

 

略略略:不是不讲,有时间再更

 

代码&模块资料完全公开,大家自行下载

链接:https://pan.baidu.com/s/1PbtRHr5zBTxIJVryTuwXqQ 
提取码:yw0h

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  dat