2023-05-07 02:04 AM
Im only can display the 7segment by using "sortSegment (numbers);" and it only display at 4th 7segment. How can i select which 7segment i want to display, and how can i display Characters?
2023-05-07 05:34 AM
Check the schematics of your board - you will see the connections.
2023-05-07 06:12 AM
You have to shift in 4 digits
D8=data, D7=clk, D4=latch
2023-05-13 03:07 AM - edited 2023-11-20 06:12 AM
this is the schematics of my Arduino Multifunction shield, and i just connect it to my stm32l053r8t6. Can someone teach me how to display my 7segment? Im already set the pin (PB5, PA8, PA9) to the gpio_output. Now i can only display numeric numbers, how to display characters?
2023-05-13 03:13 AM
Please teach me how to display characters and how to select which 7segment to display. Im already include the .c and .h files and i cannot understand it because im new to stm32:loudly_crying_face:
// this is .h file
#include "stm32l0xx_hal.h"
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
//=================================================================== I/O Pins AML
#define LOW GPIO_PIN_RESET
#define HIGH GPIO_PIN_SET
#define dataS(x) HAL_GPIO_WritePin(GPIOA, GPIO_PIN_9, x? HIGH:LOW)
#define shCLK(x) HAL_GPIO_WritePin(GPIOA, GPIO_PIN_8, x? HIGH:LOW)
#define stCLK(x) HAL_GPIO_WritePin(GPIOB, GPIO_PIN_5, x? HIGH:LOW)
#define BUZ(x) HAL_GPIO_WritePin(GPIOB, GPIO_PIN_3 ,x? LOW:HIGH)
#define LED1(x) HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5,x? LOW:HIGH)
#define LED2(x) HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6,x? LOW:HIGH)
#define LED3(x) HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7,x? LOW:HIGH)
#define LED4(x) HAL_GPIO_WritePin(GPIOB, GPIO_PIN_6,x? LOW:HIGH)
#define S1 HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_1)
#define S2 HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_4)
#define S3 HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0)
//=================================================================== Function Prototype
uint8_t getPB(void);
void LEDs(uint8_t decimal);
void displaySegment(void);
void multiplexSegment(uint16_t num4digit);
// this is the .c file
#include "praQdriver.h"
// Array data & variables used for 7-segment Common Anode - numeric value only
const uint8_t num[10] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
const uint8_t seg[4] = {0xF1,0xF2,0xF4,0xF8};
uint16_t ptr2disp;
uint16_t buff[4];
uint8_t getPB(void)
{ uint8_t PBvalue=0;
if(S1!=HIGH) PBvalue |= 1<<0;
if(S2!=HIGH) PBvalue |= 1<<1;
if(S3!=HIGH) PBvalue |= 1<<2;
return PBvalue;
}
void LEDs(uint8_t decimal)
{ LED1(decimal & 1<<0);
LED2(decimal & 1<<1);
LED3(decimal & 1<<2);
LED4(decimal & 1<<3);
}
void displaySegment(void)
{ static uint8_t seg=0;
stCLK(LOW);
for(int8_t i=15;i>-1;i--)
{ shCLK(LOW);
if(buff[seg] & (1<<i)) dataS(HIGH);
else dataS(LOW);
shCLK(HIGH);
}
stCLK(HIGH);
if(++seg>3) seg=0;
}
void multiplexSegment(uint16_t num4digit)
{ for(uint8_t i=0;i<4;i++)
{ switch(i)
{ case 0:
ptr2disp = num4digit / 1000;
break;
case 1:
ptr2disp = (num4digit % 1000) / 100;
break;
case 2:
ptr2disp = (num4digit % 100) / 10;
break;
case 3:
ptr2disp = num4digit % 10;
break;
}
buff[i] = (num[ptr2disp]<<8) | seg[i];
}
}
2023-05-13 05:57 AM
But are the conceptual issues here STM32 related?
You've got a 16-bit shift register, one half is uses to select the digit to be selected, and the other half the 7-segments to illuminate.
You keep an MCU side buffer, and cycle thru the digits continuously, frequently enough for the scan/persistence to work.
Shift registers are a basic concept. You drive a bit, clock it into the chain, and then there's a latch to move the shifting register into a holding register.
Make sure you've properly initialized the GPIO pins.
If you have a scope or logic analyzer perhaps use those to confirm or review your understanding.