Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: работа с LCD
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > MSP430
Zelepuk
Хочу написать функцию, чтобы можно было легко выводить данные на дисплей. Данные - 8-значаное число.

Хочется на выходе иметь что-то вроде функции:

LCDout(X);

как составляются подобные библиотеки?
Благодарен за любую помощь...

Спрашиваю потому что с простым выводом разобрался(с помощью цикла, напрмиер число просто вывести, но это неудобно и не универсально).

Но есть вопрос:
Почему когда вывожу один сегмент - всё чётко. Когда засвечиваю все сегменты на дисплее - всё мерцает, причём мерцает если смотреть прямо, если под углом - всё нормально. Почему так?
skripach
Предлагаю написать свой putchar + шришты и использовать printf.
izerg
Цитата(Zelepuk @ Jun 15 2011, 14:30) *
Хочу написать функцию, чтобы можно было легко выводить данные на дисплей. Данные - 8-значаное число.

Хочется на выходе иметь что-то вроде функции:

LCDout(X);

как составляются подобные библиотеки?
Благодарен за любую помощь...

Спрашиваю потому что с простым выводом разобрался(с помощью цикла, напрмиер число просто вывести, но это неудобно и не универсально).

Но есть вопрос:
Почему когда вывожу один сегмент - всё чётко. Когда засвечиваю все сегменты на дисплее - всё мерцает, причём мерцает если смотреть прямо, если под углом - всё нормально. Почему так?


С конца: sm.gif
1. не понятно о каком индикаторе (тип) идет речь. Возможно 7-сегментный? С контроллером?
2. покажите код вывода на индикатор, угадать "что именно делается не так" - не представляется возможным.
3. Чем не устраивают стандартные функции работы со строками?
Сергей Борщ
QUOTE (izerg @ Jun 15 2011, 15:37) *
1. не понятно о каком индикаторе (тип) идет речь. Возможно 7-сегментный? С контроллером?
Телепатирую - раз упомянуты сегменты и MSP430 - речь о 7-сегментном "стекле" и встроенном в MSP430 контроллере ЖКИ.
Если я угадал, то автору вопроса: вероятно номиналы резисторов делителя напряжений для стекла слишком большие для емкости сегментов вашего индикатора. Пробуйте уменьшать их.
Zelepuk
Спасибо за ответы. У меня микроконтроллер MSP430F47197. Как вижу там нет никаких резисторов.

Речь идёт о "стекле" без контроллера.
Микроконтроллер заказной и там полно сегментов кроме основной строки.
Для зажигания сегментов просто пишу в соответствующий LCDMEM[x] константу.
С функциями для вывода строк ещё можно разобраться (ковыряю примеры)... но почему мерцает дисплей, когда все сегменты горят - непонятно. Когда зажигаю один, два , десять сегментов - всё нормально. Как только зажигаю все - мерцание.



Цитата(izerg @ Jun 15 2011, 16:37) *
С конца: sm.gif
1. не понятно о каком индикаторе (тип) идет речь. Возможно 7-сегментный? С контроллером?
2. покажите код вывода на индикатор, угадать "что именно делается не так" - не представляется возможным.
3. Чем не устраивают стандартные функции работы со строками?



#include <msp430x471x7.h>

// LCD segment definitions.
#define h 0x80
#define e 0x40
#define g 0x20
#define f 0x10
#define d 0x08
#define c 0x04
#define b 0x02
#define a 0x01


