Разработка, производство и продажа радиоэлектронной аппаратуры
|
Требуется программист в Зеленограде - обработка данных с датчиков; ColdFire; 40 тыс.
e-mail: jobsmp@pochta.ru
|
Проект был рассчитан на несколько типов контроллеров диплеев и их варианты, поэтому куча define и переопределений. Я выдрал только часть инициализации.
Там есть еще одна тонкость. Стекляшка имеет 101х64 пиксела, а контроллер память на 102х65. При выводе строк надо это учитывать.
И еще. Задержки сначала были выставлены по даташиту, но работало и без них. Питание диплея 3.3в SPIclk 1Mhz. Задрана вверх контрастность - заказчик ныл, что плохо видно. Лечится уменьшением значения (0х60) при LCDC_VOP.
#define _LCD_CMD_FUNC 0x20 // Function set -
#define _LCD_CMD_H 0x01 // basic(0) or extended(1) instruction set
#define _LCD_CMD_DCTL 0x08 // set display configuration
#define _LCD_CMD_NORMAL 0x04 // normal mode
#define _LCD_CMD_TCTL 0x04 // set Temperature Coefficient
#define _LCD_CMD_TC2 0x02 // set temp. coeff. 2 -1.05x10-3 (V/°C)
#define _LCD_CMD_HVG 0x08 // multiplication of high-voltage generator voltage
#define _LCD_CMD_VX3 0x01 // 3x voltage multiplier
#define _LCD_CMD_BIAS 0x10 // set Bias System
#define _LCD_CMD_BS1 0x06 // Bias system 1; Mux rate 1:18 or 1:16
#define _LCD_CMD_VOP 0x80 // write VOP to register
#define LCDC_FUNC _LCD_CMD_FUNC
#define LCDC_EXT _LCD_CMD_H
#define LCDC_NORMAL _LCD_CMD_DCTL|_LCD_CMD_NORMAL
#define LCDC_VOP _LCD_CMD_VOP
#define LCDC_HV_X3 _LCD_CMD_HVG|_LCD_CMD_VX3
#define LCDC_BIAS1 _LCD_CMD_BIAS|_LCD_CMD_BS1
#define LCDC_TC2 _LCD_CMD_TCTL|_LCD_CMD_TC2
#define LCDC_STDMODE LCDC_FUNC
#define LCDC_EXTMODE LCDC_FUNC|LCDC_EXT
#define LCD_INIT_SEQUENCE \
LCDC_EXTMODE, \
LCDC_HV_X3, \
LCDC_VOP | 0x60, \
LCDC_BIAS1, \
LCDC_TC2, \
LCDC_STDMODE, \
LCDC_NORMAL
****************************************************************
static const UCHAR8 InitSeq[] = {LCD_INIT_SEQUENCE};
//=== LCD Hardware reset ===
void LCD_Reset(void)
{
LCD_DC_HIGH;
LCD_SEL_HIGH;
LCD_RST_LOW;
Delay2(1);
LCD_RST_HIGH;
}
//=== LCD VDD ON ===
void LCD_On(void)
{
LCD_RST_LOW;
LCD_SEL_HIGH;
LCD_DC_HIGH;
// Delay2(100);
LCD_VDD_HIGH;
// Delay2(100);
}
void LCD_SendCmdSeq(UCHAR8 * commands, UINT8 count)
{
LCD_DC_LOW;
LCD_SEL_LOW;
while (count--)
{
LCDTXBUF = *commands++;
while(!(LCDTXCTL & TXEPT)); // wait for Tx
};
LCD_SEL_HIGH;
_NOP();
}
void LCD_Init(void)
{
LCD_On();
LCD_Reset();
// Delay2(100);
LCD_SendCmdSeq( (UCHAR8*)&InitSeq[0], COUNTOF(InitSeq) );
LCD_Clear();
}
Составить ответ | Вернуться на конференцию.
Ответы