|
Виж темите без отговор | Виж активните теми
Дата и час: Пон Юли 27, 2026 5:29 pm
| Автор |
Съобщение |
|
Niki1
Ранг: Минаващ
Регистриран на: Вто Окт 16, 2012 8:44 pm Мнения: 18
|
 Въпрос за LCD дисплей
Здравейте колеги, опитвам се да направя зарядно за LI-ION и LI-POLYMER батерии с pic16 и LCD екранче което да показва когато е заредена батерията и евентуално да може да се избира между различен ток на зареждане. Но имам проблем със дисплея, явно не мога да го управлявам. Начина на свързване го направих по идеята на един приятел( в някакво списание видях че трябвало да се свърже и R/W със Pic-a но вече всичко е направено, и всичките крачета на микропроцесора са заети). Но също така не съм сигурен и в кода. Черпенето е от мен  само да се покажат пустите буквички 
|
| Сря Окт 31, 2012 9:17 pm |
|
 |
|
didofen
Ранг: Популярен
Регистриран на: Вто Юни 27, 2006 11:13 am Мнения: 381 Местоположение: Варна
|
 Re: Въпрос за LCD дисплей
Не си написал никакви функции. изобщо ли не е тръгнал, какво си успял да направиш?
|
| Чет Ное 01, 2012 10:53 am |
|
 |
|
ike
Ранг: Форумен бог
Регистриран на: Пет Фев 04, 2005 9:59 pm Мнения: 6019 Местоположение: София
|
 Re: Въпрос за LCD дисплей
За този проект можеш да минеш и без LCD само с няколко светодиода. R/W към маса. Контраста не е свързан правилно. С6 или С7 може да го махнеш. И както didofen, каза не си показал никакъв код, така че не можем да гадаем дали е правилен или не.
_________________ Warriors of the Night, ASSEMBLER!!!
|
| Чет Ное 01, 2012 5:33 pm |
|
 |
|
Niki1
Ранг: Минаващ
Регистриран на: Вто Окт 16, 2012 8:44 pm Мнения: 18
|
 Re: Въпрос за LCD дисплей
 |  |  |  | Код: #include "main.h" void LCD_E_Pulse (void) { E_HIGH; E_LOW; }