void main(void)
{
volatile unsigned int i;

WDTCTL = WDTPW +WDTHOLD; // Stop WDT
FLL_CTL0 |= XCAP14PF; // Configure load caps

// Wait for xtal to stabilize
do
{
IFG1 &= ~OFIFG; // Clear OSCFault flag
for (i = 0x47FF; i > 0; i--); // Time for flag to set
}
while ((IFG1 & OFIFG)); // OSCFault flag still set?

P5SEL =BIT1+BIT2+BIT3+BIT4; // Set COM pins for LCD
LCDACTL = LCDON+LCD4MUX; // 4mux LCD, ACLK/32
LCDAPCTL0 = 0xFF; // Segments 0-31
LCDAPCTL1 = 0x3;
for( i = 0; i < 20; i ++)
{
LCDMEM[i] = 0; // Clear LCD
}

for (i=0;i<20;i++) // зажигаю все сегменты
{
LCDMEM[i] = 0xFF;
}

_BIS_SR(LPM3_bits); // Enter LPM3

}
term83
ПОМОГИТЕ. ЕСТЬ ДИСПЛЭЙ DG16080 как его запустит в графическом режиме с MSP430F249 ЕСЛИ;
4.RS-P1.0
5.R\W-P1.1
6.E-P1.2
7.DB0-P4.0
8.DB1-P4.1
9.DB2-P4.2
10.DB3-P4.3
11.DB4-P4.4
12.DB5-P4.5
13.DB6-P4.6
14.DB7-P4.7 Как составляются подобные библиотеки? Благодарен за любую помощь...
Сергей Борщ
QUOTE (Zelepuk @ Jun 15 2011, 16:30) *
У меня микроконтроллер MSP430F47197. Как вижу там нет никаких резисторов.
Да, у вас они внутри кристалла. В предыдуших контроллерах они вешались на входы V1-V5. Последняя версия - какая у вас частота ACLK? Вы ее делите на 32 и должны получить частоту фрейма 30-100Гц. Если же у вас частота фреймов получилась выше - емкости сегментов не успевают перезаряжаться а жидкие кристаллы - повернуться wink.gif


QUOTE (term83 @ Jun 15 2011, 18:13) *
ПОМОГИТЕ. ЕСТЬ ДИСПЛЭЙ DG16080 как его запустит в графическом режиме с MSP430F249
Воспитанные люди не встревают в чужие активные ветки с вопросами не по теме дискуссии. Что вам мешало начать свою ветку?
Вам надо внимательно изучить даташит на ваш индикатор, узнать марку установленного в нем (в индикаторе) контроллера, скачать и изучить даташит на этот контроллер и написать программу, которая дергая ноги вашего MSP430F249 будет подавать в контроллер дисплея нужные вам команды.
Zelepuk
Цитата(Сергей Борщ @ Jun 16 2011, 00:18) *
Да, у вас они внутри кристалла. В предыдуших контроллерах они вешались на входы V1-V5. Последняя версия - какая у вас частота ACLK? Вы ее делите на 32 и должны получить частоту фрейма 30-100Гц. Если же у вас частота фреймов получилась выше - емкости сегментов не успевают перезаряжаться а жидкие кристаллы - повернуться wink.gif


у меня же есть строка
LCDACTL = LCDON+LCD4MUX; // 4mux LCD, ACLK/32

32 - это минимальный делитель.

всё равно мерцает, если зажечь все сегменты, вот если только несколько, то всё нормально.


Причём я заетил, что если выключить настольную лампу, которая светила прямо в дисплей, то мерцание пропадает.

Посему, видимо, это особенности дисплея.
rezident
Цитата(Zelepuk @ Jun 16 2011, 11:55) *
Причём я заетил, что если выключить настольную лампу, которая светила прямо в дисплей, то мерцание пропадает.

Посему, видимо, это особенности дисплея.

Это особенности не дисплея, а человеческого зрения. Стробоскопический эффект называется.
Сергей Борщ
QUOTE (Zelepuk @ Jun 16 2011, 09:55) *
у меня же есть строка
LCDACTL = LCDON+LCD4MUX; // 4mux LCD, ACLK/32

32 - это минимальный делитель.
Но мы ведь не знаем, сколько вы делите на 32? wink.gif

QUOTE (rezident @ Jun 16 2011, 11:01) *
Это особенности не дисплея, а человеческого зрения. Стробоскопический эффект называется.
Почему тогда он не проявляется на небольшом количестве сегментов?
rezident
Цитата(Сергей Борщ @ Jun 16 2011, 14:27) *
Почему тогда он не проявляется на небольшом количестве сегментов?

