Если разные порты входов-выходов, то единственный выход, отдельные переменные-буферы под входы и выходы.
Пусть у нас будет переменная segmentes (сегменты), com-outputs (общие светодиодов).
Пример под один порт сегментов, один порт общих выходов.
seven_segm_led_ind.h:
seven_segm_led_ind.с:
Дальше делаем так:
Пусть у нас будет переменная segmentes (сегменты), com-outputs (общие светодиодов).
Пример под один порт сегментов, один порт общих выходов.
seven_segm_led_ind.h:
Спойлер
Код: Выделить всё
//==================
#ifndef SEVEN_SEGM_LED_IND_H
#define SEVEN_SEGM_LED_IND_H
#include "seven_segm_led_ind.h"
//==================
//==================
#include "main_def_func.h"
//==================
//==================
#define ANODS_PORT PORTA
#define ANODS_PIN PINA
#define ANODS_DDR DDRA
//#define ANODS_2_PORT PORTA
//#define ANODS_2_PIN PINA
//#define ANODS_2_DDR DDRA
#define KATODS_PORT PORTC
#define KATODS_PIN PINC
#define KATODS_DDR DDRC
//==================
//==================
#define ANOD_1 1<<2
#define ANOD_2 1<<3
#define ANOD_3 1<<4
#define ANOD_4 1<<5
#define ANOD_5 1<<6
#define ANOD_6 1<<7
//------------------------------------------------------------------------
#define A 1<<6
#define B 1<<7 // A
#define C 1<<3 // F B
#define D 1<<2 // G
#define E 1<<1 // E C
#define F 1<<5 // D
#define G 1<<4
#define H 1<<0
//------------------------------------------------------------------------
#define ZERO (A | B | C | D | E | F)
#define ONE (B | C)
#define TWO (A | B | D | E | G)
#define THREE (A | B | C | D | G)
#define FOUR (B | C | F | G)
#define FIVE (A | C | D | F | G)
#define SIX (A | C | D | E | F | G)
#define SEVEN (A | B | C)
#define EIGHT (A | B | C | D | E | F | G)
#define NINE (A | B | C | D | F | G)
#define SPACE 0
#define CHAR_SPACE 10
//==================
//==================
#define MAX_LED_INDS 6
#define ANODS_MASK (ANOD_1 | ANOD_2 | ANOD_3 | ANOD_4 | ANOD_5 | ANOD_6)
#define KATODS_MASK (A | B | C | D | E | F | G)
//==================
//==================
extern u08 dsp_buf [];
void clr_dsp_buf (void);
//==================
//==================
void _print_val_xxx (u08 x, u08 a);
#define print_val_xxx(x, a) _print_val_xxx(((x)-1), (a))
//==================
//==================
typedef struct index_anods
{
u08 i;
u08 anod;
} index_anods;
//==================
//==================
void set_proc_7_segm_ind_on (void);
void set_proc_7_segm_ind_off (void);
void proc_7_segm_ind (void);
//==================
//==================
#endif
//==================
Спойлер
Код: Выделить всё
//==================
#include "seven_segm_led_ind.h"
//==================
//==================
struct index_anods __flash tab_index_anods [] =
{
{0x01, ANOD_2},
{0x02, ANOD_3},
{0x03, ANOD_4},
{0x04, ANOD_5},
{0x05, ANOD_6},
{0x00, ANOD_1},
};
u08 __flash table_7_segm_char [11] =
{
ZERO, ONE,
TWO, THREE,
FOUR, FIVE,
SIX, SEVEN,
EIGHT, NINE,
SPACE,
};
//==================
//==================
soft_timer ST_PROC_7_SEGM_IND;
//------------------------------------------------------------------------
u08 dsp_buf [MAX_LED_INDS];
//------------------------------------------------------------------------
// Î÷èñòêà áóôåðà äèñïëåÿ.
u08 dsp_buf [MAX_LED_INDS];
void clr_dsp_buf (void)
{
for (u08 i = 0; i < MAX_LED_INDS; i++)
dsp_buf [i] = CHAR_SPACE;
}
//==================
//==================
void _print_val_xxx (u08 x, u08 a) // Âûâîä ÷èñëà â ôîðìàòå xx,x.
{
char *ptr = num_str_buf + 7;
char_to_str (a);
dsp_buf[x] = *ptr; // Âûâîä ñîòåí.
dsp_buf[x++];
ptr++;
dsp_buf[x] = *ptr;
dsp_buf[x++];
ptr++;
dsp_buf[x] = *ptr; // Âûâîä åäèíèö.
}
//==================
//==================
static u08 _proc_7_segm_ind;
void set_proc_7_segm_ind_on (void)
{
_proc_7_segm_ind = 1;
}
void set_proc_7_segm_ind_off (void)
{
ANODS_DDR = 0;
ANODS_PORT = 0;
KATODS_DDR = 0;
_proc_7_segm_ind = 0;
}
void proc_7_segm_ind (void)
{
static u08 cnt_7_segm_ind;
switch (_proc_7_segm_ind)
{
case 0:
break;
case 1:
ANODS_DDR = 0xFF;
cnt_7_segm_ind = 0;
set_soft_timer (ST_PROC_7_SEGM_IND, 1, 1);
_proc_7_segm_ind = 2;
break;
case 2:
if (handle_soft_timer (ST_PROC_7_SEGM_IND))
{
u08 cnt = cnt_7_segm_ind;
u08 anods;
u08 katods;
ANODS_PORT = 0; // В этом месте отключаем светодиоды. Если разные порты,
KATODS_DDR = 0; // значит будет функция или строки, в которых отключение всех пинов всех портов под светодиоды.
cnt_7_segm_ind = tab_index_anods [cnt].i;
anods = tab_index_anods [cnt].anod;
katods = table_7_segm_char [dsp_buf [cnt_7_segm_ind]];
ANODS_PORT = anods; // В этом месте будет функция или строки, пример которых ниже.
KATODS_DDR = katods;
}
break;
default:
break;
}
}
//==================
Спойлер
Код: Выделить всё
void proc_outputs (void)
{
// Вывод сегментов. katods - сегменты. В дальнейшем обзывайте переменные по собственному вкусу.
if (katods & (1<<0)) // К примеру сегмент A
set_bit (PORTB, 0)
else
clr_bit (PORTB, 0)
if (katods & (1<<1)) // Сегмент B
set_bit (PORTD, 0)
else
clr_bit (PORTD, 0)
// и так далее, принцип понятен.
}
