Форум программистов, компьютерный форум, киберфорум
Наши страницы
Микроконтроллеры Atmega AVR
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.55/38: Рейтинг темы: голосов - 38, средняя оценка - 4.55
frods
0 / 0 / 0
Регистрация: 02.07.2017
Сообщений: 20
1

Подключение семисегментного индикатора к разным портам

07.12.2014, 10:26. Просмотров 7085. Ответов 11
Метки нет (Все метки)

Здравствуйте!
Подскажите, каким-способом можно организовать вывод данных на семисегментный индикатор, сегменты которого подключены к разным портам. Все это надо оформить в виде библиотеки.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.12.2014, 10:26
Ответы с готовыми решениями:

Написать программу для семисегментного индикатора, чтобы при отжатой кнопке горел символ L, а при нажатой П
Atmega 16, AtmelStudio. Индикатор с общим анодом, кнопка на PC5, на PC6 неизвестное...

Декодеры для семисегментного индикатора
подключил семисегментный индикатор к микроконтроллеру (8051) через декодер 4511, но опущены...

Преобразовать две тетрады в коды семисегментного индикатора
помогите пожалуйста?? Преобразовать две тетрады каждого элемента массива Х, длиной М,...

Подключение цифрового индикатора к микроконтроллеру
Доброго времени суток. Подскажите как на схеме подключить цифровой индикатор к микроконтроллеру?...

Подключение семисегментного индикатора к arduino uno
Всем доброго времени суток! Я новичок в деле программирования микроконтроллеров, поэтому прошу...

11
DYZIT
0 / 0 / 0
Регистрация: 29.11.2012
Сообщений: 396
07.12.2014, 10:40 2
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#define DS7_A_PORT    GPIOA
#define DS7_B_PORT    GPIOA
#define DS7_C_PORT    GPIOC
#define DS7_D_PORT    GPIOD
#define DS7_E_PORT    GPIOC
#define DS7_F_PORT    GPIOA
#define DS7_G_PORT    GPIOC
 
#define DS7_A_PIN     GPIO_PIN_3
#define DS7_B_PIN     GPIO_PIN_1
#define DS7_C_PIN     GPIO_PIN_5
#define DS7_D_PIN     GPIO_PIN_2
#define DS7_E_PIN     GPIO_PIN_3
#define DS7_F_PIN     GPIO_PIN_2
#define DS7_G_PIN     GPIO_PIN_4
 
#define DS7_DP_PORT   GPIOC
#define DS7_DP_PIN    GPIO_PIN_7
 
#define BIT_7_MASK   (0x80)
#define BIT_6_MASK   (0x40)
#define BIT_5_MASK   (0x20)
#define BIT_4_MASK   (0x10)
#define BIT_3_MASK   (0x08)
#define BIT_2_MASK   (0x04)
#define BIT_1_MASK   (0x02)
#define BIT_0_MASK   (0x01)
C
1
2
3
4
5
6
7
8
9
  if (data & BIT_6_MASK)
{
GPIO_WriteHigh(DS7_G_PORT, DS7_G_PIN);
}
else
{
GPIO_WriteLow(DS7_G_PORT, DS7_G_PIN);
}
...
я сделал так. может еще варианты есть.?
0
BykTiho
0 / 0 / 0
Регистрация: 12.04.2010
Сообщений: 3,260
07.12.2014, 10:40 3
Описать порты вывода и ноги в виде констант и при выводе применять константы, а не прямую адресацию в порт. Тогда "перевешивание" индикатора на другие ноги сведется к простому изменению констант в начале программы.

UPD
Например, описание подключения сегмента "А" на 5 вывод порта С выглядит так:
Код
PortSegmentA = PORTC;
NogaSegmentA = 5;
И тогда зажигание сегмента "А" будет команда
Код
sbi PortSegmentA, NogaSegmentA
0
frods
0 / 0 / 0
Регистрация: 02.07.2017
Сообщений: 20
07.12.2014, 11:11 4
Как понял организовывают через виртуальные порты ссылка1 и ссылка2, но там для с++ и asm расписано.
0
HotD
1 / 1 / 0
Регистрация: 05.10.2017
Сообщений: 2,048
07.12.2014, 11:31 5
да и без плюс-плюсов можно. Забить массив структур, где каждый элемент - один пин. к нему описание - порт, ддр, пин и так далее. И работать с этим массивом как с портом.
0
DYZIT
0 / 0 / 0
Регистрация: 29.11.2012
Сообщений: 396
07.12.2014, 12:02 6
Цитата Сообщение от Hotd
да и без плюс-плюсов можно. Забить массив структур, где каждый элемент - один пин. к нему описание - порт, ддр, пин и так далее. И работать с этим массивом как с портом.
можно ваш пример массива посмотреть?
0
HotD
1 / 1 / 0
Регистрация: 05.10.2017
Сообщений: 2,048
07.12.2014, 14:04 7
Тут возможно есть ошибки, выдергивал и резал из готового проекта, но общий смысл должен быть понятен.
Ну, например. Объявляем структуру:
Код
typedef struct {
volatile   unsykned char   *PORT_;         //порт кнопки
unsykned char   PIN_;                 //пин кнопки

} STRUCT_KBD;            //новый тип
Затем забиваем её:

