Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

LCD 122x32 странни проблеми
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=8106
Страница 1 от 2

Автор:  amdatlon [ Нед Сеп 05, 2010 12:23 am ]
Заглавие:  LCD 122x32 странни проблеми

Здравейте , опитвам се да подкарам един графичен LCD 122 x 32

4GLM12232-2 Sed1520 Модел

Не можах да намеря готов драйвер който да работи и остана да се опитам да си сглобя такъв . Не знам къде бъркам ( защото сигурно бъркам някъде ) , дали при инициялизацията или при самия начин на подаване на командите към ЛСД-то , или ... знам ли . Толкова начини и варианти пробвах че ми е като бъркани яйца в главата :)

Моля ако някой иска да даде едно рамо , и да погледне кода , за ме насочи в правилната посока .

При инициялизация се получават едни старнни картинки по дисплея , а уж следвам PDF-a му инструкциите . :?

http://www.mcu-bg.com/mcu_site/exchange ... 0__165.rar

Това е при увеличен контраст :

Изображение

Изображение


Код:



/* Това е само драйвера , Главната програма е цикъл и ф-ята за инициализация + ф-я за изчетраване на един пиксел
       InitSED1520();
       glcd_pixell(10,2,1);
*/


#define DISPLAY_ON 0xAF             //   10101111
#define DISPLAY_OFF 0xAE            //   10101110
#define DISPLAY_START_LINE 0xC0     //   11000000     
#define PAGE_ADDRESS_SET 0xB8       //   10111000
#define COLUMN_ADDRESS_SET 0x00     //   00000000
#define ADC_CLOCKWISE 0xA0          //   10100000   Right
#define ADC_COUNTERCLOCKWISE 0xA1   //   10100001
#define STATIC_DRIVE_ON 0xA5        //   10100101 
#define STATIC_DRIVE_OFF 0xA4       //   10100100
#define DUTY_RATIO_16 0xA8          //   10101000
#define DUTY_RATIO_32 0xA9          //   10101001
#define READ_MODIFY_WRITE 0xE0      //   11100000
#define END_READ_MODIFY 0xEE        //   11101110
#define RESET 0xE2                  //   11100010

#define SCREEN_WIDTH   122
#define SCREEN_HEIGHT 32








// PICCore Pin definitions----------//
#define LCD_RES     PIN_A5          // 7   LCD reset pin
#define LCD_CS1     PIN_E1          // 9   Enable Left Side of LCD
#define LCD_CS2     PIN_E2          // 10  Enable Right Side of LCD
#define LCD_RW      PIN_C1          // 16  Read/Write
#define LCD_A0      PIN_C0          // 15  Control or Data
#define LCD_BL      PIN_C2          // 17  LCD B/L
#define B0          PIN_D0          // 19  Databus 0
#define B1          PIN_D1          // 20  Databus 1
#define B2          PIN_D2          // 21  Databus 2
#define B3          PIN_D3          // 22  Databus 3
#define B4          PIN_D4          // 27  Databus 4
#define B5          PIN_D5          // 28  Databus 5
#define B6          PIN_D6          // 29  Databus 6
#define B7          PIN_D7          // 30  Databus 7
#define DataPort      D             //    Databus 7
// Tell CCS Graphics.c how big the display is
#define GLCD_WIDTH   122            // Number of Horizontal pixels
#define GLCD_HEIGHT   32            // Number of Vertical Pixels

#define LEFT    1
#define RIGHT   0

// Global Variables for this application (LCD)
int   SIDE;                         // Left or Right side of LCD

// Function Prototype for CCS Graphics.c driver
void glcd_pixell(int8, int8, int1);  // Required for CCS GRAPHICS.C




