店家给的是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。。。