Digilent Pmod i STM32 (cz. 6) – PmodACL2, PmodDPOT i PmodSSD
PmodSSD
Moduł PmodSSD jest wyposażony w dwucyfrowy wyświetlacz siedmiosegmentowy. Obie cyfry wyświetlacza mają wspólną katodę, a wybór aktywnej odbywa się za pośrednictwem jednego z sygnałów. PmodSSD posiada dwa sześciopinowe złącza GPIO typu 1. Z tego względu w przykładzie moduł podłączono do złącza ARDUINO CONNECTOR zgodnie z tabelą 3.
Tabela 3. Sygnały modułu PmodSSD podłączone do złącza ARDUINO CONNECTOR zestawu KAmeleon
Sygnał | Numer pinu PmodSSD | Numer pinu KAmeleon ARDUINO CONNECTOR | Pin mikrokontrolera |
AA | 1 (J1) | D6 | PD10 |
AB | 2 (J1) | D7 | PB11 |
AC | 3 (J1) | D8 | PD11 |
AD | 4 (J1) | D9 | PB13 |
GND | 5 (J1) | GND | – |
VCC | 6 (J1) | +3,3 | – |
AE | 1 (J2) | D10 | PB12 |
AF | 2 (J2) | D11 | PB15 |
AG | 3 (J2) | D12 | PB14 |
C | 4 (J2) | D13 | PB10 |
GND | 5 (J2) | – | – |
VCC | 6 (J2) | – | – |
Kod przykładu
Za obsługę wyświetlacza odpowiedzialny jest kod znajdujący się w plikach inc/PmodSSD.h i src/PmodSSD.c. Na listingu 9. znajdują się definicje pinów i portów GPIO oraz konfiguracja segmentów dla cyfr od 0 do 9. Cyfry są zakodowane jako maski bitowe, w których jedynka oznacza, że segment ma być zapalony. Segment A w każdej masce zakodowano na bicie zerowym, a segment G na szóstym.
Listing 9. Definicje pinów i portów GPIO oraz masek bitowych dla cyfr 0 – 9
uint16_t segmentPins[SEGMENTS_COUNT] = {GPIO_PIN_10, GPIO_PIN_11, GPIO_PIN_11, GPIO_PIN_13, GPIO_PIN_12, GPIO_PIN_15, GPIO_PIN_14}; GPIO_TypeDef* segmentPorts[SEGMENTS_COUNT] = {GPIOD, GPIOB, GPIOD, GPIOB, GPIOB, GPIOB, GPIOB}; uint8_t segmentsConfig[10] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F};
Za konfigurację wyprowadzeń mikrokontrolera podłączonych do wyświetlacza odpowiedzialna jest funkcja PmodSSD_Config włączająca niezbędne sygnały zegarowe i ustawiająca piny jako wyjścia w stanie niskim. Oprócz pinów obecnych w powyższych definicjach, funkcja konfiguruje także pin PB10, który służy do wybierania aktywnej cyfry wyświetlacza. Funkcję PmodSSD_Config przedstawiono na listingu 10.
Listing 10. Konfiguracja wyprowadzeń podłączonych do modułu PmodSSD
void PmodSSD_Config(void) { // Enable clock for all required GPIO ports. __HAL_RCC_GPIOB_CLK_ENABLE(); __HAL_RCC_GPIOD_CLK_ENABLE(); GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_PULLDOWN; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; // Initialize GPIOs for all segments for(int i=0; i<SEGMENTS_COUNT; i++) { GPIO_InitStruct.Pin = segmentPins[i]; HAL_GPIO_Init(segmentPorts[i], &GPIO_InitStruct); HAL_GPIO_WritePin(segmentPorts[i], segmentPins[i], GPIO_PIN_RESET); } // Initialize display selection pin GPIO_InitStruct.Pin = GPIO_PIN_10; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, GPIO_PIN_RESET); }
Druga z funkcji znajdujących się w pliku src/PmodSSD.c – PmodSSD_DisplayNumber, służy do wyświetlania wybranej cyfry. Została ona przedstawiona na listingu 11. Funkcja ustawia stan linii C, wybierając w ten sposób jedną z cyfr. Następnie ustawia pozostałe linie GPIO zgodnie z wybraną maską bitową. Aktywna cyfra wybierana jest za pomocą argumentu typu DisplayId, zdefiniowanego w pliku inc/PmodSSD.h.
Listing 11. Wyświetlanie wybranej cyfry na wyświetlaczu
void PmodSSD_DisplayNumber(DisplayId id, uint8_t number) { if (number > 9) return; // Select the display using the C pin. if(id == DisplayId_0) HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, GPIO_PIN_RESET); else HAL_GPIO_WritePin(GPIOB, GPIO_PIN_10, GPIO_PIN_SET); // Set or reset each segment bit according to the segment configuration array. for(int i=0; i<SEGMENTS_COUNT; i++) { if((segmentsConfig[number] >> i) & 0x01) HAL_GPIO_WritePin(segmentPorts[i], segmentPins[i], GPIO_PIN_SET); else HAL_GPIO_WritePin(segmentPorts[i], segmentPins[i], GPIO_PIN_RESET); } }
Pętla główna programu w funkcji main wyświetla naprzemiennie cyfry na wyświetlaczu w kolejności rosnącej po prawej stronie i malejącej po lewej stronie wyświetlacza. Podłączony moduł z wyświetloną jedną z cyfr przedstawiono na fotografii 7.
Fotografia 7. Moduł PmodSSD podłączony do złącza ARDUINO CONNECTOR zestawu KAmeleon