//===============================================================
// command_write (Cdata)
// Write command data to the LCD
// See SED1520 datasheet for more info
//===============================================================
void LCDCWrite(int8 CData)           // Write Instruction to LCD
  {
 
      OUTPUT_LOW(LCD_CS1);
      OUTPUT_LOW(LCD_CS2);
       
      OUTPUT_LOW(LCD_RW); 
      OUTPUT_LOW(LCD_A0);     
      delay_us(2);
     
 
  if (SIDE==LEFT)
    {
   
     
     OUTPUT_HIGH(LCD_CS1);
   
     OUTPUT_D(CData);
     delay_us(2);
     OUTPUT_LOW(LCD_CS1);
     
               
    }
else // The RIGHT hand side
    {

   
   
     OUTPUT_HIGH(LCD_CS2);
   
     OUTPUT_D(CData);
     delay_us(1);
     OUTPUT_LOW(LCD_CS2);
       
    }
 
  delay_us(1);
 
 

//===============================================================
// Data write (DData)
// Writes display data to the LCD
//===============================================================
void LCDWrite(int8 DData)               // Write Data to LCD
  {
                // We are going to WRITE Data
  // if(SIDE==LEFT)OUTPUT_LOW(LCD_CS1);   // If Left side then use CS1
  // if(SIDE==RIGHT)OUTPUT_LOW(LCD_CS2);  // If Right side then use CS2
  // delay_cycles(2);
         // Instruction (not display data)

{
 
      OUTPUT_LOW(LCD_CS1);
      OUTPUT_LOW(LCD_CS2);
       
      OUTPUT_LOW(LCD_RW); 
      OUTPUT_HIGH(LCD_A0);     
      delay_us(1);
     
 
  if (SIDE==LEFT)
    {
   
     
     OUTPUT_HIGH(LCD_CS1);
   
     OUTPUT_D(DData);
     delay_us(1);
     OUTPUT_LOW(LCD_CS1);
     
               
    }
else // The RIGHT hand side
    {

   
   
     OUTPUT_HIGH(LCD_CS2);
   
     OUTPUT_D(DData);
     delay_us(1);
     OUTPUT_LOW(LCD_CS2);
       
    }
 
  delay_us(1);
 
 
   
}
  }


//===============================================================
// Display data read
// Reads the display data pointed to by the page, column and
// chip select. Returns the data.
//===============================================================
int8 LCDRead()                          // Read Data from LCD
  {
   int8 DData;

   if(SIDE==LEFT) OUTPUT_HIGH(LCD_CS1);
   if(SIDE==RIGHT) OUTPUT_HIGH(LCD_CS2);   
delay_cycles(2);
   OUTPUT_HIGH(LCD_A0);                 // Data
   OUTPUT_HIGH(LCD_RW);                // Read Data
   if(SIDE==LEFT)OUTPUT_LOW(LCD_CS1);
   if(SIDE==RIGHT)OUTPUT_LOW(LCD_CS2);
   delay_cycles(2);

    set_tris_D(0xff);// set_tris_b(0xff);   // Allow LCD to drive the data lines
   
   if(SIDE==LEFT) OUTPUT_HIGH(LCD_CS1);
   if(SIDE==RIGHT) OUTPUT_HIGH(LCD_CS2);

   delay_cycles(50);
   
   
   DData=INPUT_D(); // DData=INPUT_B();                   // Get the data
   
   
   if(SIDE==LEFT) OUTPUT_LOW(LCD_CS1);
   if(SIDE==RIGHT) OUTPUT_LOW(LCD_CS2);
   delay_cycles(2);

return(DData);
}

//===============================================================
// Draw a single pixel
// This is required by the Graphics.c driver file provided by
//CCS. It tells the driver how to draw a single pixel anywhere
// on the LCD display
// x=1 to 122      y=1 to 32     color=1=ON    color=0=OFF
//===============================================================
void glcd_pixell(int8 x, int8 y, int1 color)   
{
int8 ucMask;
int8 i;
int8 Data;
int8 page,Col;


   
      Col=(x - (SCREEN_WIDTH/2));
   
   
page=1;



LCDCWrite(PAGE_ADDRESS_SET+Page);

LCDCWrite(COLUMN_ADDRESS_SET+Col);


LCDCWrite(READ_MODIFY_WRITE);                       // Start R-M-Write operation
  LCDRead();                          // Dummy Read
  Data = LCDRead();                      // Read LCD dissplay data


  ucMask = 1;                           // Create a bit mask of the
  for (i=1;i<y;i++)                      // pixel to change
       ucMask<<=1;                      //

  if (color)
    {
    Data|=ucMask;              // Set or clear the pixel as
    }
  else   {Data&=~ucMask; }// requested
 
  LCDWrite(Data);
LCDCWrite(END_READ_MODIFY);


}

//===================================================================
// Initialise the SED11520 controllers
// for the display type we are using
//===================================================================
void InitSED1520()
{
int8 i;
 
     OUTPUT_LOW(LCD_RES);
         delay_us(2);
     OUTPUT_HIGH(LCD_RES);
     
       
     
for (i=0;i<2;i++)
    {
     SIDE=i;
         LCDCWrite(DISPLAY_on);
             
               /* Пробвах и само   LCDCWrite(DISPLAY_OFF);
                 и  заедно LCDCWrite(DISPLAY_on);   LCDCWrite(DISPLAY_OFF);
                */
         
        LCDCWrite(DISPLAY_START_LINE);
        LCDCWrite(STATIC_DRIVE_off);
        LCDCWrite(COLUMN_ADDRESS_SET); 
        LCDCWrite(PAGE_ADDRESS_SET); 
        LCDCWrite(DUTY_RATIO_32);   
        LCDCWrite(ADC_CLOCKWISE);
        LCDCWrite(END_READ_MODIFY);
       

}
    OUTPUT_LOW(LCD_CS1);    // De-select each side to start
   OUTPUT_LOW(LCD_CS2);    //
    delay_ms(60);
}


Прикачени файлове:
Коментар на файл: LCD pdf
4GLM_12232-SED1520 .rar [284.78 KiB]
259 пъти

Автор:  optron [ Сря Сеп 08, 2010 4:22 pm ]
Заглавие: 

Тук често пускат теми за проблеми с дисплеи и в повечето случаи се оказва, че конкретния екземпляр е дефектен фабрично. Пробвай с друга бройка ако имаш възможност. Ако и с него не става ще погледна кода, че сега нямам мнго време ...

Автор:  amdatlon [ Сря Сеп 08, 2010 8:04 pm ]
Заглавие: 

Там е работата , че имам 2 бройки и на двете дава едно и също :(
Почти съм убеден че аз бъркам някъде , но не мога да се усетя още :)

Автор:  optron [ Нед Сеп 12, 2010 12:46 pm ]
Заглавие: 

Прегледах набързо кода ти на драйвера и видях следното - ти първо вдигаш нивото на входа Е и след това му подаваш данните. Аз като пиша към дисплей първо извеждам данните, след това вдигам Е, чакам и свалян Е. Така се подсигурявам, защото не знам дисплеите при кой фронт на Е четат данните от входа си.
Пробвай го това. В случая с твоя код просто трябва да размениш двата реда:
OUTPUT_HIGH(LCD_CS1);

OUTPUT_D(CData);
Ако не проработи, пак ще го мислим.

Автор:  amdatlon [ Пон Сеп 13, 2010 9:02 pm ]
Заглавие: 

Много ти благодаря за отделеното време :)

