参考沁恒官方例程
tm1650.h
/*
* tm1650.h
* Author: armxu
*/
#ifndef USER_TM1650_H_
#define USER_TM1650_H_
#include "debug.h"
#define IIC_GPIO_CLK RCC_APB2Periph_GPIOC
#define SCL_SDA_PORT GPIOC
#define SCL_PIN GPIO_Pin_15
#define SDA_PIN GPIO_Pin_14
#define SDA_H GPIO_SetBits(SCL_SDA_PORT,SDA_PIN) //配置SDA接口高电平
#define SDA_L GPIO_ResetBits(SCL_SDA_PORT,SDA_PIN) //配置SDA接口低电平
#define SCL_H GPIO_SetBits(SCL_SDA_PORT,SCL_PIN) //配置SCL接口高电平
#define SCL_L GPIO_ResetBits(SCL_SDA_PORT,SCL_PIN) //配置SCL接口低电平
#define SDA_READ() GPIO_ReadInputDataBit(SCL_SDA_PORT, SDA_PIN) //读SDA口线状态
void GPIO_INIT(void);
void IIC_Idle_State();
void TM1650_INIT(void);
void TM1650_start(void);
void TM1650_stop(void);
void TM1650_Write(unsigned char DAT);
void TM1650_ACK(void);
void Write_DATA(unsigned char add,unsigned char DAT) ;
#endif /* USER_TM1650_H_ */
tm1650.c
/*
* tm1650.c
*
* Author: armxu
*/
#include "tm1650.h"
const unsigned char tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,//9
// 0 1 2 3 4 5 6 7 8 9
0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,//19
// 0. 1. 2. 3. 4. 5. 6. 7. 8. 9.
0x00,0x40};
//消隐 负号
void GPIO_INIT(void)
{
GPIO_InitTypeDef GPIO_InitStructure ;
RCC_APB2PeriphClockCmd(IIC_GPIO_CLK, ENABLE);
GPIO_InitStructure.GPIO_Pin = SCL_PIN|SDA_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(SCL_SDA_PORT, &GPIO_InitStructure);
IIC_Idle_State();
}
//IIC空闲状态
//当IIC总线的SDA和SCL两条信号线同时处于高电平时,规定为IIC总线的空闲状态
void IIC_Idle_State()
{
SDA_H;
SCL_H;
Delay_Us(4);
}
void TM1650_INIT(void)
{
GPIO_INIT();
}
void TM1650_start(void)
{
SCL_H;
Delay_Us(1);
SDA_H;
Delay_Us(1);
SDA_L;
Delay_Us(1);
}
void TM1650_stop(void)
{
SCL_H;
// _delay_us(1);
SDA_L;
Delay_Us(1);
SDA_H;
Delay_Us(1);
}
void TM1650_Write(unsigned char DAT) //写数据函数
{
unsigned char i;
Delay_Us(1);
SCL_L;
for(i=0;i<8;i++)
{
if(DAT&0X80)
SDA_H;
else
SDA_L;
DAT<<=1;
SCL_L;
Delay_Us(1);
SCL_H;
Delay_Us(1);
SCL_L;
Delay_Us(1);
}
}
void TM1650_ACK(void)
{
unsigned char timeout=0;
SCL_H;
Delay_Us(1);
SCL_L;
do timeout++;
while((SDA_READ())&&(timeout<255));
Delay_Us(1);
SCL_L;
}
void Write_DATA(unsigned char add,unsigned char DAT) //指定地址写入数据
{
TM1650_start();
TM1650_Write(add);
TM1650_ACK();
TM1650_Write(DAT);
TM1650_ACK();
TM1650_stop();
}
main.c
/********************************** (C) COPYRIGHT *******************************
* File Name : main.c
* Author : WCH
* Version : V1.0.0
* Date : 2020/04/30
* Description : Main program body.
* Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
* SPDX-License-Identifier: Apache-2.0
*******************************************************************************/
#include "debug.h"
#include "tm1650.h"
extern unsigned char const tab[];
/* Global typedef */
/* Global define */
/* Global Variable */
/*********************************************************************
* @fn main
*
* @brief Main program.
*
* @return none
*/
int main(void)
{
unsigned char i,j;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
Delay_Init();
TM1650_INIT();
USART_Printf_Init(115200);
printf("SystemClk:%d\r\n", SystemCoreClock);
printf("This is printf example\r\n");
Write_DATA(0x48,0x01);
while(1)
{
for(i=0;i<16;i++)
{
for(j=0;j<4;j++)
{
Write_DATA(0x68+2*j,tab[(j+i)%16]|0x80);
}
Delay_Ms(200);
}
}
}