А пускай топикстартер сделает небольшой переконтраст так, чтобы ле-е-егонькая засветка всего экрана появилась. Тогда эффект мерцания будет заметен при любом количестве сегментов. Естественно наблюдать следует при включенной лампе.
Zelepuk
Да всё верно. Прблема решена.
Может у кого нибудь есть драйвер с коментариями для подобных дисплеем?
Нимогу принцип вывода числа в формате uint понять... функция должна принимать uint и ещё несколько параметров (длинна, шаг...) не могу понять как это логически связано...

например есть такая функция в примере от TI

void LCDcharsx(const lcd_cell_t *s, int pos, int len)
{
if (lcd_pos_step < 0)
pos = -pos;
if (abs(lcd_pos_step) > 1)
pos <<= 1;
pos = lcd_pos_base + pos;
for ( ; len > 0; --len)
{
LCDMEM[pos] = *s & 0xFF;
pos += (lcd_pos_step >> 1);
LCDMEM[pos] = *s >> 8;
s++;
pos += (lcd_pos_step >> 1);
}
}

не совсем понятно как работает. Может кому не жалко драгоценного времени объясните...
Заранее спасибо.

P.S. lcd_cell_t - это uint16.
izerg
Не вижу в приведенном коде что такое "шаг" ?
Что-бы понять логику вывода "значения переменной" на "экран" - пройдите один раз всю математику на бумаге, без функций, компиляторов. Чисто логически пройти, по-шагово, например: "вот есть переменная, она содержит значение 15, это две цифры 1 и 5, значит на экран надо вывести два символа '1' '5', что-бы на экране был символ '1' нужно включить сегменты B и C, чтобы включить эти сегменты - нужно записать 1 в ячейку памяти связанную с этим сегментом.... ". Что-то в таком духе.

Приведенная "непонятная функция" - просто копирует готовый к выводу массив в память сегментов.

P.S. lcd_cell_t - это указатель.
P.P.S. учебник по С... любой.
Zelepuk
Цитата(izerg @ Jun 17 2011, 11:40) *
Не вижу в приведенном коде что такое "шаг" ?
Что-бы понять логику вывода "значения переменной" на "экран" - пройдите один раз всю математику на бумаге, без функций, компиляторов. Чисто логически пройти, по-шагово, например: "вот есть переменная, она содержит значение 15, это две цифры 1 и 5, значит на экран надо вывести два символа '1' '5', что-бы на экране был символ '1' нужно включить сегменты B и C, чтобы включить эти сегменты - нужно записать 1 в ячейку памяти связанную с этим сегментом.... ". Что-то в таком духе.

Приведенная "непонятная функция" - просто копирует готовый к выводу массив в память сегментов.

P.S. lcd_cell_t - это указатель.
P.P.S. учебник по С... любой.


понятно что указатель. Просто я написал для справки что это пользовательский тип данных uint16
rezident
Цитата(Zelepuk @ Jun 17 2011, 10:43) *
Да всё верно. Прблема решена.

Что верно? Как решена? Тут на вас люди время тратят, а вам лень подробности описать?

По поводу вывода на LCD. Для начала вам нужны сами фонты и функция для вывода символа в память LCD выбранным фонтом. Затем нужна функция для преобразования BCD (двоичного кода в десятичный). Затем функция преобразования BCD в коды фонтов. Если фонты у вас будут в какой-либо "общеупотребительной" кодировке - Win-1251, KOI-8, UTF, то возможно использование уже готовых (стандартных) функций преобразования.
Zelepuk
Цитата(rezident @ Jun 17 2011, 13:05) *
Что верно? Как решена? Тут на вас люди время тратят, а вам лень подробности описать?

По поводу вывода на LCD. Для начала вам нужны сами фонты и функция для вывода символа в память LCD выбранным фонтом. Затем нужна функция для преобразования BCD (двоичного кода в десятичный). Затем функция преобразования BCD в коды фонтов. Если фонты у вас будут в какой-либо "общеупотребительной" кодировке - Win-1251, KOI-8, UTF, то возможно использование уже готовых (стандартных) функций преобразования.