Ще пробвам както каза .
Но днес като разглеждах пак ПДФ-а , забелязах нещо което не бях се зачел преди това :

"3V - supply voltage for logic and LCD "
и
Vdd = 2,7 (min) - 4,5 (max) V

На 3 V ли да е този дисплей ?!?!
Да не би да съм го повредил вече?
Ама пък ако не направя инициализация , не се появяват страните картинки , значи реагира на някой команди .

Автор:  optron [ Вто Сеп 14, 2010 10:36 am ]
Заглавие: 

Дяволски си прав! Изобщо не обърнах внимание на това. За твое щастие пак там пише, че абсолютно максималното захранващо напрежение е 6.7 волта и може би не си го повредил ако го захранваш с пет волта.
Обаче тук виждам и друго - захранващото напрежение за самия панел е 5.7 волта. Явно няма да се мине без негативно напрежение - ще ти трябва някакъв преобразувател или двуполярно захранване.
Другото, което е, ще трябва да преобразуваш и логическите нива от 5 на 3 волта - доколкото разбирам от чаршафа, входовете му не са 5В-толерантни. Явно цялата шашма е смятана за 3-волтов процесор. Ако имаш такъв или твоят процесор може да работи и на 3 волта, може би така ще ти е по-лесно.
Да видим така дали ще тръгне.

Автор:  amdatlon [ Вто Сеп 14, 2010 12:39 pm ]
Заглавие: 

Процесора е пик 18f458 , ще потърся дали може да бачка на 3V , защото иначе , да взема да правя двуполярно или преобразувател , май няма да си струва :(
По-добре да потърся друг сходен дисплей но на 5V .
Това ми харесваше на тоя че е тъничак и по компактен , ама явно .... не съм случил .
Съжалявам че не съм видял по рано ПДФ-а , а трябваше да те тормозя да гледаш и ти .

:oops:

А иначе пробвах и по-горното ти мнение да разменя двата реда , но пак няма резултат .

Автор:  optron [ Сря Сеп 15, 2010 8:00 pm ]
Заглавие: 

amdatlon написа:

А иначе пробвах и по-горното ти мнение да разменя двата реда , но пак няма резултат .
Възможно е да е щото го "печеш" на пет волта.
Разгледах чаршафа на процесора, там пише, че работи от 4.5 до 5.5 волта. За три волта ти трябва L-варианта му.

Автор:  amdatlon [ Сря Сеп 15, 2010 11:04 pm ]
Заглавие: 

Мда , май работата отива на друг дисплей :)
Случайно да знаеш някакъв подобен 122х32 , по компактен ?
В смисъл , от къде мога да си го взема .

Автор:  optron [ Чет Сеп 23, 2010 11:41 pm ]
Заглавие: 

Тука не мога да ти помогна особено - не ги познавам като модели и показатели ...

Автор:  amdatlon [ Пет Сеп 24, 2010 8:15 pm ]
Заглавие: 

Здраве да е :)
Благодаря за отделеното внимание :)

Автор:  optron [ Вто Окт 26, 2010 11:06 am ]
Заглавие: 

А защо не се пробваш да пуснеш процесор на 3 волта ? ;)

Автор:  amdatlon [ Вто Окт 26, 2010 8:35 pm ]
Заглавие: 

Малко съм още на "вие" с микроконтролерите :) , имам допир само с пик-ове , за сега .
И незнам дали има пик на 3V , не съм се интересувал .
Та за сега опитите ги правя с LCD 16X2 , докато или ако намеря подходящ дисплей :)

Автор:  Cekins [ Вто Окт 26, 2010 10:07 pm ]
Заглавие: 

Почти всички по-нови пикове (примерно 16F88,16F627/8A и други) могат от 2.7 до 5.5 да работи. Доколкото съм обръщал внимание почти всички 18-ки. от 24 нагоре всичко е на 3.3 периферия и 2.5 ядро.

Автор:  amdatlon [ Вто Окт 26, 2010 11:04 pm ]
Заглавие: 

Хмм , значи ще може с този който съм хванал 18F458 , трябва да пробавам като ми остане време :)
Благодаря !

Страница 1 от 2 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/