1. 程式人生 > >STM32CubeMX_SPI驅動數碼管

STM32CubeMX_SPI驅動數碼管

驅動4位共陽數碼管   基於STM32F030C8T6

Cube設定

(RCC預設使用內部晶體,SYS使用WKUP2,和Serial_Debug,TimeBase選擇Systick).



SPI1設定為半雙工通訊,紅線圈起來的是SPI通訊使用的3條線,MCU為主機,數碼管為從機,藍線圈起來的為驅動595使用的。


上面這個對話方塊的NVIC和DMA都無需設定.


現在可以生成程式碼了,對了,595_CS需要接地,MCU_NSS需要懸空。

//數碼管位選
void SEG_BitSelect(u8 bit_number)
{
   

if(bit_number == 1)
{
                   DISP_REAL_H_OPEN;  
}
else
{
 DISP_REAL_H_CLOSE;
}
 
       if(bit_number == 2)
{
                   DISP_REAL_L_OPEN;  
}
else
{
 DISP_REAL_L_CLOSE;
}
 
if(bit_number == 3)
{
                  DISP_SET_H_OPEN;  
}
else
{
 DISP_SET_H_CLOSE;
}
   

if(bit_number == 4)
{
                  DISP_SET_L_OPEN;  
}
else
{
 DISP_SET_L_CLOSE;
}
}

數碼管段選

void SEG_Real_Display(u8 real,u8 set)
{
   //
	 u8 real_units_digit;   //ʵ¼Êζȸöλ
	 u8 real_tens_digit;    //ʵ¼ÊζÈʮλ
	 u8 set_units_digit;    //ÉèÖÃζȸöλ
	 u8 set_tens_digit;     //ÉèÖÃζÈʮλ
	 u16 j;
	 real_tens_digit = real / 10;
	 real_units_digit =  real % 10;
	 
	 real_tens_digit = SEG_TAB[real_tens_digit];
	 real_units_digit = SEG_TAB[real_units_digit];
	 //========ÏÔʾʮλ================================================
   DISP_RCLK_L;      //ÖõÍRCLK
	 HAL_SPI_Transmit(&hspi1,&real_tens_digit,1,SPI1_TX_TIMEOUT);  //·¢ËÍʮλµÄÊý¾Ý
	 DISP_RCLK_H;      //À­¸ßRCLK
	 SEG_BitSelect(1); //Ñ¡Ôñ»ØˮζȵÄʮλÏÔʾ
	 for(j = 0;j < 500;j ++);
	 HAL_Delay(1);
//	 while(1);
	 SEG_BitSelect(0);
	 //========ÏÔʾ¸öλ================================================
   DISP_RCLK_L;      //ÖõÍRCLK
	 HAL_SPI_Transmit(&hspi1,&real_units_digit,1,SPI1_TX_TIMEOUT);  //·¢Ë͸öλµÄÊý¾Ý
	 DISP_RCLK_H;      //À­¸real_units_digit
	 SEG_BitSelect(2); //Ñ¡Ôñ»ØˮζȵĸöλÏÔʾ
	 for(j = 0;j < 500;j ++);
	 HAL_Delay(1);
	 SEG_BitSelect(0);
	 
	 
	 
	 set_tens_digit = real / 10;
	 set_units_digit =  real % 10;
	 
	 set_tens_digit = SEG_TAB[set_tens_digit];
	 set_units_digit = SEG_TAB[set_units_digit];
	 //========ÏÔʾʮλ================================================
   DISP_RCLK_L;      //ÖõÍRCLK
	 HAL_SPI_Transmit(&hspi1,&set_tens_digit,1,SPI1_TX_TIMEOUT);  //·¢ËÍʮλµÄÊý¾Ý
	 DISP_RCLK_H;      //À­¸ßRCLK
	 SEG_BitSelect(3); //Ñ¡Ôñ»ØˮζȵÄʮλÏÔʾ
	 for(j = 0;j < 500;j ++);
	 HAL_Delay(1);
//	 while(1);
	 SEG_BitSelect(0);
	 //========ÏÔʾ¸öλ================================================
   DISP_RCLK_L;      //ÖõÍRCLK
	 HAL_SPI_Transmit(&hspi1,&set_units_digit,1,SPI1_TX_TIMEOUT);  //·¢Ë͸öλµÄÊý¾Ý
	 DISP_RCLK_H;      //À­¸real_units_digit
	 SEG_BitSelect(4); //Ñ¡Ôñ»ØˮζȵĸöλÏÔʾ
	 for(j = 0;j < 500;j ++);
	 HAL_Delay(1);
	 SEG_BitSelect(0);
}
u8 const SEG_TAB[13]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x79,0x40,0x00};//數碼管字元碼
主函式內引用:
SEG_Real_Display(i,i);
具體細節不在此描述了!