Перейти к содержанию
    

TIC234 на PCF8535

Нет ли у кого проверенной последовательности инициализации заказного LCD от фирмы Гамма - TIC234? Он изготовлен на базе м/с PCF8535. Что-то никак у меня не получается его правильно проинициализировать и хоть что-нибудь увидеть на экране. А время поджимает. Очень-очень жмет. :( Мне бы пример любого проверенного в работе исходничка на Си. Представители Гаммы выкладывают на своем сайте демо-ролики, но почему-то стесняются выложить примеры исходников к этим демороликам. Редиски однако :(

В качестве дополнения сообщаю, что LCD питается от 3,3В. Подключен в расчете на использование внутреннего генератора напряжения смещения. На такой же м/с Гамма выпускает(ла) TIC149, TIC150, TIC151, TIC154, G77E0 и G157E0, TIC103, TIC158. В даташитах индикаторов имеются только габаритные чертежи. О программировании нет ни слова.

post-3882-1284142151_thumb.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Нет ли у кого проверенной последовательности инициализации заказного LCD от фирмы Гамма

 

В даташитах индикаторов имеются только габаритные чертежи. О программировании нет ни слова.

Так программирование - из даташита на контроллер PCF8535. Вот моя последовательность инициализации (когда-то я с ними игрался, до практического применения дело не дошло):

; Данные для инициализации модуля (первые два байта - адрес модуля, $78,
; и признак работы с управляющими регистрами). Таблица должна содержать
; четное число байтов !

Data8535:
           .db     $78,$00    ; загрузка регистров управления
           .db     $01,$10    ; page 7, PD=0, V=0
           .db     $0E,$12    ; page 6, bias = 1/9
           .db     $07,$0E    ; D=1, E=1, mirror X,Y
           .db     $84,$01    ; mux=1/65
           .db     $0D,$08
           .db     $12,$BC    ; Vdd x 2, TC=2, Vlcd ~7V
           .db     $05,$01    ; PRS=0, HVE=1
           .db     $0B,$58    ; page 3, TRS=1, BRS=1

Вся эта последовательность просто передается через I2C, потом уже просто вывод содержимое байта по адресу для включения/выключения точек...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ткни его палочкой - может он мертвый?

TIC149 запустился сразу, без сложностей.

pcf8535.h:

#ifndef PCF8535_H__
#define PCF8535_H__

/*
   PCF8535 lcd controller control codes
*/    

#define PCF8535_BUS_ADDRESS     0x78

// Co, D/~C bits
enum 
{
   modeLCD_CMD_TILL_STOP   = 0x00,
   modeLCD_CMD_SINGLE      = 0x80,
   modeLCD_DATA_TILL_STOP  = 0x40,
   modeLCD_DATA_SINGLE     = 0xC0,
};

enum
{
   cmdLCD_DEFAULT_PAGE     = 0x01,
// Function and RAM command page
   cmdLCD_COMMAND_PAGE     = 0x08,
       paramLCD_PAGE_FUNCTION_AND_RAM  = 0x07,     //H[2:0] = 111
       paramLCD_PAGE_DISPLAY_SETTINGS  = 0x06,     //H[2:0] = 110
       paramLCD_PAGE_HV_GEN            = 0x05,     //H[2:0] = 101
       paramLCD_PAGE_SPECIAL_FEATURE   = 0x03,     //H[2:0] = 011

   cmdLCD_FUNCTION_SET     = 0x10,
       paramLCD_POWER_DOWN             = (1<<2),   // PD = 0
       paramLCD_ACTIVE                 = (0<<2),   // PD = 1
       paramLCD_HORIZONTAL_ADDRESSING  = (0<<1),   // V = 0
       paramLCD_VERTICAL_ADDRESSING    = (1<<1),   // V = 1

   cmdLCD_RAM_PAGE         = 0x20,
       paramLCD_PAGE0                  = (0<<2),   // XM0 = 0
       paramLCD_PAGE1                  = (1<<2),   // XM0 = 0

   cmdLCD_SET_Y            = 0x40,

   cmdLCD_SET_X            = 0x80,

// Display settings command page
   cmdLCD_DISPLAY_CONTROL  = 0x04,
       paramLCD_BLANK                  = (0<<1)|(0<<0),    // D = 0, E = 0
       paramLCD_NORMAL                 = (1<<1)|(0<<0),    // D = 1, E = 0
       paramLCD_ALL_ON                 = (0<<1)|(1<<0),    // D = 0, E = 1
       paramLCD_INVERSE                = (1<<1)|(1<<0),    // D = 1, E = 1

   cmdLCD_EXT_DISPLAY_CTL  = 0x08,
       paramLCD_XDIRECTION_REVERSE     = (0<<2),   // MX = 0
       paramLCD_XDIRECTION_NORMAL      = (1<<2),   // MX = 1
       paramLCD_YDIRECTION_REVERSE     = (0<<1),   // MY = 0
       paramLCD_YDIRECTION_NORMAL      = (1<<1),   // MY = 1

   cmdLCD_BIAS_SYSTEM      = 0x10,
       paramLCD_BIAS_11                = 0,        // Bias 1/11, MUX 1:100
       paramLCD_BIAS_10                = 1,        // Bias 1/10, MUX 1:80
       paramLCD_BIAS_9                 = 2,        // Bias 1/9,  MUX 1:65
       paramLCD_BIAS_8                 = 3,        // Bias 1/8,  MUX 1:49
       paramLCD_BIAS_7                 = 4,        // Bias 1/7,  MUX 1:34
       paramLCD_BIAS_6                 = 5,        // Bias 1/6,  MUX 1:26
       paramLCD_BIAS_5                 = 6,        // Bias 1/5,  MUX 1:17
       paramLCD_BIAS_4                 = 7,        // Bias 1/4,  MUX 1:9

   cmdLCD_DISPLAY_SIZE     = 0x20,
       paramLCD_SMALL_DISPLAY          = (0<<2),   // IB = 0
       paramLCD_LARGE_DISPLAY          = (1<<2),   // IB = 1

   cmdLCD_MULTILPEX_RATE   = 0x80,
       paramLCD_MUX_17                 = 0,        // MUX 1:17
       paramLCD_MUX_26                 = 1,        // MUX 1:26
       paramLCD_MUX_34                 = 2,        // MUX 1:34
       paramLCD_MUX_49                 = 3,        // MUX 1:49
       paramLCD_MUX_65                 = 4,        // MUX 1:65

// HV-gen command page
   cmdLCD_HV_GEN_CONTROL   = 0x04,
       paramLCD_HV_DISABLED            = (0<<0),   // HVE = 0
       paramLCD_HV_ENABLED             = (1<<0),   // HVE = 1
       paramLCD_VLCD_LOW               = (0<<1),   // PRS = 0
       paramLCD_VLCD_HIGH              = (1<<1),   // PRS = 1

   cmdLCD_HV_GEN_STAGES    = 0x08,
       paramLCD_HV_MUL2                = 0,        // S1 = 0, S0 = 0
       paramLCD_HV_MUL3                = 1,        // S1 = 0, S0 = 1
       paramLCD_HV_MUL4                = 2,        // S1 = 1, S0 = 0
       paramLCD_HV_MUL5                = 3,        // S1 = 1, S0 = 1
   cmdLCD_TEMP_COEFF       = 0x10,
       paramLCD_TC_0                   = 0,        // TC = 0
       paramLCD_TC_044                 = 1,        // TC = -0.44e-3 1/C
       paramLCD_TC_110                 = 2,        // TC = -1.10e-3 1/C
       paramLCD_TC_145                 = 3,        // TC = -1.45e-3 1/C
       paramLCD_TC_191                 = 4,        // TC = -1.91-3 1/C
       paramLCD_TC_215                 = 5,        // TC = -2.15e-3 1/C
       paramLCD_TC_232                 = 6,        // TC = -2.32e-3 1/C
       paramLCD_TC_274                 = 7,        // TC = -2.74e-3 1/C
   cmdLCD_TEMP_MEAS_CTL    = 0x20,
       paramLCD_START_MEASURE          = (1<<0),   // SM = 1
   cmdLCD_VLCD_CONTROL     = 0x80,

// Special feature command page
   cmdLCD_STATE_CONTROL    = 0x04,
       paramLCD_DISPLAY_OFF                = (1<<1),   // DOF = 1
       paramLCD_DIRECT_MODE                = (1<<0),   // DM = 1
   cmdLCD_OSC_SETTING      = 0x08,
       paramLCD_OSC_INTERNAL               = (0<<1),   // EC = 0
       paramLCD_OSC_EXTERNAL               = (1<<1),   // EC = 1
   cmdLCD_COG_TCP          = 0x40,
       paramLCD_BOT_ROW_SWAP_DISABLED      = (0<<3),   // BRS = 0
       paramLCD_BOT_ROW_SWAP_ENABLED       = (1<<3),   // BRS = 0
       paramLCD_TOP_ROW_SWAP_DISABLED      = (0<<4),   // TRS = 0
       paramLCD_TOP_ROW_SWAP_ENABLED       = (1<<4),   // TRS = 0
};

#endif  // PCF8535_H__

pcf8535.c:

#include    "PCF8535.h"

// Start write transaction:
// Generate START condition, send device address and control byte
// return non-zero on success, 0 if NACK received
static uint8_t lcd_start_write(uint8_t control_byte)
{
   i2c_start();
   if(i2c_write(PCF8535_BUS_ADDRESS)!= 0)
       return 0;
   if(i2c_write(control_byte)!= 0)
       return 0;
   return 1;
}

// Send [size] bytes to LCD
// return non-zero on success, 0 if NACK received
static uint8_t lcd_send_array(uint8_t *data, uint16_t size)
{
  do
  {
     if(i2c_write(*data++)!= 0)
         return 0;
  }
  while (--size);
  return 1;
}

//  LCD controller init sequence
static uint8_t lcd_init_sequence[] = 
{

   cmdLCD_DEFAULT_PAGE
       ,
   cmdLCD_COMMAND_PAGE 
       | paramLCD_PAGE_DISPLAY_SETTINGS
       ,
       cmdLCD_BIAS_SYSTEM
           | paramLCD_BIAS_9   // Bias 1/9,  MUX 1:65
           ,
       cmdLCD_MULTILPEX_RATE
           | paramLCD_MUX_65
           ,
       cmdLCD_DISPLAY_CONTROL
           | paramLCD_NORMAL
           ,
       cmdLCD_EXT_DISPLAY_CTL
           | paramLCD_XDIRECTION_NORMAL
           | paramLCD_YDIRECTION_NORMAL
           ,
       cmdLCD_DISPLAY_SIZE
           | paramLCD_LARGE_DISPLAY
           ,

   cmdLCD_DEFAULT_PAGE
       ,
   cmdLCD_COMMAND_PAGE 
       | paramLCD_PAGE_HV_GEN
       ,
       cmdLCD_HV_GEN_CONTROL
           | paramLCD_HV_ENABLED
           | paramLCD_VLCD_LOW
           ,
       cmdLCD_HV_GEN_STAGES
           | paramLCD_HV_MUL5
           ,
       cmdLCD_TEMP_COEFF
           | paramLCD_TC_274
           ,
       cmdLCD_VLCD_CONTROL
           | 51
           ,

   cmdLCD_DEFAULT_PAGE
       ,
   cmdLCD_COMMAND_PAGE 
       | paramLCD_PAGE_SPECIAL_FEATURE
       ,
       cmdLCD_STATE_CONTROL
           | 0
           ,
       cmdLCD_OSC_SETTING
           | paramLCD_OSC_INTERNAL
           ,
       cmdLCD_COG_TCP
           | paramLCD_BOT_ROW_SWAP_ENABLED
           | paramLCD_TOP_ROW_SWAP_ENABLED
           ,

   cmdLCD_DEFAULT_PAGE
       ,
      cmdLCD_FUNCTION_SET
          | paramLCD_ACTIVE
          | paramLCD_HORIZONTAL_ADDRESSING
          ,
      cmdLCD_RAM_PAGE
          | paramLCD_PAGE0
          ,
      cmdLCD_SET_Y
          | 0
          ,
      cmdLCD_SET_X
          | 0
          ,
};

static uint8_t lcd_set_home_sequence[] = 
{
   cmdLCD_DEFAULT_PAGE
       ,
   cmdLCD_SET_Y
       | 0
       ,
   cmdLCD_SET_X
       | 0
       ,
};
void lcd_home()
{
   lcd_start_write(modeLCD_CMD_TILL_STOP);
   lcd_send_array(lcd_set_home_sequence, sizeof(lcd_set_home_sequence));
   i2c_stop();
}

void lcd_init()
{
   uint16_t i;
   // Set lcd reset pin as output
   // Set lcd reset pin low
   OFF(LCD_RESET);
   _delay_us(1);    // tW(RESL)
   ON(LCD_RESET);
   _delay_us(5);    // tW(RESH)
   OFF(LCD_RESET);
   _delay_us(1);    // tW(RESL)
   ON(LCD_RESET);
   _delay_us(3);    // tR(OP)

   //***************************************************
   //* Lcd init commands                               *
   //***************************************************
   lcd_start_write(modeLCD_CMD_TILL_STOP);
   lcd_send_array(lcd_init_sequence, sizeof(lcd_init_sequence));
   i2c_stop();

   // Now lcd address pointer set to row 0, col. 0.
   // fill whole screen with black pattern
   lcd_start_write(modeLCD_DATA_TILL_STOP);
   // lcd address pointer autoincrements,
   // so we can just draw LCD_SIZE_X*LCD_SIZE_Y points.
   // one byte fills 8 dots on screen,

   for(i = 0; i < LCD_SIZE_X * LCD_SIZE_Y / 16; ++i)
   {
     i2c_write(0x55);
     i2c_write(0xAA);
   }
   i2c_stop();
}

void lcd_set_contrast(uint8_t contrast)
{
   lcd_start_write(modeLCD_CMD_TILL_STOP);
   i2c_write(cmdLCD_DEFAULT_PAGE);
   i2c_write(cmdLCD_COMMAND_PAGE | paramLCD_PAGE_HV_GEN);
/*
   if(contrast > 128)
   {
       i2c_write(cmdLCD_HV_GEN_CONTROL
                   | paramLCD_HV_ENABLED
                   | paramLCD_VLCD_HIGH
                   );
       contrast -= 128;
   }
   else
*/
       i2c_write(cmdLCD_HV_GEN_CONTROL
                   | paramLCD_HV_ENABLED
                   | paramLCD_VLCD_LOW
                   );
   i2c_write(cmdLCD_VLCD_CONTROL | contrast >> 1);
   i2c_stop();
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо Сергей! Вроде что-то получилось. :a14: У rx3apf инициализация тоже вроде нормальная, но у тебя более полная библиотека.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...