rezident 0 10 сентября, 2010 Опубликовано 10 сентября, 2010 · Жалоба Нет ли у кого проверенной последовательности инициализации заказного LCD от фирмы Гамма - TIC234? Он изготовлен на базе м/с PCF8535. Что-то никак у меня не получается его правильно проинициализировать и хоть что-нибудь увидеть на экране. А время поджимает. Очень-очень жмет. :( Мне бы пример любого проверенного в работе исходничка на Си. Представители Гаммы выкладывают на своем сайте демо-ролики, но почему-то стесняются выложить примеры исходников к этим демороликам. Редиски однако :( В качестве дополнения сообщаю, что LCD питается от 3,3В. Подключен в расчете на использование внутреннего генератора напряжения смещения. На такой же м/с Гамма выпускает(ла) TIC149, TIC150, TIC151, TIC154, G77E0 и G157E0, TIC103, TIC158. В даташитах индикаторов имеются только габаритные чертежи. О программировании нет ни слова. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rx3apf 0 10 сентября, 2010 Опубликовано 10 сентября, 2010 · Жалоба Нет ли у кого проверенной последовательности инициализации заказного 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, потом уже просто вывод содержимое байта по адресу для включения/выключения точек... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 121 10 сентября, 2010 Опубликовано 10 сентября, 2010 · Жалоба Ткни его палочкой - может он мертвый? 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(); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 10 сентября, 2010 Опубликовано 10 сентября, 2010 · Жалоба Спасибо Сергей! Вроде что-то получилось. :a14: У rx3apf инициализация тоже вроде нормальная, но у тебя более полная библиотека. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться