
const unsigned char D7_seg[16] = {0X3F, 0X06, 0X5B, 0X4F, 0X66, 0X6D, 0X7D, 0X07,
0X7F, 0X6F, 0X77, 0X7C, 0X39, 0X5E, 0X79, 0X71};// 7 Segmentos en Cátodo Común
Si se tiene un Display 7 segmentos con ánodo común, se debe negar la entrada.

void conteo_ascendente(){
for(int i = 0; i<16; i++){ //Conteo 7 Seg de 0 a f
GPIOC->ODR |= D7_seg[i]; //Enviar valor de matriz a 7 seg
Delay_ms(1000);
GPIOC->ODR &= ~D7_seg[i]; //Apagar valor de 7 seg para el siguiente
}
}
void conteo_descendente(){
for(int i = 16; i>0; i--){ //Conteo 7 Seg de f a 0
GPIOC->ODR |= D7_seg[i]; //Enviar valor de matriz a 7 seg
Delay_ms(1000);
GPIOC->ODR &= ~D7_seg[i]; //Apagar valor de 7 seg para el siguiente
}
}
Se debe asignar dos pines a los pines de tierras de los siete segmentos, en este caso serán PC7 y PC8

void display_dinamico_2d(){
for(int i= 0; i<10;i++){ //For para el Denominador
for(int j=0; j<10; j++){ //For par el Numerador
int contador = 0; //Contador para revisar ciclos en un mismo número
while(contador<20){
GPIOC->ODR |= ((1UL<<7) | (1UL<<8)); //Apagar los dos 7 seg
GPIOC->ODR |= D7_seg[i]; //Colocar Denominador
GPIOC->ODR &= ~(1UL<<7); //Prender primer 7 seg
Delay_ms(1);
GPIOC->ODR &= ~D7_seg[i]; //Quitar Denominador
GPIOC->ODR |= (1UL<<7); //Apagar primer 7 seg
GPIOC->ODR |= D7_seg[j]; //Colocar Numerador
GPIOC->ODR &= ~(1UL<<8); //Prender segundo 7 seg
Delay_ms(1);
GPIOC->ODR &= ~D7_seg[j]; //Quitar Numerador
GPIOC->ODR |= (1UL<<8); //Apagar segundo 7 seg
Delay_ms(10);
contador++;
}
}
}
}
Se debe asignar tres pines a los pines de tierras de los siete segmentos, en este caso serán PC7, PC8 y PC9

