基于STM32的常用数码管芯片TM1650驱动

店家给的是51或者arduino的,花了点时间移植一下;

IIC协议这里就不多说了;

使用模拟IIC口 定义B12 B13

#define AnalonSDA_Pin GPIO_PIN_12
#define AnalonSDA_GPIO_Port GPIOB
#define AnalonSCL_Pin GPIO_PIN_13
#define AnalonSCL_GPIO_Port GPIOB

IO配置为输出

  /*Configure GPIO pin Output Level */
  HAL_GPIO_WritePin(GPIOB, AnalonSDA_Pin|AnalonSCL_Pin|BIG_SDA_Pin|BIG_SCL_Pin, GPIO_PIN_RESET);
  /*Configure GPIO pins : PBPin PBPin */
  GPIO_InitStruct.Pin = AnalonSDA_Pin|AnalonSCL_Pin|BIG_SDA_Pin|BIG_SCL_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
驱动程序
void displayData(uint8_t iData,uint8_t tab)
{
  int i;
  int itemp;
  itemp = iData;
  for(i=2;i>=0;i--)
  {
 
    {
      Write_DATA(0x68+2*i,tabForDisplay[itemp%10]|0x80);  //显示小数点
    }
 
    itemp = itemp/10;
  }
}
void TM1650_start()
{
 {
  HAL_GPIO_WritePin(AnalonSCL_GPIO_Port, AnalonSCL_Pin, GPIO_PIN_SET);
  HAL_GPIO_WritePin(AnalonSDA_GPIO_Port, AnalonSDA_Pin, GPIO_PIN_SET);
  HAL_Delay(1);
  HAL_GPIO_WritePin(AnalonSDA_GPIO_Port, AnalonSDA_Pin, GPIO_PIN_RESET);
  HAL_Delay(1);
 }
}
void TM1650_stop()
{
 {
  HAL_GPIO_WritePin(AnalonSCL_GPIO_Port, AnalonSCL_Pin, GPIO_PIN_SET);
  HAL_GPIO_WritePin(AnalonSDA_GPIO_Port, AnalonSDA_Pin, GPIO_PIN_RESET);
  HAL_Delay(1);
  HAL_GPIO_WritePin(AnalonSDA_GPIO_Port, AnalonSDA_Pin, GPIO_PIN_SET);
  HAL_Delay(1);
 }
}
void TM1650_ACK()
{
 GPIO_InitTypeDef GPIO_InitStruct;
 {
   HAL_GPIO_WritePin(AnalonSCL_GPIO_Port, AnalonSCL_Pin, GPIO_PIN_SET);
   GPIO_InitStruct.Pin = AnalonSDA_Pin;
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
   HAL_Delay(1);
  HAL_GPIO_WritePin(AnalonSCL_GPIO_Port, AnalonSCL_Pin, GPIO_PIN_RESET);
  HAL_Delay(1);
  GPIO_InitStruct.Pin = AnalonSDA_Pin;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  HAL_Delay(1);
 }
}
void TM1650_Write(unsigned char  DATA)     //写数据函数
{
 GPIO_InitTypeDef GPIO_InitStruct;
  unsigned char i;
  GPIO_InitStruct.Pin = AnalonSDA_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
  HAL_Delay(1);
  HAL_GPIO_WritePin(AnalonSCL_GPIO_Port, AnalonSCL_Pin, GPIO_PIN_RESET);
  for(i=0;i<8;i++)
  {
    if(DATA&0X80)
      HAL_GPIO_WritePin(AnalonSDA_GPIO_Port, AnalonSDA_Pin, GPIO_PIN_SET);
    else
      HAL_GPIO_WritePin(AnalonSDA_GPIO_Port, AnalonSDA_Pin, GPIO_PIN_RESET);
    DATA<<=1;
    HAL_GPIO_WritePin(AnalonSCL_GPIO_Port, AnalonSCL_Pin, GPIO_PIN_RESET);
    HAL_Delay(1);
    HAL_GPIO_WritePin(AnalonSCL_GPIO_Port, AnalonSCL_Pin, GPIO_PIN_SET);
    HAL_Delay(1);
    HAL_GPIO_WritePin(AnalonSCL_GPIO_Port, AnalonSCL_Pin, GPIO_PIN_RESET);
    HAL_Delay(1);
  }
}
void Write_DATA(unsigned char add,uint8_t DATA)    //指定地址写入数据
{
  TM1650_start();
  TM1650_Write(add);
  TM1650_ACK();
  TM1650_Write(DATA);
  TM1650_ACK();
  TM1650_stop();
}
因为博主使用freertos 所以在测试任务里面调用
void StartDefaultTask(void const * argument)
{
  /* USER CODE BEGIN StartDefaultTask */
 unsigned char i,j; 
 Write_DATA(0x48,0x31);
  /* Infinite loop */
  for(;;)
  {
    //根据发送来的数值在数码管显示
    for(i=0;i<16;i++)
  {
   for(j=0;j<4;j++)
    {
     Write_DATA(0x68+2*j,tabForDisplay[(j+i)%10]|0x80);
    }
   HAL_Delay(500);
  }
  osDelay(1);
  
  }
  /* USER CODE END StartDefaultTask */
}
依次显示1234  2345  4567。。。

猜你喜欢

转载自blog.csdn.net/baidu_25505611/article/details/79198100