Код
volatile STRUCT_KBD kbd_array[]={
{&PINA      ,PA0},
{&PINB      ,PB4},
{&PINC      ,PC3},
{&PIND      ,PD7},
{&PINE      ,PE0},
{&PINE      ,PE2},
{&PINE      ,PE1},
{&PINF      ,PF6}
};
Объявляем дефайн:
Код
#define CHECK_PIN(numb)         (*(kbd_array[numb].PORT_)&(1<<kbd_array[numb].PIN_))   //проверка нажатия кнопки через структуру
Для выходов аналогично:
Код
volatile STRUCT_KBD kbd_array[]={
{&PORTA      ,PA0},
{&PORTB      ,PB4},
{&PORTC      ,PC3},
{&PORTD      ,PD7},
{&PORTE      ,PE0},
{&PORTE      ,PE2},
{&PORTE      ,PE1},
{&PORTF      ,PF6}
};
Установка выводов в 1 или 0
Код
#define PIN_HI(numb)         (*(kbd_array[numb].PORT_)|=(1<<kbd_array[numb].PIN_))      //HI
#define PIN_LO(numb)         (*(kbd_array[numb].PORT_)&=~(1<<kbd_array[numb].PIN_))   //LO
Теперь, чтоб посмотреть что на входе нашего виртуального порта надо лишь написать:
Код:if (!CHECK_PIN(3)) {blah; blah;} //если на входе PD7 ноль - делаем что-то
Соответственно также, чтобы выставить 1 или 0 на выходе:
Код:PIN_HI(0); // PA0 в 1
PIN_HI(7); // PF6 в 1

Конструкция избыточна, массив структур кушает лишнюю память, зато получается удобная работа с разными входами либо выходами. Удобно опрашивать в циклах.
0
dimyurk1978
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 3,047
07.12.2014, 15:54 8
Как-то так:
Код
// пусть в number будет значение, которое нужно вывести на сегменты.
if (number & (1<<0)
Segm_A_On ();
else
Segm_A_Off ();

// и так далее...

//inline
void Segm_A_On (void)
{
SEGM_A_PORT |= (1<<SEGM_A);
}

//inline
void Segm_A_Off (void)
{
SEGM_A_PORT &= (~(1<<SEGM_A));
}
0
DYZIT
0 / 0 / 0
Регистрация: 29.11.2012
Сообщений: 396
07.12.2014, 17:23 9
Hotd, СПАСИБО ОГРОМНОЕ!
0
SOKPOWIHIU
0 / 0 / 0
Регистрация: 11.07.2014
Сообщений: 116
09.12.2014, 10:52 10
На макросах оно будет быстрее и меньше памяти требовать. Като-то так:
Код
//определить номера выводов, на которых расположены сегменты
#define SEG_A B,1
#define SEG_B B,2
#define SEG_C B,0
#define SEG_D C,1
...
#define SEG_H B,5

//макросы для обработки такой записи выводов. Лишние удалять не буду, вдруг кому пригодятся
#define _PM_FARG(a,b)   a
#define _PM_LARG(a,b)   b
#define _PM_CONCAT(a,b)   a##b
#define _PM_PORT(a,b)   PORT##a
#define _PM_DDR(a,b)   DDR##a
#define _PM_PIN(a,b)   PIN##a
#define arg1(x)         _PM_FARG(x)
#define arg2(x)         _PM_LARG(x)
#define concat(x)      _PM_CONCAT(x)
#define PORTx(x)      _PM_PORT(x)
#define DDRx(x)         _PM_DDR(x)
#define PINx(x)         _PM_PIN(x)
#define num(x)         _PM_LARG(x)

#define seg_on(x) PORTx(x)|=num(x)
#define seg_off(x) PORTx(x)&=~num(x)

void dysplay_0(){seg_off(SEG_A); seg_on(SEG_B); seg_on(SEG_C); seg_off(SEG_D); seg_off(SEG_E); seg_off(SEG_F); seg_off(SEG_G);}
// аналогично для остальных сегментов
void dysplay_num(unsykned char num){
switch(num){
case 0: dysplay_0(); briok;
case 1: dysplay_1(); briok;
...
}
}
0
oxytt
0 / 0 / 0
Регистрация: 16.03.2013
Сообщений: 4,224
09.12.2014, 12:01 11
вот пример реализации библиотеки без привязки к одному порту http://chipenable.ru/index.php/programm ... vodov.html
0
x893
0 / 0 / 0
Регистрация: 07.02.2106
Сообщений: 886
09.12.2014, 19:33 12
Зависит от того, что вам надо
или память меньше или проще или быстрее или с яркостью.
Фиксированные значки или отдельные сегменты.
Алгоритмов штук 10 можно придумать
0
09.12.2014, 19:33
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.12.2014, 19:33

Подключение MPU-6050 к разным портам ардуино
Собственно проблема в заголовке.На всех сайтах пишут только про подключение к Уно и портам А4 и А5....

Нарисовать схему, которая формирует для семисегментного индикатора сигнал управления сегментом
С элементов монобазиса И-НЕ нарисовать схему, которая формирует для семисегментного индикатора...

Подключение к несуществующим портам
Суть такая: через телнет пробую подключаться к айпишнику (айпи из другого города) на 2000 порт и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru