C: Programowanie wyswietlacza LED 8 segmentowego AVR

W tym projekcie wykorzystano modul AVT 3505 ktorego schemat jest poniżej

image010.jpg

image011.jpg

Plytka sklada się z dwoch czesci: czesci z mikroprocesorem (rys.1) oraz czesci z układami wykonawczymi (rys.2)

2021-11-13 10_26_01-AVT3505.pdf - [AVT3505] - SumatraPDF

Program wykorzystuje multipleksacje za pomocą tranzystorow T2, T3, T4, T5 (rys.2), pozwala to na wykorzystanie 4 krotnie mniej
złacz GPIO do wyświetlania segmentow na wyswietlaczu. Napisano w programie rowniez funkcje (linia 24 w main.c) ktora zamienia
wartosc liczby z kropka na numery segmentow wyświetlacza co ulatwia programowanie, na koniec jest kilka przykladowych petli
oraz funkcja ktora pozwala na automatyczne wypisywanie 4 cyfrowych liczb na wyswietlaczu.

main.c
#include <avr\io.h>
#include <util\delay.h>
// Definicje wyprowadzen
 
#define F_CPU 8000000UL
 
#define LED_A 4
#define LED_B 3
#define LED_C 5
#define LED_D 2
#define LED_E 6
#define LED_F 0
#define LED_G 7
#define LED_DP 1
#define LEDPORT PORTB
#define LEDDDR DDRB
#define COM1 5
#define COM2 4
#define COM3 3
#define COM4 2
#define COMPORT PORTD
#define COMDDR DDRD
 
int displayNumber(int num, int com)
{
	switch(com)
	{
		case 1:
		COMDDR = 1<<COM1 | 0<<COM2 | 0<<COM3 | 0<<COM4;
		break;
		case 2:
		COMDDR = 0<<COM1 | 1<<COM2 | 0<<COM3 | 0<<COM4;
		break;
		case 3:
		COMDDR = 0<<COM1 | 0<<COM2 | 1<<COM3 | 0<<COM4;
		break;
		case 4:
		COMDDR = 0<<COM1 | 0<<COM2 | 0<<COM3 | 1<<COM4;
		break;
	}
	switch(num)
	{
		case 0:
		LEDPORT = ~(1<<LED_A | 1<<LED_B | 1<<LED_C | 1<<LED_D | 1<<LED_E | 1<<LED_F );
		break;
		case 1:
		LEDPORT = ~(1<<LED_B | 1<<LED_C);
		break;
		case 2:
		LEDPORT = ~(1<<LED_A | 1<<LED_B | 1<<LED_G | 1<<LED_E | 1<<LED_D);
		break;
		case 3:
		LEDPORT = ~(1<<LED_A | 1<<LED_B | 1<<LED_G | 1<<LED_C | 1<<LED_D);
		break;
		case 4:
		LEDPORT = ~(1<<LED_F | 1<<LED_B | 1<<LED_G | 1<<LED_C );
		break;
		case 5:
		LEDPORT = ~(1<<LED_A | 1<<LED_F | 1<<LED_G | 1<<LED_C | 1<<LED_D);
		break;
		case 6:
		LEDPORT = ~(1<<LED_A | 1<<LED_F | 1<<LED_G | 1<<LED_C | 1<<LED_D | 1<<LED_E);
		break;
		case 7:
		LEDPORT = ~(1<<LED_B | 1<<LED_C | 1<<LED_A);
		break;
		case 8:
		LEDPORT = ~(1<<LED_A | 1<<LED_B | 1<<LED_C | 1<<LED_D | 1<<LED_E | 1<<LED_F | 1<<LED_G);
		break;
		case 9:
		LEDPORT = ~(1<<LED_A | 1<<LED_B | 1<<LED_C | 1<<LED_D | 1<<LED_F | 1<<LED_G);
		break;
	}
 
}
 
int displayInteger(int integer)
{
	int n1,n10,n100,n1000;
	n1000 = integer / 1000 % 10;
	n100 = integer / 100 % 10;
	n10 = integer / 10 % 10;
	n1 = integer % 10;
	displayNumber(n1000,1);
	_delay_ms(10);
	displayNumber(n100,2);
	_delay_ms(10);
	displayNumber(n10,3);
	_delay_ms(10);
	displayNumber(n1,4);
	_delay_ms(10);
}
 
int main(void)
{
	LEDDDR = 0xff;
 
	while(1)
	{
//		odliczanie na kazdym wysiwtlaczu od 0 do 9
//		scrollowanie liczb
 		for(int i = 0; i <= 9 ; i ++)
 		{
 			for(int j = 1; j <= 4 ; j ++)
			{
 				displayNumber(i,j);
 				_delay_ms(2000);
 			}
  		}
//		liczenie od 0 do 9999
 		for(int i = 0; i <= 9999 ; i++){
 			displayInteger(i);
 		}
//		displayInteger(1234);
//	}
 
	return 0;
}
}