unsigned char Disp_SEG[]={0x3F,0x06,0x5B,0x4F,
0x66,0x6D,0x7D,0x07,
0x7F,0x6F};
uint8_t show[12];
/* USER CODE BEGIN PV */
static void _delay_us( void )
{
uint8_t i;
for ( i = 0; i < 10; i++ );
}
/*********************************
功能: 写入一个字节
**********************************/
void write(uint8_t wr_data)
{
uint8_t i;
SIG_I2C_STB_LOW() ; //给有效的片选信号(片选信号是低电平有效)
_delay_us();
_delay_us();
for(i=0;i<8;i++)//开始传送8位数据,每循环一次传送一位数据
{
SIG_I2C_SCL_LOW();
_delay_us();_delay_us();
if((wr_data&0x01)!=0) SIG_I2C_SDA_HIGH();
else SIG_I2C_SDA_LOW();
_delay_us();_delay_us();
SIG_I2C_SCL_HIGH();
wr_data >>= 1;//移位数据,低位在前!
_delay_us();
}
}
void disp(uint8_t led[12])
{
uint8_t h;
SIG_I2C_STB_HIGH();
SIG_I2C_SCL_HIGH();
SIG_I2C_SDA_HIGH();
write(0x02);//显示模式设置,设置为6个GRID,8个SEG
SIG_I2C_STB_HIGH();
write(0x40);//写数据到显示寄存器,采用地址自动加一
SIG_I2C_STB_HIGH();
write(0xc0);//显示寄存器的00H单元开始
for(h=0;h<12;h++)
{
write(led[h]);//给显示寄存器送数据,
}
SIG_I2C_STB_HIGH();
write(0x8e);//显示控制参数,点亮数码屏幕,亮度可以通过改变低三位调节
}
void datatoshow1(uint8_t b1,uint8_t b2,uint8_t b3,uint8_t b4,uint8_t b5,uint8_t b6)
{
uint8_t CODE[10] = {0xbf,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//uint8_t CODE1[11] = {0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0x80};//带点
show[0]=CODE[b1];
show[2]=CODE[b2];
show[4]=CODE[b3];
show[6]=CODE[b4];
show[8]=CODE[b5];
show[10]=CODE[b6];
disp(show);
}
void datatoshow2(uint32_t k)
{
uint8_t CODE[11] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};//不带点
uint8_t CODE1[11] = {0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0x80};//带点
if(k<10)
{
show[0]=CODE[10];
show[2]=CODE1[10];
show[4]=CODE[10];
show[6]=CODE[10];
show[8]=CODE1[10];
show[10]=CODE1[k];
}
if((k>=10)&&(k<100))
{
show[0]=CODE[10];
show[2]=CODE1[10];
show[4]=CODE[10];
show[6]=CODE[10];
show[8]=CODE1[k/10];
show[10]=CODE1[k%10];
}
if((k>=100)&&(k<1000))
{
show[0]=CODE[10];
show[2]=CODE1[10];
show[4]=CODE[10];
show[6]=CODE[k/100];
show[8]=CODE1[k/10%10];
show[10]=CODE1[k%10];
}
if((k>=1000)&&(k<10000))
{
show[0]=CODE[10];
show[2]=CODE1[10];
show[4]=CODE[k/1000];
show[6]=CODE[k/100%10];
show[8]=CODE1[k%100/10];
show[10]=CODE1[k%10];
}
if((k>=10000)&&(k<100000))
{
show[0]=CODE[10];
show[2]=CODE1[k/10000];
show[4]=CODE[k/1000%10];
show[6]=CODE[k/100%10];
show[8]=CODE1[k/10%10];
show[10]=CODE1[k%10];
}
if((k>=100000))
{
show[0]=CODE[k/100000];
show[2]=CODE1[k/10000%10];
show[4]=CODE[k/1000%10];
show[6]=CODE1[k/100%10];
show[8]=CODE[k/10%10];
show[10]=CODE1[k%10];
}
disp(show);
}
void clear(void)//清除显示
{
uint8_t CODE[11] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};//不带点
show[0]=CODE[10];
show[2]=CODE[10];
show[4]=CODE[10];
show[6]=CODE[10];
show[8]=CODE[10];
show[10]=CODE[10];
disp(show);
}
/* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */
/* USER CODE END PFP */
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
/* USER CODE END 0 */
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */
/* 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 */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
/* USER CODE BEGIN 2 */
clear();
HAL_Delay(200);
datatoshow2(112233);
HAL_Delay(2000);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
datatoshow2(123456);
HAL_Delay(500);
HAL_GPIO_TogglePin(GPIOD, LED4_Pin);
HAL_GPIO_TogglePin(GPIOD, LED3_Pin);
}
/* USER CODE END 3 */
}
确认下电源部分飞个线是否能直接驱动点亮数码管,能就看看软件部分,是否管脚未复用,时钟没开启等原因,不能直接驱动点亮数码管那就硬件部分有问题,数码管有问题,电路设计或电源设计再看看
问题已解决:硬件上把STB、CLK、DIO上拉电阻和串联电阻去掉,数码管就可以亮了,亲测可用。