Display 7 segmentos

Untitled

Matriz de 7 segmentos cátodo Común:

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.

Función de Conteo de Display 7 segmentos Ascendente y Descendente

Untitled

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
	}	
}

Función Display 7 Segmentos Dinámico 2 Dígitos

Se debe asignar dos pines a los pines de tierras de los siete segmentos, en este caso serán PC7 y PC8

Untitled

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++;
			}
		}
	}
}

Función Display Dinámico 3 dígitos (NO es contador)

Se debe asignar tres pines a los pines de tierras de los siete segmentos, en este caso serán PC7, PC8 y PC9

Untitled

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);
}

CÓDIGO COMPLETO

#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;

}