// Init LCD after reset void LCD_Init (void) { TRISC = 0x03; // E, RS directed as output, D4-D7 as output
// Initialize 4-bit transfer mode PORTC = 0x30; // RS -> LOW, D4, D5 -> HIGH, D6, D7 -> LOW DelayMs(110);
LCD_E_Pulse(); DelayMs(10); LCD_E_Pulse(); DelayMs(10);
LCD_E_Pulse(); DelayMs(10); PORTC = PORTC & (~0x10); LCD_E_Pulse(); }
void LCD_Configurate (void) { LCD_Send (DISP_ON, COMMAND); // Dispplay ON LCD_Send (FUN_1L_5X8D, COMMAND); // Function: 1 line, 5X8 pixels return; }
// Send Data/Command to LCD void LCD_Send (unsigned char Data, unsigned char MetaData) { char Info; DelayMs(1); if (MetaData == COMMAND) RS_LOW; // Send command else RS_HIGH; // Send data
Info = Data & 0xF0;
PORTC = (PORTC & 0x0F) | Info;
LCD_E_Pulse(); // toggle E for LCD Info = (Data & 0x0F); Info = Info << 4;
PORTC = (PORTC & 0x0F) | Info; //send data to LCD
LCD_E_Pulse(); //toggle E for LCD return; }
void LCD_Send_String (const unsigned char str[], char Length) { int i=0; LCD_Send (CLR_DISP, COMMAND); for (i=0; i<8; i++) LCD_Send (str[(i+First)%Length], DATA); return; }
int LCD_Form_Message (char x, int Value) { int i; First = 0; for (i=0; i<9; i++) Number[i] = ' '; if (x==1) { String_Copy (Message, I_MSG); Int_to_String (Number, Value); for (i=2; i<6; i++) Message[i] = Number[i-2]; } else { String_Copy (Message, U_MSG); Int_to_String (Number, Value); for (i=2; i<6; i++) Message[i] = Number[i-2]; } return 10; }
void LCD_Print_Message (const unsigned char Text[]) { char L; First = 0; L = String_Copy (Message, Text); LCD_Send_String (Message, L); return; }
void LCD_Slide_String (unsigned int Timeout, char Length) { while (Timeout) { Timeout--; if (!Timeout) { First = (First + 1) % Length; LCD_Send_String (Message, Length); return; } } return; }
void LCD_Display_State (void) { if (IS_BUTTON2_PRESSED && Released2) { Button2_Timeout = 50000; while (IS_BUTTON2_PRESSED && Button2_Timeout) Button2_Timeout--; if (!Button2_Timeout) { Reset = 1; return; } if (Ready) return; ADC_Init (Channel); Channel = (Channel+1) % 2; // Switch to next analog channel Show_Values = 1; Switch = 1; Released2 = 0; } ADC_Result = ADC_GetResult (10); if ((ADC_Result != Old_Result && !ADC_Timeout && Show_Values && !Ready) || Switch) { //float Value; int Value; Old_Result = ADC_Result; if (Channel==1) Value = (ADC_Result << 1) + (ADC_Result/10); // ADC_Result * 2 + ADC_Result/10 = ADC_Result * 2.1 else Value = (ADC_Result << 2) + ((ADC_Result<<2)/10); // ADC_Result * 4 + (ADC_Result*4)/10 = ADC_Result * 4.4 Length = LCD_Form_Message (Channel, Value); LCD_Send_String (Message, Length); ADC_Timeout=5000; Switch = 0; } if (!IS_BUTTON1_PRESSED) Released1 = 1; if (!IS_BUTTON2_PRESSED) Released2 = 1; if (ADC_Timeout) ADC_Timeout--;
return; } |  |  |  |  |
|
| Чет Ное 01, 2012 8:35 pm |
|
 |
|
Niki1
Ранг: Минаващ
Регистриран на: Вто Окт 16, 2012 8:44 pm Мнения: 18
|
 Re: Въпрос за LCD дисплей
Благодаря ви за бързите отговори. didofen не изкарва нищо на дисплея и мислех че е нещо във хардуера, защото имах проблем с програматора които и сега не работи като хората но уж програмира. ike ще го направя както казваш и ще драсна резултата. Контраста трябва към масата да се свърже или бъркам 
|
| Чет Ное 01, 2012 8:47 pm |
|
 |
|
ike
Ранг: Форумен бог
Регистриран на: Пет Фев 04, 2005 9:59 pm Мнения: 6019 Местоположение: София
|
 Re: Въпрос за LCD дисплей
Контраста понякога трябва да се свърже към -1 или -2 Волта, понякога трябва да се върже с резистор към маса, а понякога направо към маса. Зависи от дисплея и напрежението с което го захранваш.
_________________ Warriors of the Night, ASSEMBLER!!!
|
| Чет Ное 01, 2012 10:00 pm |
|
 |
|
Niki1
Ранг: Минаващ
Регистриран на: Вто Окт 16, 2012 8:44 pm Мнения: 18
|
 Re: Въпрос за LCD дисплей
Значи ми остава варианта с потенциометър 
|
| Чет Ное 01, 2012 10:10 pm |
|
 |
|
Niki1
Ранг: Минаващ
Регистриран на: Вто Окт 16, 2012 8:44 pm Мнения: 18
|
 Re: Въпрос за LCD дисплей
Благодаря ike тръгна дисплея  Но не мога да накарам дисплея да изкара информацията на целия екран: при 1-line -> LCD_Send (FUN_1L_5X8D, COMMAND) изкарва текста на екрана на половина. А при 2-line-> LCD_Send (FUN_2L_5X8D, COMMAND) Също така разреших на дисплея да показва до 16 символа Би трябвало да го изкара на целия но не става
|
| Пон Ное 05, 2012 5:32 pm |
|
 |
|
ike
Ранг: Форумен бог
Регистриран на: Пет Фев 04, 2005 9:59 pm Мнения: 6019 Местоположение: София
|
 Re: Въпрос за LCD дисплей
#define FUN_2L_5X11D 0x2C Това е невалиден режим. Ползвай само FUN_2L_5X8D. Никаде не си казал какъв точно е дисплея, 1х16 ли е? Няма как на дисплея да му разрешаваш и забраняваш колко символа да показва.
_________________ Warriors of the Night, ASSEMBLER!!!
|
| Пон Ное 05, 2012 6:41 pm |
|
 |
|
Niki1
Ранг: Минаващ
Регистриран на: Вто Окт 16, 2012 8:44 pm Мнения: 18
|
 Re: Въпрос за LCD дисплей
Да 1x16 е.
|
| Пон Ное 05, 2012 7:48 pm |
|
 |
|
ike
Ранг: Форумен бог
Регистриран на: Пет Фев 04, 2005 9:59 pm Мнения: 6019 Местоположение: София
|
 Re: Въпрос за LCD дисплей
Добре де защо тогава мълчиш, като комунист на разпит. Дисплея ти е 8+8 втората осмица на кой адрес се намира трябва да провериш в документацията. Слагаш го в режим #define FUN_2L_5X11D 0x2C и му подаваш 80 различни символа, нататък смятам че и сам ще можеш да се ориентираш.
_________________ Warriors of the Night, ASSEMBLER!!!
|
| Пон Ное 05, 2012 8:26 pm |
|
 |
|
didofen
Ранг: Популярен
Регистриран на: Вто Юни 27, 2006 11:13 am Мнения: 381 Местоположение: Варна
|
 Re: Въпрос за LCD дисплей
при 1х16 имаш 80-88 и С0-С8 адреси
|
| Вто Ное 06, 2012 9:55 am |
|
 |
|
stoyanoff
Ранг: Форумен бог
Регистриран на: Чет Юни 25, 2009 1:01 pm Мнения: 2251
|
 Re: Въпрос за LCD дисплей
Ако са ти кът пиновете защо не добавиш буфер м/у контролера и дисплея(поне за информационните пинове)?!
_________________www.elkran.com
|
| Вто Ное 06, 2012 6:26 pm |
|
 |
|
Niki1
Ранг: Минаващ
Регистриран на: Вто Окт 16, 2012 8:44 pm Мнения: 18
|
 Re: Въпрос за LCD дисплей
ike  даже не съм се усетил че не съм написал колко символен е Извинявам се че се замотах с отговора, просто пак започнаха някакви мизерии с микропроцесора и програматора ](./images/smilies/eusa_wall.gif) . ike и didofen благодаря за насоката, ще разгледам datasheet и ще пробвам да го направя. Иначе си реших проблема със слайдване още в началото  ама е много несериозно когато имам 1х16 дисплей, но толкова са ми възможностите. stoyanoff нямам и на идея за какъв буфер става въпрос, ще можеш ли да ми подскажеш как ще стане?
|
| Вто Ное 06, 2012 8:09 pm |
|
 |
|
stoyanoff
Ранг: Форумен бог
Регистриран на: Чет Юни 25, 2009 1:01 pm Мнения: 2251
|
 Re: Въпрос за LCD дисплей
Трябва ти интеграла с няколко D тригера вътре(octal или quad). Тези интеграли имат много голямо входно съпротивление и могат да се навързват към обща магистрала. Изходите им се променят само, когато се подаде сигнал на управляващите им входове. Идеята е, че можеш да си вържеш такава(такива) на някой порт, който вече ползваш за нещо друго, и с останалите малко свободни пинове да я управляваш. Само трябва да знаеш, че при старт на програмата, трябва да установиш изходите на буфера(ите) в 0, за да сработи правилно инициализацията. Поздрави!
_________________www.elkran.com
|
| Вто Ное 06, 2012 8:26 pm |
|
|
Кой е на линия |
Потребители разглеждащи този форум: 0 регистрирани и 7 госта |
|
Вие не можете да пускате нови теми Вие не можете да отговаряте на теми Вие не можете да променяте собственото си мнение Вие не можете да изтривате собствените си мнения Вие не можете да прикачвате файл
|
|