本文例子參考《STM32單片機開發實例——基於Proteus虛擬模擬與HAL/LL庫》 源代碼:https://github.com/LanLinnet/STM33F103R6 項目要求 實現數位管動態顯示數字1~8。 硬體設計 在第一節的基礎上,在Proteus中添加電路如下圖所示,其中我們添加了 ...
本文例子參考《STM32單片機開發實例——基於Proteus虛擬模擬與HAL/LL庫》
源代碼:https://github.com/LanLinnet/STM33F103R6
項目要求
實現數位管動態顯示數字1~8。
硬體設計
-
在第一節的基礎上,在Proteus中添加電路如下圖所示,其中我們添加了一個排阻RX8、一個8位共陽極七段數位管顯示器7SEG-MPX8-CA-BLUE、一個非門電路74HC04。
由於共陽極數位管是低電平驅動的,根據電路圖我們可以知道,當STM32單片機輸出低電平時,數位管發光。
註意:由於電路中用到的反相器74HC04僅有6個通道,為了避免晶元浪費,我們也可以使用8位數位管可以使用2個PNP型三極體S8550來構成反向電路。不過由於三極體在模擬過程中響應速度太慢,我們在這裡就不使用了。
-
打開CubeMX,按照建立工程,配置PC0-PC7、PB0-PB7引腳為GPIO_Output。
-
點擊“Project Manager”--“Advanced Settings”,將GPIO的庫改為LL庫(我們後面需要用到LL庫中的函數),點擊“Generator Code”生成Keil工程。
軟體編寫
- 本次我們需要實現7段共陽極數位管,其段表如下所示:
0xc0,//0
0xf9,//1
0xa4,//2
0xb0,//3
0x99,//4
0x92,//5
0x82,//6
0xf8,//7
0x80,//8
0x90,//9
0x88,//A
0x83,//B
0xc6,//C
0xa1,//D
0x86,//E
0x8e, //F
0x8c, //P
0xc1, //U
0x91, //Y
0x7c, //L
0x00, //全亮
0xff //熄滅
-
點擊“Open Project”在Keil中打開工程,雙擊“main.c”文件。
-
本次模擬我們用到寫埠輸出函數
LL_GPIO_WriteOutputPort()
,其官方文檔API介紹如下圖所示。
-
我們需要通過查表的方式讀取數位管的段碼,所以我們先在函數的最開始設置一個數組存放數位管的段碼。
/* USER CODE BEGIN PV */
const uint8_t SegmentCodes[]=
{
0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90
};
/* USER CODE END PV */
數位管的動態顯示就是多個數位管共用一組GPIO引腳,當刷新速度足夠快時,利用人眼的“視覺暫留”效應,讓人產生所有數位管同時發光的錯覺。
通過迴圈的方式,我們依次選通數位管,並讀取數位管段碼數組中的值,所以我們先在main函數的最開始定義一個迴圈變數,並對顯示的數字進行處理。
/* USER CODE BEGIN 1 */
uint8_t i; //迴圈變數
uint64_t num=12345678; //需要顯示的數字
uint8_t unit[8]; //顯示數字的每一位
//8位十進位數字每一位的分解
unit[7]=num/10000000;
unit[6]=num%10000000/1000000;
unit[5]=num%1000000/100000;
unit[4]=num%100000/10000;
unit[3]=num%10000/1000;
unit[2]=num%1000/100;
unit[1]=num%100/10;
unit[0]=num%10;
/* USER CODE END 1 */
最後,我們在while迴圈中添加下麵的代碼
/* USER CODE BEGIN WHILE */
while (1)
{
for(i=0;i<8;i++)
{
LL_GPIO_WriteOutputPort(GPIOB,0xff);
LL_GPIO_WriteOutputPort(GPIOC,SegmentCodes[unit[i]]);
LL_GPIO_WriteOutputPort(GPIOB,(0x7f>>i)|(0x7f<<(8-i)));
HAL_Delay(1);
}
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
聯合調試
- 點擊運行,生成HEX文件。
- 在Proteus中載入相應HEX文件,點擊運行,可以看到數位管從左到右依次顯示數字1~8。