реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> работа с LCD, помощ чайнику
Zelepuk
сообщение Jun 15 2011, 11:30
Сообщение #1


Знающий
****

Группа: Участник
Сообщений: 634
Регистрация: 27-10-10
Пользователь №: 60 464



Хочу написать функцию, чтобы можно было легко выводить данные на дисплей. Данные - 8-значаное число.

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

LCDout(X);

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

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

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

Сообщение отредактировал Zelepuk - Jun 15 2011, 11:46
Go to the top of the page
 
+Quote Post
skripach
сообщение Jun 15 2011, 12:36
Сообщение #2


■ ■ ■ ■
*****

Группа: Свой
Сообщений: 1 100
Регистрация: 9-08-06
Пользователь №: 19 443



Предлагаю написать свой putchar + шришты и использовать printf.


--------------------
Делай что должен и будь что будет.
Go to the top of the page
 
+Quote Post
izerg
сообщение Jun 15 2011, 12:37
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 531
Регистрация: 1-02-05
Из: Украина, Киев
Пользователь №: 2 342



Цитата(Zelepuk @ Jun 15 2011, 14:30) *
Хочу написать функцию, чтобы можно было легко выводить данные на дисплей. Данные - 8-значаное число.

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

LCDout(X);

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

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

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


С конца: sm.gif
1. не понятно о каком индикаторе (тип) идет речь. Возможно 7-сегментный? С контроллером?
2. покажите код вывода на индикатор, угадать "что именно делается не так" - не представляется возможным.
3. Чем не устраивают стандартные функции работы со строками?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 15 2011, 13:13
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



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


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Zelepuk
сообщение Jun 15 2011, 13:30
Сообщение #5


Знающий
****

Группа: Участник
Сообщений: 634
Регистрация: 27-10-10
Пользователь №: 60 464



Спасибо за ответы. У меня микроконтроллер 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

}
Go to the top of the page
 
+Quote Post
term83
сообщение Jun 15 2011, 15:13
Сообщение #6





Группа: Новичок
Сообщений: 7
Регистрация: 30-05-10
Пользователь №: 57 640



ПОМОГИТЕ. ЕСТЬ ДИСПЛЭЙ 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 Как составляются подобные библиотеки? Благодарен за любую помощь...
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 15 2011, 20:18
Сообщение #7


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



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 будет подавать в контроллер дисплея нужные вам команды.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Zelepuk
сообщение Jun 16 2011, 06:55
Сообщение #8


Знающий
****

Группа: Участник
Сообщений: 634
Регистрация: 27-10-10
Пользователь №: 60 464



Цитата(Сергей Борщ @ Jun 16 2011, 00:18) *
Да, у вас они внутри кристалла. В предыдуших контроллерах они вешались на входы V1-V5. Последняя версия - какая у вас частота ACLK? Вы ее делите на 32 и должны получить частоту фрейма 30-100Гц. Если же у вас частота фреймов получилась выше - емкости сегментов не успевают перезаряжаться а жидкие кристаллы - повернуться wink.gif


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

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

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


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

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

Сообщение отредактировал Zelepuk - Jun 16 2011, 07:00
Go to the top of the page
 
+Quote Post
rezident
сообщение Jun 16 2011, 08:01
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



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

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

Это особенности не дисплея, а человеческого зрения. Стробоскопический эффект называется.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jun 16 2011, 09:27
Сообщение #10


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



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) *
Это особенности не дисплея, а человеческого зрения. Стробоскопический эффект называется.
Почему тогда он не проявляется на небольшом количестве сегментов?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
rezident
сообщение Jun 16 2011, 11:43
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(Сергей Борщ @ Jun 16 2011, 14:27) *
Почему тогда он не проявляется на небольшом количестве сегментов?

А пускай топикстартер сделает небольшой переконтраст так, чтобы ле-е-егонькая засветка всего экрана появилась. Тогда эффект мерцания будет заметен при любом количестве сегментов. Естественно наблюдать следует при включенной лампе.
Go to the top of the page
 
+Quote Post
Zelepuk
сообщение Jun 17 2011, 05:43
Сообщение #12


Знающий
****

Группа: Участник
Сообщений: 634
Регистрация: 27-10-10
Пользователь №: 60 464



Да всё верно. Прблема решена.
Может у кого нибудь есть драйвер с коментариями для подобных дисплеем?
Нимогу принцип вывода числа в формате 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.

Сообщение отредактировал Zelepuk - Jun 17 2011, 05:48
Go to the top of the page
 
+Quote Post
izerg
сообщение Jun 17 2011, 07:40
Сообщение #13


Знающий
****

Группа: Свой
Сообщений: 531
Регистрация: 1-02-05
Из: Украина, Киев
Пользователь №: 2 342



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

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

P.S. lcd_cell_t - это указатель.
P.P.S. учебник по С... любой.
Go to the top of the page
 
+Quote Post
Zelepuk
сообщение Jun 17 2011, 08:29
Сообщение #14


Знающий
****

Группа: Участник
Сообщений: 634
Регистрация: 27-10-10
Пользователь №: 60 464



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

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

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


понятно что указатель. Просто я написал для справки что это пользовательский тип данных uint16
Go to the top of the page
 
+Quote Post
rezident
сообщение Jun 17 2011, 09:05
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(Zelepuk @ Jun 17 2011, 10:43) *
Да всё верно. Прблема решена.

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

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

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 25th June 2025 - 03:48
Рейтинг@Mail.ru


Страница сгенерированна за 0.01481 секунд с 7
ELECTRONIX ©2004-2016