void display_dinamico_3d(){
GPIOC->ODR |= ((1UL<<7) | (1UL<<8) | (1UL<<9)); //Apagar los dos 7 seg
GPIOC->ODR |= D7_seg[5]; //Colocar Número 1 --> 5
GPIOC->ODR &= ~(1UL<<7); //Prender primer 7 seg
Delay_ms(1);
GPIOC->ODR &= ~D7_seg[5]; //Quitar Número 1
GPIOC->ODR |= (1UL<<7); //Apagar primer 7 seg
GPIOC->ODR |= D7_seg[7]; //Colocar Número 2 --> 7
GPIOC->ODR &= ~(1UL<<8); //Prender segundo 7 seg
Delay_ms(1);
GPIOC->ODR &= ~D7_seg[7]; //Quitar Número 2
GPIOC->ODR |= (1UL<<8); //Apagar segundo 7 seg
GPIOC->ODR |= D7_seg[1]; //Colocar Número 3 --> 1
GPIOC->ODR &= ~(1UL<<9); //Prender segundo 7 seg
Delay_ms(1);
GPIOC->ODR &= ~D7_seg[1]; //Quitar Número 3
GPIOC->ODR |= (1UL<<9); //Apagar segundo 7 seg
Delay_ms(10);
}
#include "stm32f4xx.h"
const unsigned char D7_seg[16] = {0X3F, 0X06, 0X5B, 0X4F, 0X66, 0X6D, 0X7D, 0X07,
0X7F, 0X6F, 0X77, 0X7C, 0X39, 0X5E, 0X79, 0X71};// 7 Segmentos en Cátodo Común
void Delay_ms(int x){ //Función Delay en milisegundos
for(volatile int i=0;i<x*940; i++){
asm("nop");
}
}
void conteo_ascendente(){ //CONTEO ASCENDENTE
for(int i = 0; i<16; i++){ //Conteo 7 Seg de 0 a f
GPIOC->ODR |= D7_seg[i]; //Enviar valor de matriz a 7 seg
Delay_ms(1000);
GPIOC->ODR &= ~D7_seg[i]; //Apagar valor de 7 seg para el siguiente
}
}
void conteo_descendente(){ //CONTEO DESASCENDENTE
for(int i = 16; i>0; i--){ //Conteo 7 Seg de f a 0
GPIOC->ODR |= D7_seg[i]; //Enviar valor de matriz a 7 seg
Delay_ms(1000);
GPIOC->ODR &= ~D7_seg[i]; //Apagar valor de 7 seg para el siguiente
}
}
void display_dinamico_2d(){ //DISPLAY 7 SEG DINÁMICO 2 DÍGITOS
for(int i= 0; i<10;i++){ //For para el Denominador
for(int j=0; j<10; j++){ //For par el Numerador
int contador = 0; //Contador para revisar ciclos en un mismo número
while(contador<10){
GPIOC->ODR |= ((1UL<<7) | (1UL<<8)); //Apagar los dos 7 seg
GPIOC->ODR |= D7_seg[i]; //Colocar Denominador
GPIOC->ODR &= ~(1UL<<7); //Prender primer 7 seg
Delay_ms(1);
GPIOC->ODR &= ~D7_seg[i]; //Quitar Denominador
GPIOC->ODR |= (1UL<<7); //Apagar primer 7 seg
GPIOC->ODR |= D7_seg[j]; //Colocar Numerador
GPIOC->ODR &= ~(1UL<<8); //Prender segundo 7 seg
Delay_ms(1);
GPIOC->ODR &= ~D7_seg[j]; //Quitar Numerador
GPIOC->ODR |= (1UL<<8); //Apagar segundo 7 seg
Delay_ms(10);
contador++;
}
}
}
}
void display_dinamico_3d(){ //DISPLAY 7 SEG DINÁMICO 3 DÍGITOS
GPIOC->ODR |= ((1UL<<7) | (1UL<<8) | (1UL<<9)); //Apagar los dos 7 seg
GPIOC->ODR |= D7_seg[5]; //Colocar Número 1 --> 5
GPIOC->ODR &= ~(1UL<<7); //Prender primer 7 seg
Delay_ms(1);
GPIOC->ODR &= ~D7_seg[5]; //Quitar Número 1
GPIOC->ODR |= (1UL<<7); //Apagar primer 7 seg
GPIOC->ODR |= D7_seg[7]; //Colocar Número 2 --> 7
GPIOC->ODR &= ~(1UL<<8); //Prender segundo 7 seg
Delay_ms(1);
GPIOC->ODR &= ~D7_seg[7]; //Quitar Número 2
GPIOC->ODR |= (1UL<<8); //Apagar segundo 7 seg
GPIOC->ODR |= D7_seg[1]; //Colocar Número 3 --> 1
GPIOC->ODR &= ~(1UL<<9); //Prender segundo 7 seg
Delay_ms(1);
GPIOC->ODR &= ~D7_seg[1]; //Quitar Número 3
GPIOC->ODR |= (1UL<<9); //Apagar segundo 7 seg
Delay_ms(10);
}
int main (void){
RCC->AHB1ENR |= 0X7; //Encender Relojes de los puertos A,B,C
GPIOA->MODER |= 0X400; // PA5 Salida --> 0100 0000 0000
GPIOC->MODER |= 0X55555; // PC0-PC8 Salida -> 0101 0101 0101 0101 0101
while(1){
//conteo_ascendente();
//conteo_descendente();
//display_dinamico_2d();
display_dinamico_3d();
}
return 0;
}