ЗЫ. Сейчас, в порядок себя приведу (только приехал - активно отдыхаем-с =))), и наваяю чего-нибудь.
Юзаем дисплеи от сотовых и других потаскунчиков.
- SubDia
- Держит паяльник хвостом
- Сообщения: 995
- Зарегистрирован: Сб апр 02, 2011 17:59:22
- Откуда: Город-герой Севастополь
Re: Юзаем дисплеи от сотовых и других потаскунчиков.
Именно, цветной шум.
ЗЫ. Сейчас, в порядок себя приведу (только приехал - активно отдыхаем-с =))), и наваяю чего-нибудь.
ЗЫ. Сейчас, в порядок себя приведу (только приехал - активно отдыхаем-с =))), и наваяю чего-нибудь.
pavel_cydenov: Вобще я праAVRославный человек. Но и про ислARM слышал много хорошего )
MrYuran: Самые ортодоксальные — это PICудеи )
Katz: Не, 51-ники. )

MrYuran: Самые ортодоксальные — это PICудеи )
Katz: Не, 51-ники. )

- Реклама
- КАШАК
- Это не хвост, это антенна
- Сообщения: 1303
- Зарегистрирован: Вс апр 19, 2009 17:20:22
- Откуда: г.Ростов-на-Дону/г.Таганрог/г.Геленджик
- Контактная информация:
Re: Юзаем дисплеи от сотовых и других потаскунчиков.
Хорошо, буду ждать 
Опыт растет прямо пропорционально выведенному из строя оборудованию...
- SubDia
- Держит паяльник хвостом
- Сообщения: 995
- Зарегистрирован: Сб апр 02, 2011 17:59:22
- Откуда: Город-герой Севастополь
Re: Юзаем дисплеи от сотовых и других потаскунчиков.
Для начала - по аппаратной части, то бишь по соединению МК и дисплея. Весь порт Е, с 0 по 15 выводы, занят шиной данных. Линии управления занимают часть порта B:
CS - 11 вывод;
RESET - 12 вывод;
WR - 13 вывод;
RS - 14 вывод;
RD - 15 вывод.
Это дело с помощью директивы #define для простоты прописываем в хидере исходника для lcd:
Производим настройку портов (для 100й линейки придется чуток переписать - есть отличия в структурах) с помощью функции LCD_CtrlLinesConfig():
Помним, что при записи в регистр вначале мы пишем номер регистра, а затем - его содержимое.
Поэтому функция записи в регистр (LCD_WriteReg(uint8_t LCD_Reg, uint16_t LCD_RegValue)) у нас состоит из двух функций.
А вот обе эти функции, по порядку: запись индекса регистра, запись числа в регистр.
Напомню, что имена выводов у нас - именованные константы, которые мы определяли в хидере.
И, собственно, инициализация.
В силу собственных нужд дисплей я настраивал так, чтобы отсчет строк начинался из нижнего левого угла.
Сейчас попробую найти фото, как это примерно выглядит..вот оно:

"Configuring" - велика и могуча моя китайская английская йезыка. Сам смеялся.
Функция задержки Delay_ms() выглядит следующим образом.
Я ее честно стырил из каких-то исходников STM.
Функция заливки: 1. Устанавливаем позицию курсора (ф-ция LCD_SetCursor(uint16_t Xpos, uint16_t Ypos)). 2. Даем команду подготовки к записи (ф-ция LCD_WriteRAM_Prepare()). 3. Пишем данные.
Под спойлером - все по порядку.
Да.. функция заливки оперирует параметром "LCD_COLOR_GREEN". Вот его определение.
Думаю, объяснять, как он получен, не нужно. =)
Вроде все, если что-то забыл написать/указать - пишите. Удачи.
CS - 11 вывод;
RESET - 12 вывод;
WR - 13 вывод;
RS - 14 вывод;
RD - 15 вывод.
Это дело с помощью директивы #define для простоты прописываем в хидере исходника для lcd:
Спойлер
Код: Выделить всё
#define LCD_CTRLPORT GPIOB
#define LCD_RESET GPIO_Pin_12 //PORTB_12
#define LCD_CS GPIO_Pin_11 //PORTB_11
#define LCD_RS GPIO_Pin_14 //PORTB_14
#define LCD_WR GPIO_Pin_13 //PORTB_13
#define LCD_RD GPIO_Pin_15 //PORTB_15
Производим настройку портов (для 100й линейки придется чуток переписать - есть отличия в структурах) с помощью функции LCD_CtrlLinesConfig():
Спойлер
Код: Выделить всё
void LCD_CtrlLinesConfig(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* Enable GPIOD, GPIOE, and GPIOB clocks */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOE, ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE);
/*-- GPIO Configuration ----------*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 |
GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7 |
GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11 |
GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOE, &GPIO_InitStructure);
/* CTRL Pins Config */
GPIO_InitStructure.GPIO_Pin = LCD_RESET | LCD_CS | LCD_RS | LCD_WR | LCD_RD;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOB, &GPIO_InitStructure);
return;
}
Помним, что при записи в регистр вначале мы пишем номер регистра, а затем - его содержимое.
Поэтому функция записи в регистр (LCD_WriteReg(uint8_t LCD_Reg, uint16_t LCD_RegValue)) у нас состоит из двух функций.
Спойлер
Код: Выделить всё
void LCD_WriteReg(uint8_t LCD_Reg, uint16_t LCD_RegValue)
{
LCD_WriteRegIndex (LCD_Reg);
LCD_WriteRegValue (LCD_RegValue);
return;
}
А вот обе эти функции, по порядку: запись индекса регистра, запись числа в регистр.
Спойлер
Код: Выделить всё
/******************************************************************************/
void LCD_WriteRegIndex (uint16_t RegIndex){
GPIO_ResetBits(LCD_CTRLPORT, LCD_CS);
GPIO_ResetBits(LCD_CTRLPORT, LCD_RS);
GPIOE->ODR = RegIndex;
GPIO_ResetBits(LCD_CTRLPORT, LCD_WR);
GPIO_SetBits(LCD_CTRLPORT, LCD_WR);
return;
}
/******************************************************************************/
void LCD_WriteRegValue (uint16_t RegValue){
GPIO_ResetBits(LCD_CTRLPORT, LCD_CS);
GPIO_SetBits(LCD_CTRLPORT, LCD_RS);
GPIOE->ODR = RegValue;
GPIO_ResetBits(LCD_CTRLPORT, LCD_WR);
GPIO_SetBits(LCD_CTRLPORT, LCD_WR);
return;
}
/******************************************************************************/
Напомню, что имена выводов у нас - именованные константы, которые мы определяли в хидере.
И, собственно, инициализация.
Спойлер
Код: Выделить всё
void init_1289(void)
{
GPIO_SetBits(LCD_CTRLPORT, LCD_RESET);
Delay_ms(10);
GPIO_ResetBits(LCD_CTRLPORT, LCD_RESET);
Delay_ms(30);
GPIO_SetBits(LCD_CTRLPORT, LCD_RESET);
Delay_ms(50);
GPIO_SetBits(LCD_CTRLPORT, LCD_RD);
GPIO_SetBits(LCD_CTRLPORT, LCD_WR);
GPIO_SetBits(LCD_CTRLPORT, LCD_RS);
GPIO_ResetBits(LCD_CTRLPORT, LCD_CS);
// power supply setting
// set R07h at 0021h (GON=1,DTE=0,D[1:0]=01)
LCD_WriteReg(0x0007,0x0021);
// set R00h at 0001h (OSCEN=1)
LCD_WriteReg(0x0000,0x0001);
// set R07h at 0023h (GON=1,DTE=0,D[1:0]=11)
LCD_WriteReg(0x0007,0x0023);
// set R10h at 0000h (Exit sleep mode)
LCD_WriteReg(0x0010,0x0000);
// Wait 30ms
Delay_ms(30);
// set R07h at 0033h (GON=1,DTE=1,D[1:0]=11)
LCD_WriteReg(0x0007,0x0033);
// Entry mode setting (R11h)
// R11H Entry mode
// vsmode DFM1 DFM0 TRANS OEDef WMode DMode1 DMode0 TY1 TY0 ID1 ID0 AM LG2 LG2 LG0
// 0 1 1 0 0 0 0 0 0 1 1 1 * 0 0 0
LCD_WriteReg(0x0011,0x6078);
// LCD driver AC setting (R02h)
LCD_WriteReg(0x0002,0x0600);
// power control 1
// DCT3 DCT2 DCT1 DCT0 BT2 BT1 BT0 0 DC3 DC2 DC1 DC0 AP2 AP1 AP0 0
// 1 0 1 0 1 0 0 0 1 0 1 0 0 1 0 0
// DCT[3:0] fosc/4 BT[2:0] DC{3:0] fosc/4
LCD_WriteReg(0x0003,0x0804);//0xA8A4
LCD_WriteReg(0x000C,0x0000);//
LCD_WriteReg(0x000D,0x0808);// 0x080C --> 0x0808
// power control 4
// 0 0 VCOMG VDV4 VDV3 VDV2 VDV1 VDV0 0 0 0 0 0 0 0 0
// 0 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0
LCD_WriteReg(0x000E,0x2900);
LCD_WriteReg(0x001E,0x00B8);
LCD_WriteReg(0x0001,0x293F);//vertical inversion; start->left bottom corner
LCD_WriteReg(0x0010,0x0000);
LCD_WriteReg(0x0005,0x0000);
LCD_WriteReg(0x0006,0x0000);
LCD_WriteReg(0x0016,0xEF1C);
LCD_WriteReg(0x0017,0x0003);
LCD_WriteReg(0x0007,0x0233);
LCD_WriteReg(0x000B,0x0000|(3<<6));
LCD_WriteReg(0x000F,0x0000);
LCD_WriteReg(0x0041,0x0000);
LCD_WriteReg(0x0042,0x0000);
LCD_WriteReg(0x0048,0x0000);
LCD_WriteReg(0x0049,0x013F);
LCD_WriteReg(0x004A,0x0000);
LCD_WriteReg(0x004B,0x0000);
LCD_WriteReg(0x0030,0x0707);
LCD_WriteReg(0x0031,0x0204);
LCD_WriteReg(0x0032,0x0204);
LCD_WriteReg(0x0033,0x0502);
LCD_WriteReg(0x0034,0x0507);
LCD_WriteReg(0x0035,0x0204);
LCD_WriteReg(0x0036,0x0204);
LCD_WriteReg(0x0037,0x0502);
LCD_WriteReg(0x003A,0x0302);
LCD_WriteReg(0x003B,0x0302);
LCD_WriteReg(0x0023,0x0000);
LCD_WriteReg(0x0024,0x0000);
LCD_WriteReg(0x0025,0x8000);
LCD_WriteReg(0x004f,0);
LCD_WriteReg(0x004e,0);
Delay_ms(50);
LCD_Clear(LCD_COLOR_GREEN);
return;
}
В силу собственных нужд дисплей я настраивал так, чтобы отсчет строк начинался из нижнего левого угла.
Сейчас попробую найти фото, как это примерно выглядит..вот оно:
Спойлер

"Configuring" - велика и могуча моя китайская английская йезыка. Сам смеялся.
Функция задержки Delay_ms() выглядит следующим образом.
Спойлер
Код: Выделить всё
/******************************************************************************/
void Delay_ms(uint32_t ms)
{
volatile uint32_t nCount;
RCC_ClocksTypeDef RCC_Clocks;
RCC_GetClocksFreq (&RCC_Clocks);
nCount=(RCC_Clocks.HCLK_Frequency/10000)*ms;
for (; nCount!=0; nCount--);
}
Я ее честно стырил из каких-то исходников STM.
Функция заливки: 1. Устанавливаем позицию курсора (ф-ция LCD_SetCursor(uint16_t Xpos, uint16_t Ypos)). 2. Даем команду подготовки к записи (ф-ция LCD_WriteRAM_Prepare()). 3. Пишем данные.
Под спойлером - все по порядку.
Спойлер
Код: Выделить всё
void LCD_Clear(uint16_t Color)
{
uint32_t index = 0;
LCD_SetCursor(0x00, 0x00);
LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */
for(index = 0; index < 76800; index++)
{
LCD_WriteRegValue (Color);
}
}
/*************************************************
void LCD_SetCursor(uint16_t Xpos, uint16_t Ypos)
{
LCD_WriteReg(0x004E, Xpos);
LCD_WriteReg(0x004F, Ypos);
return;
}
/*************************************************
void LCD_WriteRAM_Prepare(void)
{
LCD_WriteRegIndex (0x0022);
}
Да.. функция заливки оперирует параметром "LCD_COLOR_GREEN". Вот его определение.
Код: Выделить всё
#define LCD_COLOR_GREEN 0x07E0Думаю, объяснять, как он получен, не нужно. =)
Вроде все, если что-то забыл написать/указать - пишите. Удачи.
pavel_cydenov: Вобще я праAVRославный человек. Но и про ислARM слышал много хорошего )
MrYuran: Самые ортодоксальные — это PICудеи )
Katz: Не, 51-ники. )

MrYuran: Самые ортодоксальные — это PICудеи )
Katz: Не, 51-ники. )

- КАШАК
- Это не хвост, это антенна
- Сообщения: 1303
- Зарегистрирован: Вс апр 19, 2009 17:20:22
- Откуда: г.Ростов-на-Дону/г.Таганрог/г.Геленджик
- Контактная информация:
Re: Юзаем дисплеи от сотовых и других потаскунчиков.
Огромное спасибо!
Завтра отпишусь о результатах 
Завтра отпишусь о результатах Опыт растет прямо пропорционально выведенному из строя оборудованию...
- КАШАК
- Это не хвост, это антенна
- Сообщения: 1303
- Зарегистрирован: Вс апр 19, 2009 17:20:22
- Откуда: г.Ростов-на-Дону/г.Таганрог/г.Геленджик
- Контактная информация:
Re: Юзаем дисплеи от сотовых и других потаскунчиков.
Попробовал ваш код, эффект нулевой. На экране все та же синяя полоса и светлый грязно-синий фон

Все это дело плавно появляется в течении примерно 2с. и только после инициализации. Подключение проверил несколько раз. Такое ощущение, что дисплей неисправен...
Вот мой код, может все таки где-то ошибся? Линии данных на порт А подключены, остальное на B

Все это дело плавно появляется в течении примерно 2с. и только после инициализации. Подключение проверил несколько раз. Такое ощущение, что дисплей неисправен...
Вот мой код, может все таки где-то ошибся? Линии данных на порт А подключены, остальное на B
- Вложения
-
- main.c
- (5.61 КБ) 505 скачиваний
Опыт растет прямо пропорционально выведенному из строя оборудованию...
- Реклама
- КАШАК
- Это не хвост, это антенна
- Сообщения: 1303
- Зарегистрирован: Вс апр 19, 2009 17:20:22
- Откуда: г.Ростов-на-Дону/г.Таганрог/г.Геленджик
- Контактная информация:
Re: Юзаем дисплеи от сотовых и других потаскунчиков.
А все оказалось предельно просто! Линии D0-D15 я подключил на порт А. Решил я светодиодом пройтись по выводам порта и обнаружил на 14 и 15 выводах что-то совершенно постороннее. Полез в документацию на плату, а там черным по белому написано, что выводы PA14, PA15 используются для подключения к программатору и тут уж либо программировать, либо использовать эти выводы.
Перекинул D14, D15 на порт C, изменил код и дисплей завелся 
Перекинул D14, D15 на порт C, изменил код и дисплей завелся Опыт растет прямо пропорционально выведенному из строя оборудованию...
- КАШАК
- Это не хвост, это антенна
- Сообщения: 1303
- Зарегистрирован: Вс апр 19, 2009 17:20:22
- Откуда: г.Ростов-на-Дону/г.Таганрог/г.Геленджик
- Контактная информация:
Re: Юзаем дисплеи от сотовых и других потаскунчиков.
А как очистить видеопамять дисплея? А то я провожу сброс МК, а заливка идет поверх старой картинки еще и полупрозрачная...
Опыт растет прямо пропорционально выведенному из строя оборудованию...
- hd44780
- Встал на лапы
- Сообщения: 132
- Зарегистрирован: Вт июл 14, 2009 09:27:37
- Откуда: Донецк, Украина
Re: Юзаем дисплеи от сотовых и других потаскунчиков.
Я на ILI9320 заливаю весь дисплей нужным цветом...
Re: Юзаем дисплеи от сотовых и других потаскунчиков.
Здравствуйте, посоветовали обратится в эту ветку. что-то непонятное у меня с экранчиком. Очень прошу помощи:
есть вот такой шилд для ардиуны:

самой ардуины нет!
распиновка такая:

даташит на шилд состоит из трех страниц, где есть описание пинов:

подключаю это все к своей макетной плате (плата на которой атмега 64 и все. больше ничего нет. для удобства порты выведены в линейки.)
портЕ - cs / rs / wr / rst к ногам 0 / 1 / 2 / 3 соответственно
портD - d0...d7
питание 3.3 вольта, питание 5 вольт. управление с порта 5 вольт, как написано конроллер ssd1289 толерантный к 5 вольтам
управление 8-и битное.
листинг объявлений такой:
#define LCD_LO_PORT PORTD
#define LCD_LO_PIN PIND
#define LCD_CS_DDR DDRC
#define LCD_CS_PORT PORTC
#define LCD_CS_PIN PINC
#define LCD_CS_BIT 0
#define LCD_RS_DDR DDRC
#define LCD_RS_PORT PORTC
#define LCD_RS_PIN PINC
#define LCD_RS_BIT 1
#define LCD_WR_DDR DDRC
#define LCD_WR_PORT PORTC
#define LCD_WR_PIN PINC
#define LCD_WR_BIT 2
#define LCD_RST_DDR DDRC
#define LCD_RST_PORT PORTC
#define LCD_RST_PIN PINC
#define LCD_RST_BIT 3
#define LCD_SET_CS() LCD_CS_PORT |= (1<<LCD_CS_BIT)
#define LCD_CLR_CS() LCD_CS_PORT &= ~(1<<LCD_CS_BIT)
#define LCD_DIR_CS(x) LCD_CS_DDR |= (1<<LCD_CS_BIT)
#define LCD_SET_RS() LCD_RS_PORT |= (1<<LCD_RS_BIT)
#define LCD_CLR_RS() LCD_RS_PORT &= ~(1<<LCD_RS_BIT)
#define LCD_DIR_RS(x) LCD_RS_DDR |= (1<<LCD_RS_BIT)
#define LCD_SET_WR() LCD_WR_PORT |= (1<<LCD_WR_BIT)
#define LCD_CLR_WR() LCD_WR_PORT &= ~(1<<LCD_WR_BIT)
#define LCD_DIR_WR(x) LCD_WR_DDR |= (1<<LCD_WR_BIT)
#define LCD_SET_RST() LCD_RST_PORT |= (1<<LCD_RST_BIT)
#define LCD_CLR_RST() LCD_RST_PORT &= ~(1<<LCD_RST_BIT)
#define LCD_DIR_RST(x) LCD_RST_DDR |= (1<<LCD_RST_BIT)
минималка функций такая:
{
LCD_CLR_RS();
LCD_LO_PORT = cmd>>8;
LCD_LO_PORT = cmd;
LCD_CLR_WR();
LCD_SET_WR();
}
void LCD_WrDat(unsigned int val)
{
LCD_CLR_CS();
LCD_SET_RS();
LCD_LO_PORT = val>>8;
LCD_LO_PORT = val;
LCD_CLR_WR();
LCD_SET_WR();
}
void LCD_InitPort(void)
{
LCD_SET_RST();
delay_ms(10);
LCD_CLR_RST();
delay_ms(30);
LCD_SET_RST();
delay_ms(50);
LCD_SET_WR();
LCD_SET_RS();
LCD_CLR_CS();
LCD_WrCmd(0x0007);LCD_WrDat(0x0021);
LCD_WrCmd(0x0000);LCD_WrDat(0x0001);
LCD_WrCmd(0x0007);LCD_WrDat(0x0023);
LCD_WrCmd(0x0010);LCD_WrDat(0x0000);
delay_ms(30);
LCD_WrCmd(0x0007);LCD_WrDat(0x0033);
LCD_WrCmd(0x0011);LCD_WrDat(0x6058);
LCD_WrCmd(0x0002);LCD_WrDat(0x0600);
}
void display_rgb(unsigned int data)
{
unsigned int i,j;
for(i=0;i<320;i++)
{
for(j=0;j<240;j++)
{
LCD_WrDat(data);
}
}
}
проверка экрана:
DDRD = 0xff;
DDRC = 0xff;
LCD_InitPort();
delay_ms(100);
display_rgb(0x07E0);
while (1){};
нифига не пашет. Подскажите, пожалуйста, что я делаю не так?
есть вот такой шилд для ардиуны:
самой ардуины нет!
распиновка такая:
даташит на шилд состоит из трех страниц, где есть описание пинов:
подключаю это все к своей макетной плате (плата на которой атмега 64 и все. больше ничего нет. для удобства порты выведены в линейки.)
портЕ - cs / rs / wr / rst к ногам 0 / 1 / 2 / 3 соответственно
портD - d0...d7
питание 3.3 вольта, питание 5 вольт. управление с порта 5 вольт, как написано конроллер ssd1289 толерантный к 5 вольтам
управление 8-и битное.
листинг объявлений такой:
Спойлер
#define LCD_LO_DDR DDRD#define LCD_LO_PORT PORTD
#define LCD_LO_PIN PIND
#define LCD_CS_DDR DDRC
#define LCD_CS_PORT PORTC
#define LCD_CS_PIN PINC
#define LCD_CS_BIT 0
#define LCD_RS_DDR DDRC
#define LCD_RS_PORT PORTC
#define LCD_RS_PIN PINC
#define LCD_RS_BIT 1
#define LCD_WR_DDR DDRC
#define LCD_WR_PORT PORTC
#define LCD_WR_PIN PINC
#define LCD_WR_BIT 2
#define LCD_RST_DDR DDRC
#define LCD_RST_PORT PORTC
#define LCD_RST_PIN PINC
#define LCD_RST_BIT 3
#define LCD_SET_CS() LCD_CS_PORT |= (1<<LCD_CS_BIT)
#define LCD_CLR_CS() LCD_CS_PORT &= ~(1<<LCD_CS_BIT)
#define LCD_DIR_CS(x) LCD_CS_DDR |= (1<<LCD_CS_BIT)
#define LCD_SET_RS() LCD_RS_PORT |= (1<<LCD_RS_BIT)
#define LCD_CLR_RS() LCD_RS_PORT &= ~(1<<LCD_RS_BIT)
#define LCD_DIR_RS(x) LCD_RS_DDR |= (1<<LCD_RS_BIT)
#define LCD_SET_WR() LCD_WR_PORT |= (1<<LCD_WR_BIT)
#define LCD_CLR_WR() LCD_WR_PORT &= ~(1<<LCD_WR_BIT)
#define LCD_DIR_WR(x) LCD_WR_DDR |= (1<<LCD_WR_BIT)
#define LCD_SET_RST() LCD_RST_PORT |= (1<<LCD_RST_BIT)
#define LCD_CLR_RST() LCD_RST_PORT &= ~(1<<LCD_RST_BIT)
#define LCD_DIR_RST(x) LCD_RST_DDR |= (1<<LCD_RST_BIT)
минималка функций такая:
Спойлер
void LCD_WrCmd(unsigned char cmd){
LCD_CLR_RS();
LCD_LO_PORT = cmd>>8;
LCD_LO_PORT = cmd;
LCD_CLR_WR();
LCD_SET_WR();
}
void LCD_WrDat(unsigned int val)
{
LCD_CLR_CS();
LCD_SET_RS();
LCD_LO_PORT = val>>8;
LCD_LO_PORT = val;
LCD_CLR_WR();
LCD_SET_WR();
}
void LCD_InitPort(void)
{
LCD_SET_RST();
delay_ms(10);
LCD_CLR_RST();
delay_ms(30);
LCD_SET_RST();
delay_ms(50);
LCD_SET_WR();
LCD_SET_RS();
LCD_CLR_CS();
LCD_WrCmd(0x0007);LCD_WrDat(0x0021);
LCD_WrCmd(0x0000);LCD_WrDat(0x0001);
LCD_WrCmd(0x0007);LCD_WrDat(0x0023);
LCD_WrCmd(0x0010);LCD_WrDat(0x0000);
delay_ms(30);
LCD_WrCmd(0x0007);LCD_WrDat(0x0033);
LCD_WrCmd(0x0011);LCD_WrDat(0x6058);
LCD_WrCmd(0x0002);LCD_WrDat(0x0600);
}
void display_rgb(unsigned int data)
{
unsigned int i,j;
for(i=0;i<320;i++)
{
for(j=0;j<240;j++)
{
LCD_WrDat(data);
}
}
}
проверка экрана:
DDRD = 0xff;
DDRC = 0xff;
LCD_InitPort();
delay_ms(100);
display_rgb(0x07E0);
while (1){};
нифига не пашет. Подскажите, пожалуйста, что я делаю не так?
-
srg320
- Встал на лапы
- Сообщения: 85
- Зарегистрирован: Пт фев 01, 2013 17:47:26
- Откуда: Украина, Луганская область
Re: Юзаем дисплеи от сотовых и других потаскунчиков.
Сразу что бросилось в глаза:
1)
в дисплей через LCD_LO_PORT всегда запишется только младший байт, нужно приблизительно так
тоже касается и функции LCD_WrDat
2)если команда - 1 байт, то строчка LCD_LO_PORT = cmd>>8; лишняя,
если команда - 2 байта, то аргумент функции не может быть char
1)
Код: Выделить всё
void LCD_WrCmd(unsigned char cmd)
{
LCD_CLR_RS();
LCD_LO_PORT = cmd>>8;
LCD_LO_PORT = cmd;
LCD_CLR_WR();
LCD_SET_WR();
}в дисплей через LCD_LO_PORT всегда запишется только младший байт, нужно приблизительно так
Код: Выделить всё
void LCD_WrCmd(unsigned char cmd)
{
LCD_CLR_RS();
LCD_LO_PORT = cmd>>8;
LCD_CLR_WR();
LCD_SET_WR();
LCD_LO_PORT = cmd;
LCD_CLR_WR();
LCD_SET_WR();
}тоже касается и функции LCD_WrDat
2)если команда - 1 байт, то строчка LCD_LO_PORT = cmd>>8; лишняя,
если команда - 2 байта, то аргумент функции не может быть char
Re: Юзаем дисплеи от сотовых и других потаскунчиков.
srg320 писал(а):в дисплей через LCD_LO_PORT всегда запишется только младший байт
если команда - 1 байт, то строчка LCD_LO_PORT = cmd>>8; лишняя,
если команда - 2 байта, то аргумент функции не может быть char
поправьте меня, если я не прав: я передаю cmd. эта переменная 16 бит. Передаю по очереди. Сначала первые 8 бит - это cmd>>8, потом остальные 8 бит: cmd.
вот и получается:
LCD_LO_PORT = cmd>>8;
LCD_LO_PORT = cmd;
или между ними строб нужен? не могу найти эту информацию. смотрю ардуиновскую библиотеку (UTFT), так там PORTA = VH; PORTA = VL;
т.е. через один порт передается 16 бит по 8 бит поочереди.
-
srg320
- Встал на лапы
- Сообщения: 85
- Зарегистрирован: Пт фев 01, 2013 17:47:26
- Откуда: Украина, Луганская область
Re: Юзаем дисплеи от сотовых и других потаскунчиков.
Если вы просто оперируете портами, то строб нужен, контроллер дисплея не может записать данные без сигнала WR.
Ардуиновских библиотек не видел, не могу ничего сказать.
Ардуиновских библиотек не видел, не могу ничего сказать.
Re: Юзаем дисплеи от сотовых и других потаскунчиков.
kentik писал(а):поправьте меня, если я не прав: я передаю cmd. эта переменная 16 бит. Передаю по очереди. Сначала первые 8 бит - это cmd>>8, потом остальные 8 бит: cmd.
вот и получается:
А я вот тоже никак не могу понять, отчего переменная cmd вдруг стала 16 бит.
LCD_WrCmd(unsigned char cmd)
Дальше просто не стал разбираться.

Но стробами помахать вообще то надо после каждого изменения данных.
- hd44780
- Встал на лапы
- Сообщения: 132
- Зарегистрирован: Вт июл 14, 2009 09:27:37
- Откуда: Донецк, Украина
Re: Юзаем дисплеи от сотовых и других потаскунчиков.
Да, поддерживаю Cheba всеми четырьмя... Насчёт размера cmd - ляп капитальнейший ... Дальше уже можно и не смотреть - явная чепуха...
Кстати здесь:
void LCD_WrDat(unsigned int val)
этого ляпа нет.
Вдогонку вышесказанному.
Кто будет CS обратно в единицу поднимать? Конечно на дисплей оно не влияет, но надо делать как положено.
Если он Вам не нужен, то отключите его от проца вообще, присоедините его непосредственно к земле и всё ...
Соответственно из кода всё, касающееся его убрать.
Ардуину не смотрел, у меня другие цацки.
Дайте полный текст.
Кстати здесь:
void LCD_WrDat(unsigned int val)
этого ляпа нет.
Вдогонку вышесказанному.
Кто будет CS обратно в единицу поднимать? Конечно на дисплей оно не влияет, но надо делать как положено.
Если он Вам не нужен, то отключите его от проца вообще, присоедините его непосредственно к земле и всё ...
Соответственно из кода всё, касающееся его убрать.
Ардуину не смотрел, у меня другие цацки.
смотрю ардуиновскую библиотеку (UTFT), так там PORTA = VH; PORTA = VL;
т.е. через один порт передается 16 бит по 8 бит поочереди
Дайте полный текст.
Последний раз редактировалось hd44780 Вт май 07, 2013 13:03:21, всего редактировалось 1 раз.
Re: Юзаем дисплеи от сотовых и других потаскунчиков.
согласен. ляп крутой.
виноват.
подскажите, правильно ли я понимаю алгоритм 8-и битного управления?
отправка адреса:
{cs=0
rs=0
ставлю в порт 8-и битное значение адреса
wr=0
wr=1
cs=1}
отправка данных:
{cs=0
rs=1
ставлю в порт 8-ми битное значение данных (половину от 16 битного, тут как раз и cmd>>8)
wr=0
wr=1
ставлю в порт 8-ми битное значение данных (вторую половину от 16 битного, тут как раз и cmd)
wr=0
wr=1
cs=1}
там черт ногу сломает. надо начинать вообще с файлов распиновки платы.
нафиг нафик эту ардуину
так. стоп. что вы меня путаете?
LCD_WrCmd(unsigned char cmd) - это адрес. он 8-ми битный. так что тип правильный
а функция передачи данных:
void LCD_WrDat(unsigned int val)
хотя косяк все же есть. впервой функции вообще мяупойми откуда строчка LCD_LO_PORT = cmd>>8;
виноват.
подскажите, правильно ли я понимаю алгоритм 8-и битного управления?
отправка адреса:
{cs=0
rs=0
ставлю в порт 8-и битное значение адреса
wr=0
wr=1
cs=1}
отправка данных:
{cs=0
rs=1
ставлю в порт 8-ми битное значение данных (половину от 16 битного, тут как раз и cmd>>8)
wr=0
wr=1
ставлю в порт 8-ми битное значение данных (вторую половину от 16 битного, тут как раз и cmd)
wr=0
wr=1
cs=1}
hd44780 писал(а):Дайте полный текст.
там черт ногу сломает. надо начинать вообще с файлов распиновки платы.
нафиг нафик эту ардуину
так. стоп. что вы меня путаете?
LCD_WrCmd(unsigned char cmd) - это адрес. он 8-ми битный. так что тип правильный
а функция передачи данных:
void LCD_WrDat(unsigned int val)
хотя косяк все же есть. впервой функции вообще мяупойми откуда строчка LCD_LO_PORT = cmd>>8;
- hd44780
- Встал на лапы
- Сообщения: 132
- Зарегистрирован: Вт июл 14, 2009 09:27:37
- Откуда: Донецк, Украина
Re: Юзаем дисплеи от сотовых и других потаскунчиков.
kentik писал(а):подскажите, правильно ли я понимаю алгоритм 8-и битного управления?
Правильно. Поправочка только одна.
CS=0 ставьте перед всем "пакетом" команд. CS=1 после него.
Т.е.
{
cs=0
rs=0
ставлю в порт 8-и битное значение адреса
wr=0
wr=1
rs=1
ставлю в порт 8-ми битное значение данных (половину от 16 битного, тут как раз и cmd>>8)
wr=0
wr=1
ставлю в порт 8-ми битное значение данных (вторую половину от 16 битного, тут как раз и cmd)
wr=0
wr=1
cs=1}
Хотя и Ваш вариант нормальный.
И, конечно, проконтролируйте на всякий случай, минимальные длительности сигналов, хотя, я думаю, что здесь всё чисто ...
kentik писал(а):нафик эту ардуину
Правильно. Лучше читать ДШ на дисплей.
Последний раз редактировалось hd44780 Вт май 07, 2013 13:11:58, всего редактировалось 1 раз.
Re: Юзаем дисплеи от сотовых и других потаскунчиков.
По поводу передачи 16 бит по 8-битной шине - тут ещё важно, какой порядок следования байт, Little-Endian (начиная со старших) или Big-Endian ( начиная с младших). Это нужно даташит смотреть.
(Аналогично по однобитовым последовательным шинам - есть LSB и MSB порядок передачи бит)
(Аналогично по однобитовым последовательным шинам - есть LSB и MSB порядок передачи бит)
Re: Юзаем дисплеи от сотовых и других потаскунчиков.
Cheba писал(а): тут ещё важно, какой порядок следования байт
согласен. важно. мне сейчас хоть что-нибудь получить. если я ошибся и перепутал местами старший и младший байт, то все равно вывод будет на экране. белеберды, но все равно будет.
- hd44780
- Встал на лапы
- Сообщения: 132
- Зарегистрирован: Вт июл 14, 2009 09:27:37
- Откуда: Донецк, Украина
Re: Юзаем дисплеи от сотовых и других потаскунчиков.
kentik писал(а):cmd - это адрес. он 8-ми битный. так что тип правильный
а функция передачи данных:
void LCD_WrDat(unsigned int val)
хотя косяк все же есть. впервой функции вообще мяупойми откуда строчка LCD_LO_PORT = cmd>>8;
Ну так и выкиньте эту строчку. Только мешает и с толку сбивает
все равно вывод будет на экране. белеберды, но все равно будет
Не согласен. На этапе первичной инициализации, когда идёт поток управляющих команд это ОЧЕНЬ критично.
Т.к., например, 0xFF00 и 0х00FF - совершенно разные команды, и одна другую не заменяет.
Это когда Вы рисовать начнёте, там вы правы.
Re: Юзаем дисплеи от сотовых и других потаскунчиков.
hd44780 писал(а):Не согласен. На этапе первичной инициализации, когда идёт поток управляющих команд это ОЧЕНЬ критично.
тысяча чертей. вы абсолютно правы. теперь при инициализации экран стал немного тухнуть. уже какой-то шаг. спасибо большое.
но один фиг ничего не выводится.
вот листинг :
Спойлер
void LCD_Writ_Bus(char VH,char VL){
PORTD = VH;
LCD_CLR_WR();
LCD_SET_WR();
PORTD = VL;
LCD_CLR_WR();
LCD_SET_WR();
}
void LCD_Write_COM(char VL)
{
LCD_CLR_CS();
LCD_CLR_RS();
LCD_Writ_Bus(0x00,VL);
}
void LCD_Write_DATA(char VH,char VL)
{
LCD_CLR_CS();
LCD_SET_RS();
LCD_Writ_Bus(0x01,VH);
LCD_Writ_Bus(0x01,VL);
}
void LCD_Write_COM_DATA(char com1,int dat1)
{
LCD_Write_COM(com1);
LCD_Write_DATA(dat1,dat1>>8);
}
void InitLCD()
{
LCD_SET_RST();
delay_ms(10);
LCD_CLR_RST();
delay_ms(30);
LCD_SET_RST();
delay_ms(50);
LCD_SET_WR();
LCD_SET_RS();
LCD_CLR_CS();
LCD_Write_COM_DATA(0x07,0x0021);
LCD_Write_COM_DATA(0x00,0x0001);
LCD_Write_COM_DATA(0x07,0x0023);
LCD_Write_COM_DATA(0x10,0x0000);
delay_ms(30);
LCD_Write_COM_DATA(0x07,0x0033);
LCD_Write_COM_DATA(0x11,0x6058);
LCD_Write_COM_DATA(0x02,0x0600);
}
void setPixel(int r,int g,int b)
{
LCD_Write_DATA(((r&248)|g>>5),((g&28)<<3|b>>3)); // rrrrrggggggbbbbb
}
void setXY(int x1, int y1, int x2, int y2)
{
LCD_Write_COM_DATA(0x44,(x2<<8)+x1);
LCD_Write_COM_DATA(0x45,y1);
LCD_Write_COM_DATA(0x46,y2);
LCD_Write_COM_DATA(0x4e,x1);
LCD_Write_COM_DATA(0x4f,y1);
LCD_Write_COM(0x22);
}
void setColor(int r, int g, int b)
{
fcolorr=r;
fcolorg=g;
fcolorb=b;
}
void drawPixel(int x, int y)
{
LCD_CLR_CS();
setXY(x, y, x, y);
setPixel(fcolorr, fcolorg, fcolorb);
LCD_SET_CS();
}
а вот такие команды инициализации в библиотеки ардуино:
(с ними так же все)
Спойлер
/* LCD_Write_COM_DATA(0x00,0x0001);LCD_Write_COM_DATA(0x03,0xA8A4);
LCD_Write_COM_DATA(0x0C,0x0000);
LCD_Write_COM_DATA(0x0D,0x080C);
LCD_Write_COM_DATA(0x0E,0x2B00);
LCD_Write_COM_DATA(0x1E,0x00B7);
LCD_Write_COM_DATA(0x01,0x2B3F);
LCD_Write_COM_DATA(0x02,0x0600);
LCD_Write_COM_DATA(0x10,0x0000);
LCD_Write_COM_DATA(0x11,0x6070);
LCD_Write_COM_DATA(0x05,0x0000);
LCD_Write_COM_DATA(0x06,0x0000);
LCD_Write_COM_DATA(0x16,0xEF1C);
LCD_Write_COM_DATA(0x17,0x0003);
LCD_Write_COM_DATA(0x07,0x0233);
LCD_Write_COM_DATA(0x0B,0x0000);
LCD_Write_COM_DATA(0x0F,0x0000);
LCD_Write_COM_DATA(0x41,0x0000);
LCD_Write_COM_DATA(0x42,0x0000);
LCD_Write_COM_DATA(0x48,0x0000);
LCD_Write_COM_DATA(0x49,0x013F);
LCD_Write_COM_DATA(0x4A,0x0000);
LCD_Write_COM_DATA(0x4B,0x0000);
LCD_Write_COM_DATA(0x44,0xEF00);
LCD_Write_COM_DATA(0x45,0x0000);
LCD_Write_COM_DATA(0x46,0x013F);
LCD_Write_COM_DATA(0x30,0x0707);
LCD_Write_COM_DATA(0x31,0x0204);
LCD_Write_COM_DATA(0x32,0x0204);
LCD_Write_COM_DATA(0x33,0x0502);
LCD_Write_COM_DATA(0x34,0x0507);
LCD_Write_COM_DATA(0x35,0x0204);
LCD_Write_COM_DATA(0x36,0x0204);
LCD_Write_COM_DATA(0x37,0x0502);
LCD_Write_COM_DATA(0x3A,0x0302);
LCD_Write_COM_DATA(0x3B,0x0302);
LCD_Write_COM_DATA(0x23,0x0000);
LCD_Write_COM_DATA(0x24,0x0000);
LCD_Write_COM_DATA(0x25,0x8000);
LCD_Write_COM_DATA(0x4f,0x0000);
LCD_Write_COM_DATA(0x4e,0x0000);
LCD_Write_COM(0x22); */
ну и сам main:
delay_ms(1000); / видеть реакцию экрана после включения
InitLCD();
delay_ms(100); / просто захотелось
setColor(0,0,0);
for (i=0;i<50;i++) {
drawPixel(i,i) ;
delay_ms(50);
};


