首先 先畫電路圖吧!打開proteus,導入相關器件,繪制電路圖。如下:(記得要保存啊!發現模擬一遍程序就自動退出了,有bug,我是解決不了,所以就是要及時保存,自己重畫幾次就長記性了,我是不想重畫了,所以我及時保存了。)
第二步打開CubeMX,新建工程,配置時鐘和GPIO,如下:
第三步先來了解一下數碼管的十六進制碼的來源,我自己畫了個圖,我看著挺明白的,不明白的自己想,想明白了畫出來就明白了,其實很簡單的,就是給電就亮,斷電就滅而已。廢話不說了,看圖:
最后得出共陽極的斷碼為:{0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90}
接下來就是修改keil工程中的main文件中的內容了,其實主要就那么點東西,只不過放在了不同的地方而已:
void duanxuan(uint8_t num); ?//聲明斷選函數,傳入每個數字的碼值
void led_clear(void); ? ?// ?清屏函數, 主要將所有的數碼管都關閉。
uint8_t duan[]={0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90}; ?//斷碼數組
uint8_t num= 0; ? ? ? ? // 定義變量num
for(num=0; num<100; num++) // for循環 num的值從0到99{led_clear(); // 清屏GPIOB->ODR = 0x0002; // GPIOB的值為0x0002 0000 0000 0000 0010 也就是PB1為高電平duanxuan(duan[num%10]); // 斷選的值為 數組斷中的 num模10 也就是個位的數字HAL_Delay(2); // 延時2msled_clear(); // 清屏GPIOB->ODR = 0x0004; // GPIOB的值為0x0004 0000 0000 0000 0100 也就是PB2為高電平 duanxuan(duan[num/10]); // 斷選的值為 數組斷中的 num除10 也就是十位的數字 HAL_Delay(8); // 延時8ms 控制數碼管中的數字增加的快慢?}
void duanxuan(uint8_t num)? ?//斷碼顯示函數
{
? ? GPIOA->ODR = num; ? // A端口要顯示幾就傳入幾的斷碼
}
void led_clear(void)? ?// 清屏函數
{
? ? GPIOA->ODR = 0x00FF; ?// ?清屏函數 A端口的值:都是1,就是都不亮
}
好了,所有需要添加的代碼都在這里了,只需要按位置填進去編譯就行了,不按位置,填對了也可以,就是下次CubeMX有改動重新生成時自己寫的代碼是否還存在,需不需要重新寫,估計都不想重新寫的,那就按照樣式固定寫代碼的位置吧!