Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: TIC234 на PCF8535
Форум разработчиков электроники ELECTRONIX.ru > Поставщики компонентов для электроники > Компоненты > Средства индикации
rezident
Нет ли у кого проверенной последовательности инициализации заказного LCD от фирмы Гамма - TIC234? Он изготовлен на базе м/с PCF8535. Что-то никак у меня не получается его правильно проинициализировать и хоть что-нибудь увидеть на экране. А время поджимает. Очень-очень жмет. sad.gif Мне бы пример любого проверенного в работе исходничка на Си. Представители Гаммы выкладывают на своем сайте демо-ролики, но почему-то стесняются выложить примеры исходников к этим демороликам. Редиски однако sad.gif
В качестве дополнения сообщаю, что LCD питается от 3,3В. Подключен в расчете на использование внутреннего генератора напряжения смещения. На такой же м/с Гамма выпускает(ла) TIC149, TIC150, TIC151, TIC154, G77E0 и G157E0, TIC103, TIC158. В даташитах индикаторов имеются только габаритные чертежи. О программировании нет ни слова.
rx3apf
Цитата(rezident @ Sep 10 2010, 22:09) *
Нет ли у кого проверенной последовательности инициализации заказного 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:
CODE
#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:
CODE
#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();
}
rezident
Спасибо Сергей! Вроде что-то получилось. a14.gif У rx3apf инициализация тоже вроде нормальная, но у тебя более полная библиотека.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.