|
работа с LCD, помощ чайнику |
|
|
|
Jun 15 2011, 12:37
|

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

|
Цитата(Zelepuk @ Jun 15 2011, 14:30)  Хочу написать функцию, чтобы можно было легко выводить данные на дисплей. Данные - 8-значаное число.
Хочется на выходе иметь что-то вроде функции:
LCDout(X);
как составляются подобные библиотеки? Благодарен за любую помощь...
Спрашиваю потому что с простым выводом разобрался(с помощью цикла, напрмиер число просто вывести, но это неудобно и не универсально).
Но есть вопрос: Почему когда вывожу один сегмент - всё чётко. Когда засвечиваю все сегменты на дисплее - всё мерцает, причём мерцает если смотреть прямо, если под углом - всё нормально. Почему так? С конца:  1. не понятно о каком индикаторе (тип) идет речь. Возможно 7-сегментный? С контроллером? 2. покажите код вывода на индикатор, угадать "что именно делается не так" - не представляется возможным. 3. Чем не устраивают стандартные функции работы со строками?
|
|
|
|
|
Jun 15 2011, 13:13
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
Jun 15 2011, 13:30
|
Знающий
   
Группа: Участник
Сообщений: 634
Регистрация: 27-10-10
Пользователь №: 60 464

|
Спасибо за ответы. У меня микроконтроллер MSP430F47197. Как вижу там нет никаких резисторов. Речь идёт о "стекле" без контроллера. Микроконтроллер заказной и там полно сегментов кроме основной строки. Для зажигания сегментов просто пишу в соответствующий LCDMEM[x] константу. С функциями для вывода строк ещё можно разобраться (ковыряю примеры)... но почему мерцает дисплей, когда все сегменты горят - непонятно. Когда зажигаю один, два , десять сегментов - всё нормально. Как только зажигаю все - мерцание. Цитата(izerg @ Jun 15 2011, 16:37)  С конца:  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 }
|
|
|
|
|
Jun 15 2011, 15:13
|
Группа: Новичок
Сообщений: 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 Как составляются подобные библиотеки? Благодарен за любую помощь...
|
|
|
|
|
Jun 15 2011, 20:18
|

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

|
QUOTE (Zelepuk @ Jun 15 2011, 16:30)  У меня микроконтроллер MSP430F47197. Как вижу там нет никаких резисторов. Да, у вас они внутри кристалла. В предыдуших контроллерах они вешались на входы V1-V5. Последняя версия - какая у вас частота ACLK? Вы ее делите на 32 и должны получить частоту фрейма 30-100Гц. Если же у вас частота фреймов получилась выше - емкости сегментов не успевают перезаряжаться а жидкие кристаллы - повернуться  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)
|
|
|
|
|
Jun 16 2011, 06:55
|
Знающий
   
Группа: Участник
Сообщений: 634
Регистрация: 27-10-10
Пользователь №: 60 464

|
Цитата(Сергей Борщ @ Jun 16 2011, 00:18)  Да, у вас они внутри кристалла. В предыдуших контроллерах они вешались на входы V1-V5. Последняя версия - какая у вас частота ACLK? Вы ее делите на 32 и должны получить частоту фрейма 30-100Гц. Если же у вас частота фреймов получилась выше - емкости сегментов не успевают перезаряжаться а жидкие кристаллы - повернуться  у меня же есть строка LCDACTL = LCDON+LCD4MUX; // 4mux LCD, ACLK/32 32 - это минимальный делитель. всё равно мерцает, если зажечь все сегменты, вот если только несколько, то всё нормально. Причём я заетил, что если выключить настольную лампу, которая светила прямо в дисплей, то мерцание пропадает. Посему, видимо, это особенности дисплея.
Сообщение отредактировал Zelepuk - Jun 16 2011, 07:00
|
|
|
|
|
Jun 16 2011, 09:27
|

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

|
QUOTE (Zelepuk @ Jun 16 2011, 09:55)  у меня же есть строка LCDACTL = LCDON+LCD4MUX; // 4mux LCD, ACLK/32
32 - это минимальный делитель. Но мы ведь не знаем, сколько вы делите на 32?  QUOTE (rezident @ Jun 16 2011, 11:01)  Это особенности не дисплея, а человеческого зрения. Стробоскопический эффект называется. Почему тогда он не проявляется на небольшом количестве сегментов?
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jun 17 2011, 07:40
|

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

|
Не вижу в приведенном коде что такое "шаг" ? Что-бы понять логику вывода "значения переменной" на "экран" - пройдите один раз всю математику на бумаге, без функций, компиляторов. Чисто логически пройти, по-шагово, например: "вот есть переменная, она содержит значение 15, это две цифры 1 и 5, значит на экран надо вывести два символа '1' '5', что-бы на экране был символ '1' нужно включить сегменты B и C, чтобы включить эти сегменты - нужно записать 1 в ячейку памяти связанную с этим сегментом.... ". Что-то в таком духе.
Приведенная "непонятная функция" - просто копирует готовый к выводу массив в память сегментов.
P.S. lcd_cell_t - это указатель. P.P.S. учебник по С... любой.
|
|
|
|
|
Jun 17 2011, 08:29
|
Знающий
   
Группа: Участник
Сообщений: 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
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|