iT邦幫忙

第 12 屆 iT 邦幫忙鐵人賽

DAY 9
1
IoT

熟悉Arduino的Maker必看!30天帶你快速入門基於STM32嵌入式開發~系列 第 9

[Day 9]-【STM32系列】GPIO應用篇- 7 segment led display

認識七段顯示器

相信大家應該很多地方都有看過七段顯示器,郵局叫號,銀行匯率看板應該都常見到
https://ithelp.ithome.com.tw/upload/images/20200924/20120093QkLqrJxRMt.pnghttps://ithelp.ithome.com.tw/upload/images/20200924/20120093BpNPnjwXJo.png
七段顯示器是由8個LED組合而成,從最上方順時鐘數依序命名 a, b, c, d, e, f,以及小數點dp,中間上下兩隻腳是連通的

七段顯示器一般分共殷和共陽
共陽:指內部8個LED正極接一起,當任意腳電位為Low,LED導通,共陽0亮1不亮
共殷:指內部8個LED負極接一起,當任意腳電位為High,LED導通,共殷1亮0不亮
https://ithelp.ithome.com.tw/upload/images/20200924/20120093YyOTVAlrkF.png

  • 驅動共陽極七段顯示器
    欲使用PA0~PA7依序連接a、b、c、d、e、f、g,則16進制碼依序為0xC0、0xF9、0xA4、0xB0、0x99、0x92、0x82、0xF8、0x80、0x90
字型 dp g f e d c b a
1 1 0 0 0 0 0 0
1 1 1 1 1 0 0 1
1 0 1 0 0 1 0 0
1 0 1 1 0 0 0 0
1 0 0 1 1 0 0 1
1 0 0 1 0 0 1 0
1 0 0 0 0 0 1 0
1 1 1 1 1 0 0 0
1 0 0 0 0 0 0 0
1 0 0 1 0 0 0 0
  • 驅動共殷極七段顯示器
    欲使用PA0~PA7依序連接a、b、c、d、e、f、g,則16進制碼依序為0x3F、0x06、0x5B、0x4F、0x66、0x6D、0x7D、0x07、0x7F、0x6F
字型 dp g f e d c b a
0 0 1 1 1 1 1 1
0 0 0 0 0 1 1 0
0 1 0 1 1 0 1 1
0 1 0 0 1 1 1 1
0 1 1 0 0 1 1 0
0 1 1 0 1 1 0 1
0 1 1 1 1 1 0 1
0 0 0 0 0 1 1 1
0 1 1 1 1 1 1 1
0 1 1 0 1 1 1 1

但我們今天使用的七段顯示器是長這樣的
https://ithelp.ithome.com.tw/upload/images/20200924/20120093AafnrV19l7.png
這種將四個七段顯示器包裝在一起,繼承原本abcdefg接腳,還多了D0,D1,D2,D3,當其中D0,D1,D2,D3任一位數接地,相對應的位數就會發亮

直接讓大家看結果吧!

https://ithelp.ithome.com.tw/upload/images/20200925/201200939zicRfbKe2.png

Setup

https://ithelp.ithome.com.tw/upload/images/20201020/20120093IOVKXZsCf4.png

1.Pinout

  • 基本設定:
    RCC → HSE、LSE → Crystal/Ceramic Resonator✅
    SYS → Debug Serial Wire ✅

PA0 ~ PA7 → GPIO_Output (作為七段顯示器的abcdefg和dp小數點)
PB0 ~ PB3 → GPIO_Output (作為七段顯示器的選擇線)

2.Clock

https://ithelp.ithome.com.tw/upload/images/20201001/20120093mwsW2dOAkz.png
最快32MHz

3.生成檔案


基於我的電路圖,任一選擇線遇0則1,a~g遇1則1
https://ithelp.ithome.com.tw/upload/images/20200924/20120093l0YaRn6WnI.png

#include "main.h"
#include "stm32l0xx_hal.h"

unsigned char segs[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //七段編碼0~9
unsigned char cnt[]={1,2,3,4}; //建立七段顯示
int i,scnt=0;

void display(void){
	for(i=0;i<=3;i++){
	GPIOA->BRR=0xFF; //清空七段顯示暫存器
	GPIOB->BSRR=0x0F; //清空七段選擇線
	GPIOA->BSRR = segs[cnt[i]]; //顯示cnt[]陣列對應數值
	GPIOB->BRR = (1<<i); //七段選擇線
	HAL_Delay(1); //滯留1ms時間
	}
}

void mycodes(void){
	GPIOA->BRR=0xFF;
	GPIOB->BSRR=0x0F;
	
	while(1){
		display();
		
	}
}

燒錄並reset CPU應該就會顯示cnt[]陣列的值1234
https://ithelp.ithome.com.tw/upload/images/20200925/201200939zicRfbKe2.png


相關連結


結語


上一篇
[Day 8]-【STM32系列】淺入淺出之 General Purpose Input/Output 介紹 (下)
下一篇
[Day 10]-【STM32系列】Difference between “timer” and “counter and introductions
系列文
熟悉Arduino的Maker必看!30天帶你快速入門基於STM32嵌入式開發~30

尚未有邦友留言

立即登入留言