Проблема решена тем что нужно было верный делитель выбрать для ACLK и не светить ламбой на дисплей.

Что значит фонты нужны? Мне нужно выводить числа и иконки на дисплее(отельные сегменты) зажигать вот и всё.
rezident
Цитата(Zelepuk @ Jun 17 2011, 19:27) *
Проблема решена тем что нужно было верный делитель выбрать для ACLK и не светить ламбой на дисплей.

Т.е. емкости сегментов перезаряжаться не успевали, как предположил Сергей Борщ? Или изменив частоту мультиплекса, вы просто "замазали" проблему тем, что частота биений между ним и частотой промышленной сети стала другой, менее заметной на глаз?
Цитата(Zelepuk @ Jun 17 2011, 19:27) *
Что значит фонты нужны? Мне нужно выводить числа и иконки на дисплее(отельные сегменты) зажигать вот и всё.

Присмотритесь внимательно к изображению на экране вашего монитора. Если не видно, то вооружите свои глаза, взяв увеличительное стекло. Видите? Числа/буквы/символы в изображении состоят из отдельных светящихся и не светящихся элементов. Чтобы вы могли выводить на свой LCD подобные символы и картинки вам следует заранее "изготовить" их, создав фонты и пиктограммы. Тогда при выводе символа вам достаточно просто преобразовывать его код (например, символ "9", имее код ASCII 0x39) в индекс таблицы, в которой у вас будут содержаться заготовленные вами фонты и/или пиктограммы. Как пример программы с помощью которой можно создавать свои фонты посмотрите LCD Icon & Font Editor. Она конечно не бесплатная, но на где-то форуме caxapa.ru выкладывали ссылку на "вылеченную" версию этой программы.
Zelepuk
Цитата(rezident @ Jun 17 2011, 22:24) *
Т.е. емкости сегментов перезаряжаться не успевали, как предположил Сергей Борщ? Или изменив частоту мультиплекса, вы просто "замазали" проблему тем, что частота биений между ним и частотой промышленной сети стала другой, менее заметной на глаз?

Незнаю. Я просто заменил ACLK/128 на ACLK/32

Цитата(rezident @ Jun 17 2011, 22:24) *
Присмотритесь внимательно к изображению на экране вашего монитора. Если не видно, то вооружите свои глаза, взяв увеличительное стекло. Видите? Числа/буквы/символы в изображении состоят из отдельных светящихся и не светящихся элементов. Чтобы вы могли выводить на свой LCD подобные символы и картинки вам следует заранее "изготовить" их, создав фонты и пиктограммы. Тогда при выводе символа вам достаточно просто преобразовывать его код (например, символ "9", имее код ASCII 0x39) в индекс таблицы, в которой у вас будут содержаться заготовленные вами фонты и/или пиктограммы. Как пример программы с помощью которой можно создавать свои фонты посмотрите LCD Icon & Font Editor. Она конечно не бесплатная, но на где-то форуме caxapa.ru выкладывали ссылку на "вылеченную" версию этой программы.

Я вас понял, но, возможно, мы говорим о разных вещах? У меня, как это сказать, не графический дисплей, а простое стекло с иконками и 7сегментными цифрами (как на калькуляторе). Просто подав напряжение на соответствующий пин можно зажечь соответствующую иконку. Писать буквы на таком дисплее не очень удобно. Нужно выводить 7-сегментные цифры (две строки) и зажигать иконки.
Вот я и затрудняюсь сделать функцию для вывода например числа в uint16 на мой дисплей (в область 7 сегментных цифр).
Прилагаю файл-изображение дисплея.
One
Цитата(rezident @ Jun 17 2011, 22:24) *
... Или изменив частоту мультиплекса, вы просто "замазали" проблему тем, что частота биений между ним и частотой промышленной сети стала другой, менее заметной на глаз? ...

скорее всего "мерцание" возникало именно из-за стробоскопического эффекта обусловленного этими биениями ...
проверить просто - посветив "энергосберегайкой" или ЛДС: "мерцание" или исчезнет (или изменится его частота), или "мерцать" будут другие элементы ...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.