forfrends, перевод на ДУЕ неудобен, там с портами набезобразили, раскидали кусками по всей плате и обозначаются иначе.
неужели у друзей или знакомых нет какойнибудь электроники? этих резисторов валом везде, особенно в старых материнках, cd-rom, hdd , платах принтеров, телевизоров, ... . пойдут от 10ком-20ком (мож и поменьше номиналы, непроверял) . вместо стабилитрона 3,0-3,3в белый светодиод, или 2 старых красных последовательно.
Lelick, как подключить смотрите внимательно подобные примеры выше, можете в инете найти схему на тлф и глянуть, на других форумах от сониэриков подключали, ссылка подобного давал в предыдущем посте.
дисплей 16бит, для перевода на 8 бит надо перекинуть дорожку проходящую между кондерами С6 и С2 с "+" на "GND". Распиновка оказалась часто встречающаяся 37пин:
вызов библиотеки UTFT myGLCD(ILI9325D_16ALT,38,39,40,41);
всё таки для надёжности лучше не использовать подсветку дисплея в качестве стабилизатора , желательно стабилитроном 3,0-3,3в . Разноцветные эмальрованные провода с моторчиков cd-rom, старых кассетных магнитофонов,....
дисплейчик большой, красочный, очень хорошие углы обзора, имеет металлизацию с тылу, к которой удобно приклеить на 2х сторонний скотч всё остальное. Можно высвободить ещё 2 пина : вывод RESET дисплея соеденить с таким же на ардуино, чтоб дисплей сбрасывался вместе с ней. и вывод CS (выбор кристалла) лог.0 (на GND) . с UTFT вычистить их использование и вуаля :) , имеем 12 пинов свободных (8 из них аналоговые) . Если прижмет можно и D0-D7 использовать, если микросхему регистр добавлять.
устройство получилось очень компактное и тонкое (если заменить кварц, кондеры, убрать кнопку, то толщина 5мм , львиная доля - толщина дисплея) . По ширине и длине чуть меньше пластиковой карты.
В качестве корпуса превосходно подходят карточницы, и прозрачный корпус от пакета симки Мегафон , Теле2 ,... , сверху ещё остается место чтоб шурупами насквозь притянуть корпус куда нибудь.
устройство предназначалось как логгер с графиками температур и напряжений.
//Если использовать ардуино 3,3в, то никакие резисторы и не надо. питание можно от лития, и в корпус от старых аудио кассет вместе с аккумулятором.
новые дисплеи можно ещё найти в магазинах в своих городах, то там обычно остатки, цена 50-200руб.
// 05.2017 дополнение
стабилитрон понадежнее поставить 3.0в , 3.3 это рядом с пределом диспа.
Slider, можете помочь? Пытаюсь подогнать программу из первого поста к Дуе... Сразу возникло несколько вопросов:
В коде используется пин #define CD_Pin 38 // (RS), Но у меня в распиновке нет ни CD ни RS, это случайно не DC? Также вопрос: в коде есть RST_Pin 41 это подключение пина RESET дисплея?
И еще : PORTA=0x00; PORTC=0x00; // это команда для считывания ID дисплея =0x00
Как именно происходит считывание ИД дисплея? Если не ошибаюсь - это команды настройки портов А и С на вход? Можно ли просто заменить на код for (i=22; i<=37;i++) { pinMode(i, INPUT); }
Попробовал переделать код под Arduino DUE и дисплей 128*64 на контроллере ST7920. Вот что получилось:
#include "U8glib.h"
#define CD_Pin 38 // (RS)
#define WR_Pin 39
#define CS_Pin 40
#define RST_Pin 41
#define RD_Pin 42
U8GLIB_ST7920_128X64_4X u8g(48, 47, 49); // SPI Com: SCK = En = 18, MOSI = rw = 16, CS=RS=di= 17
int i;
byte byteH;
byte byteL;
void draw(void) {
// graphic commands to redraw the complete screen should be placed here
u8g.setFont(u8g_font_unifont);
//lcd.begin(16, 2);
digitalWrite(CS_Pin, 1); // деактивация диспл. (отключение его шины данных DB0..DB15)
digitalWrite(RST_Pin, 0); // сброс дисплея
//for (i=22; i<=42;i++) { digitalWrite(i, 0); } // всё лог.0
for (i=22; i<=42;i++) { pinMode(i, OUTPUT); } // конфиг всех пинов на выход + управляющие пины
digitalWrite(RST_Pin, 1); // вывод дисплея из сброса
// запишем команду
digitalWrite(RD_Pin, 1); // уст. порта дисплея на приём (ввод данных в дисплей)
digitalWrite(CD_Pin, 0); // будем работать 0-команда 1-данные
digitalWrite(CS_Pin, 0); // выбор дисплея (активация)
//PORTA=0x00; PORTC=0x00; // это команда для считывания ID дисплея =0x00
for (i=22; i<=42;i++) { digitalWrite(i, LOW); } //
digitalWrite(WR_Pin, 1); // дёргаем WR
digitalWrite(WR_Pin, 0);
digitalWrite(CS_Pin, 1); // деактивация диспл. (отключение его шины данных DB0..DB15)
//чтение данных
//DDRA=0x00; DDRC=0x00; // или
for (i=22; i<=37;i++) { pinMode(i, INPUT); } // конфиг всех пинов на вход
digitalWrite(RD_Pin, 0); // уст. порта дисплея на передачу (вывод данных с дисплея)
digitalWrite(CD_Pin, 1); // будем работать с 0-команда 1-данные
digitalWrite(CS_Pin, 0); // выбор дисплея (активация )
digitalWrite(WR_Pin, 1); // дёргаем WR
digitalWrite(WR_Pin, 0);
u8g.setPrintPos(0, 10);
byteH=0;
if ( digitalRead(29) ) { byteH=byteH+128; u8g.print(1); } else u8g.print(0);
if ( digitalRead(28) ) { byteH=byteH+64; u8g.print(1); } else u8g.print(0);
if ( digitalRead(27) ) { byteH=byteH+32; u8g.print(1); } else u8g.print(0);
if ( digitalRead(26) ) { byteH=byteH+16; u8g.print(1); } else u8g.print(0);
if ( digitalRead(25) ) { byteH=byteH+8; u8g.print(1); } else u8g.print(0);
if ( digitalRead(24) ) { byteH=byteH+4; u8g.print(1); } else u8g.print(0);
if ( digitalRead(23) ) { byteH=byteH+2; u8g.print(1); } else u8g.print(0);
if ( digitalRead(22) ) { byteH=byteH+1; u8g.print(1); } else u8g.print(0);
byteL=0;
if ( digitalRead(30) ) { byteL=byteL+128; u8g.print(1); } else u8g.print(0);
if ( digitalRead(31) ) { byteL=byteL+64; u8g.print(1); } else u8g.print(0);
if ( digitalRead(32) ) { byteL=byteL+32; u8g.print(1); } else u8g.print(0);
if ( digitalRead(33) ) { byteL=byteL+16; u8g.print(1); } else u8g.print(0);
if ( digitalRead(34) ) { byteL=byteL+8; u8g.print(1); } else u8g.print(0);
if ( digitalRead(35) ) { byteL=byteL+4; u8g.print(1); } else u8g.print(0);
if ( digitalRead(36) ) { byteL=byteL+2; u8g.print(1); } else u8g.print(0);
if ( digitalRead(37) ) { byteL=byteL+1; u8g.print(1); } else u8g.print(0);
u8g.setPrintPos(0, 30);
u8g.print("ID display: ");
u8g.print(byteH, HEX);
u8g.setPrintPos(0, 50);
u8g.print(byteL, HEX);
digitalWrite(CS_Pin, 1); // деактивация диспл. (отключение шины данных DB0..DB15)
//DDRA=0xFF; DDRC=0xFF; // или
for (i=22; i<=37;i++) { pinMode(i, OUTPUT); } // конф. шины данных ARDUINO на выход
digitalWrite(RD_Pin, 1); // уст. порта дисплея на приём (ввод данных в дисплей)
//digitalWrite(RST_Pin, 1);
// вставка для UTFT
// pinMode(42, OUTPUT); // конф.ардуино для RD на выход
// digitalWrite(42, 1); // уст. RD=1 - чтобы порт дисплея был на приём (ввод данных в дисплей)
//delay(100);
}
void setup(void) {
u8g.firstPage();
do {
draw();
} while( u8g.nextPage() );
}
void loop() {
// put your main code here, to run repeatedly:
}
В результате в верхней строке только нули и ИД контроллера - тоже нули. Есть большое побозрение на неправильное подключение дисплея (писал в предыдущем посте). Можете с этим помочь?
Перелапатил кучу сайтов... Не нашел никакой другой распиновки кроме той что уже имеется. НО! Везде распиновка была на дисплеи 1.5-2.5 дюймов, а здесь все 4". Настораживает это.
Попробовал переделать программу читалка ID дисплеев v2.0 под ДУЕ. Собственно, вот что получилось:
#define CD_Pin 38 // (RS) //38
#define DCX 38
#define WR_Pin 39 //39
#define WRX 39
#define CS_Pin 40 //40
#define CSX 40
#define RST_Pin 41 //41
#define RSTX 41
#define RD_Pin 42 //42 __-
#define RDX 42
int i=0;
byte byteH;
byte byteL;
void setup()
{
Serial.begin(9600);
digitalWrite(RST_Pin, 0); // удержание в сбросе дисплея
digitalWrite(CS_Pin, 0); // активация шины данных дисплея (выбор кристалла ChipSelect)
for (i=22; i<=42;i++) { pinMode(i, OUTPUT); } // конфиг всех пинов на выход + управляющие пины //i=22; i<=42;i++
Serial.println("start... " );
Serial.println("UTFT normal pin29-22(PORTA)-byteH(DB15-0) , pin37-30(PORTC)-byteL(DB7-0)");
Serial.println("");
digitalWrite(RST_Pin, 1); // вывод дисплея из сброса
delay(5);
digitalWrite(RST_Pin, 0); // удержание в сбросе дисплея
delay(15);
digitalWrite(RST_Pin, 1);
delay(500);
Serial.println("register 00h for ILI9320(9320), ILI9325(9325), ILI9326(9326), SSD1289(1289,8989)" );
Serial.println(" HX8347D(047), HX8347G(075), HX8352A(052), HX8352B(065), HX8352C(072)");
Serial.println(" R61509V(B509), R61505W(C505), SPFD5420A(5408) ");
Serial.println("if (0 93 0 27) -> 8bit . if (93 27 93 27) -> 16bit " );
byteH=0x00 ; byteL=0x00 ; //
writeCommand_read6Parameter();
rstx_u();
Serial.println("register EFh for ILI9327(0 02 04 93 27 FF), " );
byteH=0x00 ; byteL=0xEF ; // для ili9327 - 00 02 04 93 27 FF
writeCommand_read6Parameter();
rstx_u();
Serial.println("register BFh for ILI9481(0 0 94 81 xx xx) " );
byteH=0x00 ; byteL=0xBF ; // для ili9481 - 00 00 94 81 xx xx
writeCommand_read6Parameter();
rstx_u();
Serial.println("register D3h for ILI9488(0 0 94 88 xx xx) " );
byteH=0x00 ; byteL=0xD3 ; // для ili9488 - 00 00 94 88 xx xx
writeCommand_read6Parameter();
rstx_u();
Serial.println("register 04h for HX8357(?DA-DC), HX8353(?80-85), " );
byteH=0x00 ; byteL=0x04 ; // для - xx xx
writeCommand_read6Parameter();
rstx_u();
}
// Г Л А В Н А Я П Р О Г Р А М М А
void loop()
{
// put your main code here, to run repeatedly:
}
// П О Д П Р О Г Р А М М Ы , Ф У Н К Ц И И
// RST вверх. Сброс дисплея
int rstx_u()
{
digitalWrite(RSTX, 0); delay(15);
digitalWrite(RSTX, 1); delay(250);
}
// дергаем WR вверх
int wrx_u()
{
digitalWrite(WRX, 0); digitalWrite(WRX, 1); //digitalWrite(WRX, 0);
delay(2);
}
// дергаем RD вверх и считываем данные
int rdx_u()
{
//digitalWrite(RDX, 0); digitalWrite(RDX, 1); // digitalWrite(RDX, 0);
digitalWrite(RDX, 1); digitalWrite(RDX, 0); // оставим в 0 , чтоб порт дисплея был на выход,
// и преобразователи уровней на шилде (если они есть) тоже были на выход
delay(2);
//byteH=0; byteL=0;
//byteH=PINA; // считываем с выводов PORTA
//byteL=PINC; // считываем с выводов PORTC
byteH=0; // PORTA считаем
if ( digitalRead(29) ) byteH=byteH+128;
if ( digitalRead(28) ) byteH=byteH+64;
if ( digitalRead(27) ) byteH=byteH+32;
if ( digitalRead(26) ) byteH=byteH+16;
if ( digitalRead(25) ) byteH=byteH+8;
if ( digitalRead(24) ) byteH=byteH+4;
if ( digitalRead(23) ) byteH=byteH+2;
if ( digitalRead(22) ) byteH=byteH+1;
byteL=0; // PORTC считаем
if ( digitalRead(30) ) byteL=byteL+128;
if ( digitalRead(31) ) byteL=byteL+64;
if ( digitalRead(32) ) byteL=byteL+32;
if ( digitalRead(33) ) byteL=byteL+16;
if ( digitalRead(34) ) byteL=byteL+8;
if ( digitalRead(35) ) byteL=byteL+4;
if ( digitalRead(36) ) byteL=byteL+2;
if ( digitalRead(37) ) byteL=byteL+1;
}
// конфигурация порта на вход
int port_in()
{
//DDRA=0x00; DDRC=0x00; // конфиг всех пинов на вход
for (i=22; i<=37;i++) { pinMode(i, INPUT); }
//PORTA=0x00; PORTC=0x00; // выключение подтягивающих резисторов
for (i=22; i<=37;i++) { digitalWrite(i, LOW); }
}
// конфигурация портов на выход
int port_out()
{
//DDRA=0xFF; DDRC=0xFF; // конфиг всех пинов на выход
for (i=22; i<=37;i++) { pinMode(i, OUTPUT); }
//PORTA=0x00; PORTC=0x00; // выключение подтягивающих резисторов
for (i=22; i<=37;i++) { digitalWrite(i, LOW); }
}
int writeCommand_read6Parameter()
{
// передадим команду
digitalWrite(RDX, 1); // сначала порт дисплея в режим приема
port_out(); // конфим ардуинку на выход
//PORTA=byteH ;
//PORTC=byteL ;
if (byteL == 0x00){
for (i=22; i<=37;i++) { digitalWrite(i, LOW); }
}
if (byteL == 0xEF){
digitalWrite(22, HIGH);
digitalWrite(23, HIGH);
digitalWrite(24, HIGH);
digitalWrite(25, HIGH);
digitalWrite(26, LOW);
digitalWrite(27, HIGH);
digitalWrite(28, HIGH);
digitalWrite(29, HIGH);
digitalWrite(30, LOW);
digitalWrite(31, LOW);
digitalWrite(32, LOW);
digitalWrite(33, LOW);
digitalWrite(34, LOW);
digitalWrite(35, LOW);
digitalWrite(36, LOW);
digitalWrite(37, LOW);
}
if (byteL == 0xBF){
digitalWrite(22, HIGH);
digitalWrite(23, HIGH);
digitalWrite(24, HIGH);
digitalWrite(25, HIGH);
digitalWrite(26, HIGH);
digitalWrite(27, HIGH);
digitalWrite(28, LOW);
digitalWrite(29, HIGH);
digitalWrite(30, LOW);
digitalWrite(31, LOW);
digitalWrite(32, LOW);
digitalWrite(33, LOW);
digitalWrite(34, LOW);
digitalWrite(35, LOW);
digitalWrite(36, LOW);
digitalWrite(37, LOW);
}
if (byteL == 0xD3){
digitalWrite(22, HIGH);
digitalWrite(23, HIGH);
digitalWrite(24, LOW);
digitalWrite(25, LOW);
digitalWrite(26, HIGH);
digitalWrite(27, LOW);
digitalWrite(28, HIGH);
digitalWrite(29, HIGH);
digitalWrite(30, LOW);
digitalWrite(31, LOW);
digitalWrite(32, LOW);
digitalWrite(33, LOW);
digitalWrite(34, LOW);
digitalWrite(35, LOW);
digitalWrite(36, LOW);
digitalWrite(37, LOW);
}
if (byteL == 0x04){
digitalWrite(22, LOW);
digitalWrite(23, LOW);
digitalWrite(24, HIGH);
digitalWrite(25, LOW);
digitalWrite(26, LOW);
digitalWrite(27, LOW);
digitalWrite(28, LOW);
digitalWrite(29, LOW);
digitalWrite(30, LOW);
digitalWrite(31, LOW);
digitalWrite(32, LOW);
digitalWrite(33, LOW);
digitalWrite(34, LOW);
digitalWrite(35, LOW);
digitalWrite(36, LOW);
digitalWrite(37, LOW);
}
Serial.print("register " );
Serial.print(byteH, HEX );Serial.print(" ");Serial.println(byteL, HEX );
// 1-будем передавать команду
//digitalWrite(RDX, 1); // порт дисплея в режим приема ***************
digitalWrite(DCX, 0); // для передачи команды в дисплей, а не данных
wrx_u(); // дергаем WRITE вверх
// 2-будем принимать данные
port_in(); // порт ардуины на вход
digitalWrite(DCX, 1); // работаем теперь с данными, а не с командой
digitalWrite(WRX, 1);
rdx_u(); // дергаем RD и получаем данные
Serial.print("1 Parameter " );
Serial.print(byteH,HEX);Serial.print(" ");Serial.println(byteL, HEX);
rdx_u();
Serial.print("2 Parameter " );
Serial.print(byteH,HEX);Serial.print(" ");Serial.println(byteL, HEX);
rdx_u();
Serial.print("3 Parameter " );
Serial.print(byteH,HEX);Serial.print(" ");Serial.println(byteL, HEX);
rdx_u();
Serial.print("4 Parameter " );
Serial.print(byteH,HEX);Serial.print(" ");Serial.println(byteL, HEX);
rdx_u();
Serial.print("5 Parameter " );
Serial.print(byteH,HEX);Serial.print(" ");Serial.println(byteL, HEX);
rdx_u();
Serial.print("6 Parameter " );
Serial.print(byteH,HEX);Serial.print(" ");Serial.println(byteL, HEX);
Serial.println("");
}
Из дисплея ничего не читает. Пины DB7-0 подключал к пинам 37-30 ардуины.
так то правильно перевод байтов на пины и обратно, молодец,(точность не проверял, но принцип вы точно уловили) так мне кажется проще для DUE (можно и ещё упростить чтение с пинов используя операции сдвига в байте - эт для заядлых разбирающихся в С++, я начинал с программирования на ассемблере, С++ для меня тяжко, надо постоянно в нём быть, чтоб помнить что к чему).
Как вариант , можно ещё глянуть как пересылает UTFT 8ми битные байты (H+L) в 32х разрядные для DUE , в файлике ...Arduino\libraries\UTFT\hardware\arm\HW_SAM3X8E.h
через установку побитно 0 и 1 в 32х разрядном байте DUE , для попадания на нужные пины по плате. Но эт для скорости вывода такая припарка из-за разбросанности пинов порта по плате. Для чтения ID скорость не важна.
Проще посылать в сериал монитор и смотреть там, зачем приляпывать экран для вывода ID , хотя и 4х строчный на ST7920 . Вторая читалка выдаёт очень много инфы , по многим часто встречающимся адресам, поэтому внешний дисплей не покажет это всё сразу. Первая читалка(с первого сообщения) только по нулевому адресу, поэтому там и внешний экран для вывода.
пока ваше подключение не проверял, но надо подключить как указано в UTFT_Requirements.pdf , на стр2 есть табличка , 6-е уточнение - для 8ми битного дисплея DB0-DB7 на земле, тогда подключать к пинам D22...D29 (начиная с младшего заканчивая старшим, в вашем случае соответственно дисплейные DB10...DB17 , т.е. D22 DUE подключаем к DB10 дисплейному и т.д.) . на RD подаем лог1 (+3,3в). Далее убеждаемся что в файле memorysaver.h все disable иницициализаций закоментированы. Далее в файле UTFT.cpp меняем bytedtm[] = {16, .... , SERIAL_5PIN}; на все "8" bytedtm[] = {8, .... , 8}; , т.е. перестраиваем все режимы на 8бит . ( worddsx[] = и worddsy[] пока необязательно, главно пока угадать инициализацию) Далее открываем пример, к примеру UTFT\examples\Arduino (ARM) + Teensy\UTFT_Demo_400x240 (можно под лупой разглядеть пиксели на экране на сантиметр и примерно прикинуть его разрешение) и перебираем UTFT myGLCD(ITDB32WD,38,39,40,41); 32 раза от UTFT myGLCD(0,38,39,40,41); до UTFT myGLCD(31,38,39,40,41); загружая в ардуино , и ожидая около 5 секунд на какой инициализации что появится на экране. Если экран хоть немного сменит яркость - эт тоже хорошо(дисплей проснулся, заработали преобразователи для питания ЖК матрицы), значит инициализация немного подходит к семейству его контроллера. Ну а в лучшем случае появится тест на экране.
И обязательно попробовать UTFT_v2.77b2_uno_ili9327_8bit_turbo либу из соседней ветки 3.5", на Уно подключается как адафруитский шилд (DB0-DB7 к D8,D9,D2-D7) , на меге к портуС (D37-D30) . Ибо с некоторыми контоллерами дисплеев в режиме 8бит надо немного по другому общаться. В этой либе по умолчанию настроен №31 инит - ili9327, но можно подменять закидывая в папку UTFT_\tft_drivers\ili9327_8 другие иниты и установки.
2.способ вероятность 99,9% , считать ID, и использовать его инициализацию в UTFT, если в ней не окажется , то запросто найти в инете и подменить схожую в UTFT.
либо а). переделать первую читалку согласно пинам DUE , и перебрать все самые распространённые регистры где может лежать ID .
либо б). лучше также переделать вторую читалку, + возможно её прийдётся переделать на 8 бит (добавляется ещё дерганье WR для пересылки второго 8бит для 16ти битной инфы , и дерганье RD для принятия второго 8битного 16ти битной инфы) , хотя вроде в дисплеях у которых адрес не лежит в 0x00 адресе, и так адрес(регистр) 8ми битный. Или мож там просто предусмотреть переключение PORTA и PORTC между собой, ибо при переключении разных контроллеров с 16 на 8 бит, у них эти 8бит оказываются у кого на PORTA, у кого на PORTC (речь о Меге).
посмотреть к примеру можно скачать даташит ili9488 стр.40-42 , на 40стр показано запись и чтение в 8ми битном режиме "DBI Type B 8-bit". на 41-42 графики записи чтения 16ти битного режима , надо только добавить дерганье соответственно WR и RD для отправки/получения второго и последующего 8ми битного байта. Что-то мне помниться оно немного иное чем для контроллеров у которых ID лежит по 0x00 адресу.
// 8битные дисплеи вторая читалка хорошо читает, если у них ID лежит в 0x00 адресе(регистре). Если в других регистрах, надо время тестить проверять/допиливать на 8бит на DUE(у меня её нет). Если будете переделывать первую читалку, то проверте в ней чтоб правильно устанавливались лог. уровни управляющих сигналов согласно графикам записи чтения , а то я сомневаюсь там в правильности. Вторую читалку переделывать/проверять на 8бит пока у меня нет ни надобности(все дисплеи что мне попадаются, имеют возможность 16ти битного режима) ни самого главного - времени.
//// 1. сделайте 1 способ. 2. когда будете добивать второй способ , то там для 8ми битов надо оставить только их ,
byteL=0; // PORTC считаем
if ( digitalRead(30) ) byteL=byteL+128;
if ( digitalRead(31) ) byteL=byteL+64;
if ( digitalRead(32) ) byteL=byteL+32;
if ( digitalRead(33) ) byteL=byteL+16;
if ( digitalRead(34) ) byteL=byteL+8;
if ( digitalRead(35) ) byteL=byteL+4;
if ( digitalRead(36) ) byteL=byteL+2;
if ( digitalRead(37) ) byteL=byteL+1;
без того что должно падать во второй порт PORTA на другие пины, ибо если вторая читалка ничего не вычитала (лог сериал монитора надо было приложить, подключение D37пин меги/дуе младший бит к младшему биту вашего дисплея D10 и т.д.) , то скорее всего у вас контроллер у которого ID не по 0x00 адресу, пилите вторую читалку, выложите что она ответила в сериал монитор. т.е. выложите что отвечает в сериал монитор переделанная вторая читалка без убирания старшего байта, и с убиранием работы со старшим байтом (пины 29-22).
Спасибо за помощь! С программой сегодня уже не успею, скорее всего завтра- послезавтра. Надеюсь на следующей неделе выбраться в город и купить резисторы, что бы попробовать с Мегой (если не получится с ДУЕ).
Начал читать UTFT_Requirements.pdf, немного не понятно: написанно что для 8-ми битного режима пины DB0-DB7 (подключенные к D37-D30) нужно подключить к земле. Соответственно в 8-ми битном режиме используются только старшие пины DB8-DB15 (подключенные к D22-D29). Но на дисплее только младшие пины DB0-DB7. Получается их нужно поставить на место старших? Так? Что-то я сегодня устал и немного торможу...
forfrends, покажи пожалуйста подробную схему подключения... если можно все.. и весь код? у меня тоже несколько экранчиков есть но на них практически нет информации... есть информация более менее на экранчик от k750i... но вот с чего начать не знаю.... боюсь что спалить..
Точно, извиняюсь ,ошибся, (исправил по возможности), при дисплеях 8бит надо подключать к меге/дуе D22-D29 а не к D30-37. Т.е. у вас младшим битом DB8 к младшему D22 и т.д.
цветной мусор это очень хорошо. это значит дисплей работает, выводится на экран что в видеоОЗУ в контроллере при включении оказалось , значит либо неработает только очистка экрана, м.б. из-за большой скорости дуе, экран не успел отработать или попробуйте перевернуть подключение DB8..DB15 на DB15..DB8 (крайне редко встречал когда распиновка зеркальна была в отличии как на схеме распиновки), либо у UTFT не оказалось нужной инициализации, без чтения ID не обойтись.
// судя по фоткам дорожек в шлейфе и в какой очередности они заходят в стекло, можно попробовать перевернуть DB8..DB15 на зеркально DB15..DB8 и снова прогнать все иниты в UTFT
и попробуйте ещё с прямым и зеркальным подключением инит от ili9488, https://yadi.sk/d/eO7CXOMQkpdYV (файлы из папки UTFT\tft_drivers\ili9486 закиньте в свою UTFT\tft_drivers\ili9486 , вызов UTFT myGLCD(28,38,39,40,41); )
если не поможет, пробуйте вычитать ID, скиньте свою переделку под дуе на 8 бит, проверю на меге (отвечать изменять буду на старые свои сообщения уже заблокированные для изменения, чтоб у вас был доступ отредактировать свое последнее, чтоб не засирать ветку новыми сообщениями)
Lelick , перечитайте тему, ответ написан. Если очень коротко, то:
1) смотрите примерную распиновку дисплея (GND и питание подсветки легко найти, а после и + не сложно)
2) Считаете количество контактов и ищите в интернете все похожие распиновки.
3) Подключаете к Ардуине (лучше Меге, что бы не мучаться так как я) Примерную распиновку подключения смотрите в UTFT_Requirements.pdf на стр2 и перечитайте посты выше.
slider, пробовал переворачивать когда прогонял инициализации - дисплей не реагировал. Но я пробовал не на все, а только на те, на к оторые была реакция. Попробую все прогнать в зеркальном. Отпишусь о результатах.
Инит от ili9488 не подошел. Реакции от дисплея нет ни в прямом, ни в зеркльном подключении.
Пробую вариант 2. Пересмотрел код из первого поста, вроде все верно, но я могу и ошибаться.
// программа для определения ID контроллера дисплея, подключать все 16бит
// (эт чтоб найти старшие биты , ибо в большинстве случаев именно они используются для 8ми битного режима)
//
// в верхней строчке покажет 16 бит ответа с дисплея , начиная со старшего бита
// в нижней строчке в HEX коде старший и младший байты. (для ILI контроллеров это будет 9325, 9320, 9327,...)
// при угадывании правильного подключения шины данных дисплея должно получиться к примеру:
// 1я строчка: 1001 0011 0010 0101
// 2я строчка: 9 3 2 5 ,т.е. это контроллер ILI9325
// подсветку дисплея через ом~20-30 к +5v, питание дисплея от ардуиновских 3.3v (если надо то занизить стабилитроном
// или стабилизатором до 2.8v - т.к. иногда инициализации дисплеев приводятся для 2.8v - там константы напряжений
// для правильной работы ЖК матрицы)
//
// выводы дисплея желательно подключать через резист. делители к примеру 10к+22к , на крайняк тупо через 10к,
// но тогда на питание диспл. посадить стабилитрон 3,0-3,1v и запитывать через резист. ом~20-30 от +3,3v,
// иначе дисплей запитается через выводы и ~4-5v пересилят ардуиновские +3,3v
//
// выводы подключать стандартно UTFT на arduino mega RS(CD),WR, CS, RST
// Standard Arduino Mega/Due shield : <display model>,38, 39, 40, 41
// CTE TFT LCD/SD Shield for Arduino Mega : <display model>,38, 39, 40, 41
//
//выводы ардуино меги 22-29 к предполагаемым выводам дисплея DB8-DB15
//выводы ардуино меги 30-37 к предполагаемым выводам дисплея DB8-DB0
// и дополнительно, для получения ответа от дисплея, необходимо
// к выв. ардуино меги 42 подключить вывод RD дисплея. (по умолчанию на шилдах он кинут на +3.3v)
// Дисплей 1602, выводы VSS, VDD, RS, E, D4, D5, D6, D7
// к выводам ардуино меги GND, +5v, 13, 12, 11, 10, 9, 8
// помним на дисплее поставить резистор 3,3к между VO и VSS(+) , RW замкнуть на VSS(+), подключить A и K к VSS(+) и VDD
#include "U8glib.h"
//#include <LiquidCrystal.h>
#define CD_Pin 38 // (RS)
#define WR_Pin 39
#define CS_Pin 40
#define RST_Pin 41
#define RD_Pin 42
U8GLIB_ST7920_128X64_4X u8g(48, 47, 49); // SPI Com: SCK = En = 18, MOSI = rw = 16, CS=RS=di= 17
//LiquidCrystal lcd(13, 12, 11, 10, 9, 8);
int i;
byte byteH;
byte byteL;
void draw(void) {
// graphic commands to redraw the complete screen should be placed here
u8g.setFont(u8g_font_unifont);
//lcd.begin(16, 2);
digitalWrite(RST_Pin, 0); // удержание в сбросе дисплея
digitalWrite(CS_Pin, 1); // деактивация диспл. (отключение его шины данных DB0..DB15)
digitalWrite(RST_Pin, 0); // сброс дисплея
//for (i=22; i<=42;i++) { digitalWrite(i, 0); } // всё лог.0
for (i=22; i<=42;i++) { pinMode(i, OUTPUT); } // конфиг всех пинов на выход + управляющие пины
digitalWrite(RST_Pin, 1); // вывод дисплея из сброса
delay(5);
digitalWrite(RST_Pin, 0); // удержание в сбросе дисплея
delay(15);
digitalWrite(RST_Pin, 1);
delay(500);
// запишем команду
digitalWrite(RD_Pin, 1); // уст. порта дисплея на приём (ввод данных в дисплей)
digitalWrite(CD_Pin, 0); // будем работать 0-команда 1-данные
digitalWrite(CS_Pin, 0); // выбор дисплея (активация)
//PORTA=0x00; PORTC=0x00; // это команда для считывания ID дисплея =0x00
for (i=22; i<=37;i++) { digitalWrite(i, LOW); } //
digitalWrite(WR_Pin, 1); // дёргаем WR
digitalWrite(WR_Pin, 0);
digitalWrite(CS_Pin, 1); // деактивация диспл. (отключение его шины данных DB0..DB15)
//чтение данных
//DDRA=0x00; DDRC=0x00; // или
for (i=22; i<=37;i++) { pinMode(i, INPUT); } // конфиг всех пинов на вход
for (i=22; i<=37;i++) { digitalWrite(i, LOW); }
digitalWrite(RD_Pin, 0); // уст. порта дисплея на передачу (вывод данных с дисплея)
digitalWrite(CD_Pin, 1); // будем работать с 0-команда 1-данные
digitalWrite(CS_Pin, 0); // выбор дисплея (активация )
digitalWrite(WR_Pin, 1); // дёргаем WR
digitalWrite(WR_Pin, 0);
u8g.setPrintPos(0, 10);
byteH=0;
if ( digitalRead(29) ) { byteH=byteH+128; u8g.print(1); } else u8g.print(0);
if ( digitalRead(28) ) { byteH=byteH+64; u8g.print(1); } else u8g.print(0);
if ( digitalRead(27) ) { byteH=byteH+32; u8g.print(1); } else u8g.print(0);
if ( digitalRead(26) ) { byteH=byteH+16; u8g.print(1); } else u8g.print(0);
if ( digitalRead(25) ) { byteH=byteH+8; u8g.print(1); } else u8g.print(0);
if ( digitalRead(24) ) { byteH=byteH+4; u8g.print(1); } else u8g.print(0);
if ( digitalRead(23) ) { byteH=byteH+2; u8g.print(1); } else u8g.print(0);
if ( digitalRead(22) ) { byteH=byteH+1; u8g.print(1); } else u8g.print(0);
byteL=0;
if ( digitalRead(30) ) { byteL=byteL+128; u8g.print(1); } else u8g.print(0);
if ( digitalRead(31) ) { byteL=byteL+64; u8g.print(1); } else u8g.print(0);
if ( digitalRead(32) ) { byteL=byteL+32; u8g.print(1); } else u8g.print(0);
if ( digitalRead(33) ) { byteL=byteL+16; u8g.print(1); } else u8g.print(0);
if ( digitalRead(34) ) { byteL=byteL+8; u8g.print(1); } else u8g.print(0);
if ( digitalRead(35) ) { byteL=byteL+4; u8g.print(1); } else u8g.print(0);
if ( digitalRead(36) ) { byteL=byteL+2; u8g.print(1); } else u8g.print(0);
if ( digitalRead(37) ) { byteL=byteL+1; u8g.print(1); } else u8g.print(0);
u8g.setPrintPos(0, 30);
u8g.print("ID display: ");
u8g.print(byteH, HEX);
u8g.setPrintPos(0, 50);
u8g.print(byteL, HEX);
digitalWrite(CS_Pin, 1); // деактивация диспл. (отключение шины данных DB0..DB15)
//DDRA=0xFF; DDRC=0xFF; // или
for (i=22; i<=37;i++) { pinMode(i, OUTPUT); } // конф. шины данных ARDUINO на выход
digitalWrite(RD_Pin, 1); // уст. порта дисплея на приём (ввод данных в дисплей)
//digitalWrite(RST_Pin, 1);
// вставка для UTFT
// pinMode(42, OUTPUT); // конф.ардуино для RD на выход
// digitalWrite(42, 1); // уст. RD=1 - чтобы порт дисплея был на приём (ввод данных в дисплей)
//delay(100);
}
void setup(void) {
// flip screen, if required
// u8g.setRot180();
u8g.firstPage();
do {
draw();
} while( u8g.nextPage() );
}
void loop() {
// put your main code here, to run repeatedly:
}
Единственное что я не делал: в коментарии к коду написанно RW замкнуть на VSS(+), я этого не делал так как RW используется в коде, и если замкнуть на + то никакие команды по этому пину не пойдут. Результат тот же что и раньше - одни нули. Мне кажется что просто код неправильно переведен под ДУЕ.
А вот вариант Б с переделкой 2-й читалки под 8 бит - для меня это пока что высшая математика. Вроде все просто объяснено, но я сам это не смогу сделать - не хватает знаний.
Кстати, меня терзают сомнения по поводу правильности моего перевода 2-й читалки. Особенно перевода 0x00, 0xEF и др... Мне кажется я мог биты в обратном порядке написать, но как проверить - не знаю.
// читалка ID дисплеев v2.0 Slider , вопросы и предложения можно на segun@yandex.ru
// "спасибо" поблагодарить за проделанную работу можно на карту Сбербанка 4276 4500 1754 7783 или скинуть на тлф. 8-951-404-7109
// моя ветка http://arduino.ru/forum/apparatnye-voprosy/arduino-i-displei-ot-sotikov-...
// подключить дисплей к Arduino Mega:
// старший DB15-8 , пины 29-22 PORTA к примеру считать с 00D3 =>0x00 старший
// младший DB7-0 , пины 37-30 PORTC к примеру считать с 00D3 =>0xD3 младший
// при использовании 8битных дисплеев, подключать к младшему, DB7-0 , пины 37-30 PORTC
// Это соответственно UTFT распиновке.
// Для некоторых дисплеев при их включении на 8 бит, шина переносится в старший байт, а для некоторых , разбрасывается по битам DB0-DB18
// поэтому дабы не утраивать вывод инфы в сериал монитор для всех случаев, здесь только для UTFT случая.
// Кому надо, можно поменять везде местами PORTA PORTC , на случай подключения 16битного дисплея и активированного на 8бит,
// шина данных которого смещается на старший байт. Ну или если попадётся такой шилд, то сделаю это в этом скетче.
#define CD_Pin 38 // (RS) //38
#define DCX 38
#define WR_Pin 39 //39
#define WRX 39
#define CS_Pin 40 //40
#define CSX 40
#define RST_Pin 41 //41
#define RSTX 41
#define RD_Pin 42 //42 __-
#define RDX 42
int i=0;
byte byteH;
byte byteL;
void setup()
{
Serial.begin(9600);
digitalWrite(RST_Pin, 0); // удержание в сбросе дисплея
digitalWrite(CS_Pin, 0); // активация шины данных дисплея (выбор кристалла ChipSelect)
for (i=22; i<=42;i++) { pinMode(i, OUTPUT); } // конфиг всех пинов на выход + управляющие пины //i=22; i<=42;i++
Serial.println("start... " );
Serial.println("UTFT normal pin29-22(PORTA)-byteH(DB15-0) , pin37-30(PORTC)-byteL(DB7-0)");
Serial.println("");
digitalWrite(RST_Pin, 1); // вывод дисплея из сброса
delay(5);
digitalWrite(RST_Pin, 0); // удержание в сбросе дисплея
delay(15);
digitalWrite(RST_Pin, 1);
delay(500);
Serial.println("register 00h for ILI9320(9320), ILI9325(9325), ILI9326(9326), SSD1289(1289,8989)" );
Serial.println(" HX8347D(047), HX8347G(075), HX8352A(052), HX8352B(065), HX8352C(072)");
Serial.println(" R61509V(B509), R61505W(C505), SPFD5420A(5408) ");
Serial.println("if (0 93 0 27) -> 8bit . if (93 27 93 27) -> 16bit " );
byteH=0x00 ; byteL=0x00 ; //
writeCommand_read6Parameter();
rstx_u();
Serial.println("register EFh for ILI9327(0 02 04 93 27 FF), " );
byteH=0x00 ; byteL=0xEF ; // для ili9327 - 00 02 04 93 27 FF
writeCommand_read6Parameter();
rstx_u();
Serial.println("register BFh for ILI9481(0 0 94 81 xx xx) " );
byteH=0x00 ; byteL=0xBF ; // для ili9481 - 00 00 94 81 xx xx
writeCommand_read6Parameter();
rstx_u();
Serial.println("register D3h for ILI9488(0 0 94 88 xx xx) " );
byteH=0x00 ; byteL=0xD3 ; // для ili9488 - 00 00 94 88 xx xx
writeCommand_read6Parameter();
rstx_u();
Serial.println("register 04h for HX8357(?DA-DC), HX8353(?80-85), " );
byteH=0x00 ; byteL=0x04 ; // для - xx xx
writeCommand_read6Parameter();
rstx_u();
}
// Г Л А В Н А Я П Р О Г Р А М М А
void loop()
{
// put your main code here, to run repeatedly:
}
// П О Д П Р О Г Р А М М Ы , Ф У Н К Ц И И
// RST вверх. Сброс дисплея
int rstx_u()
{
digitalWrite(RSTX, 0); delay(15);
digitalWrite(RSTX, 1); delay(250);
}
// дергаем WR вверх
int wrx_u()
{
digitalWrite(WRX, 0); digitalWrite(WRX, 1); //digitalWrite(WRX, 0);
delay(2);
}
// дергаем RD вверх и считываем данные
int rdx_u()
{
//digitalWrite(RDX, 0); digitalWrite(RDX, 1); // digitalWrite(RDX, 0);
digitalWrite(RDX, 1); digitalWrite(RDX, 0); // оставим в 0 , чтоб порт дисплея был на выход,
// и преобразователи уровней на шилде (если они есть) тоже были на выход
delay(2);
//byteH=0; byteL=0;
//byteH=PINA; // считываем с выводов PORTA
//byteL=PINC; // считываем с выводов PORTC
byteH=0; // PORTA считаем
if ( digitalRead(29) ) byteH=byteH+128;
if ( digitalRead(28) ) byteH=byteH+64;
if ( digitalRead(27) ) byteH=byteH+32;
if ( digitalRead(26) ) byteH=byteH+16;
if ( digitalRead(25) ) byteH=byteH+8;
if ( digitalRead(24) ) byteH=byteH+4;
if ( digitalRead(23) ) byteH=byteH+2;
if ( digitalRead(22) ) byteH=byteH+1;
byteL=0; // PORTC считаем
if ( digitalRead(30) ) byteL=byteL+128;
if ( digitalRead(31) ) byteL=byteL+64;
if ( digitalRead(32) ) byteL=byteL+32;
if ( digitalRead(33) ) byteL=byteL+16;
if ( digitalRead(34) ) byteL=byteL+8;
if ( digitalRead(35) ) byteL=byteL+4;
if ( digitalRead(36) ) byteL=byteL+2;
if ( digitalRead(37) ) byteL=byteL+1;
}
// конфигурация порта на вход
int port_in()
{
//DDRA=0x00; DDRC=0x00; // конфиг всех пинов на вход
for (i=22; i<=37;i++) { pinMode(i, INPUT); }
//PORTA=0x00; PORTC=0x00; // выключение подтягивающих резисторов
for (i=22; i<=37;i++) { digitalWrite(i, LOW); }
}
// конфигурация портов на выход
int port_out()
{
//DDRA=0xFF; DDRC=0xFF; // конфиг всех пинов на выход
for (i=22; i<=37;i++) { pinMode(i, OUTPUT); }
//PORTA=0x00; PORTC=0x00; // выключение подтягивающих резисторов
for (i=22; i<=37;i++) { digitalWrite(i, LOW); }
}
int writeCommand_read6Parameter()
{
// передадим команду
digitalWrite(RDX, 1); // сначала порт дисплея в режим приема
port_out(); // конфим ардуинку на выход
//PORTA=byteH ;
//PORTC=byteL ;
if (byteL == 0x00){
for (i=22; i<=37;i++) { digitalWrite(i, LOW); }
}
if (byteL == 0xEF){
digitalWrite(22, HIGH);
digitalWrite(23, HIGH);
digitalWrite(24, HIGH);
digitalWrite(25, HIGH);
digitalWrite(26, LOW);
digitalWrite(27, HIGH);
digitalWrite(28, HIGH);
digitalWrite(29, HIGH);
digitalWrite(30, LOW);
digitalWrite(31, LOW);
digitalWrite(32, LOW);
digitalWrite(33, LOW);
digitalWrite(34, LOW);
digitalWrite(35, LOW);
digitalWrite(36, LOW);
digitalWrite(37, LOW);
}
if (byteL == 0xBF){
digitalWrite(22, HIGH);
digitalWrite(23, HIGH);
digitalWrite(24, HIGH);
digitalWrite(25, HIGH);
digitalWrite(26, HIGH);
digitalWrite(27, HIGH);
digitalWrite(28, LOW);
digitalWrite(29, HIGH);
digitalWrite(30, LOW);
digitalWrite(31, LOW);
digitalWrite(32, LOW);
digitalWrite(33, LOW);
digitalWrite(34, LOW);
digitalWrite(35, LOW);
digitalWrite(36, LOW);
digitalWrite(37, LOW);
}
if (byteL == 0xD3){
digitalWrite(22, HIGH);
digitalWrite(23, HIGH);
digitalWrite(24, LOW);
digitalWrite(25, LOW);
digitalWrite(26, HIGH);
digitalWrite(27, LOW);
digitalWrite(28, HIGH);
digitalWrite(29, HIGH);
digitalWrite(30, LOW);
digitalWrite(31, LOW);
digitalWrite(32, LOW);
digitalWrite(33, LOW);
digitalWrite(34, LOW);
digitalWrite(35, LOW);
digitalWrite(36, LOW);
digitalWrite(37, LOW);
}
if (byteL == 0x04){
digitalWrite(22, LOW);
digitalWrite(23, LOW);
digitalWrite(24, HIGH);
digitalWrite(25, LOW);
digitalWrite(26, LOW);
digitalWrite(27, LOW);
digitalWrite(28, LOW);
digitalWrite(29, LOW);
digitalWrite(30, LOW);
digitalWrite(31, LOW);
digitalWrite(32, LOW);
digitalWrite(33, LOW);
digitalWrite(34, LOW);
digitalWrite(35, LOW);
digitalWrite(36, LOW);
digitalWrite(37, LOW);
}
Serial.print("register " );
Serial.print(byteH, HEX );Serial.print(" ");Serial.println(byteL, HEX );
// 1-будем передавать команду
//digitalWrite(RDX, 1); // порт дисплея в режим приема ***************
digitalWrite(DCX, 0); // для передачи команды в дисплей, а не данных
wrx_u(); // дергаем WRITE вверх
// 2-будем принимать данные
port_in(); // порт ардуины на вход
digitalWrite(DCX, 1); // работаем теперь с данными, а не с командой
digitalWrite(WRX, 1);
rdx_u(); // дергаем RD и получаем данные
Serial.print("1 Parameter " );
Serial.print(byteH,HEX);Serial.print(" ");Serial.println(byteL, HEX);
rdx_u();
Serial.print("2 Parameter " );
Serial.print(byteH,HEX);Serial.print(" ");Serial.println(byteL, HEX);
rdx_u();
Serial.print("3 Parameter " );
Serial.print(byteH,HEX);Serial.print(" ");Serial.println(byteL, HEX);
rdx_u();
Serial.print("4 Parameter " );
Serial.print(byteH,HEX);Serial.print(" ");Serial.println(byteL, HEX);
rdx_u();
Serial.print("5 Parameter " );
Serial.print(byteH,HEX);Serial.print(" ");Serial.println(byteL, HEX);
rdx_u();
Serial.print("6 Parameter " );
Serial.print(byteH,HEX);Serial.print(" ");Serial.println(byteL, HEX);
Serial.println("");
}
..... что я не делал: в коментарии к коду написанно RW замкнуть на VSS(+), я этого не делал так как RW используется в коде, и если замкнуть на + то никакие команды по этому пину не пойдут. Результат тот же что и раньше - одни нули. Мне кажется что просто код неправильно переведен под ДУЕ.
.....
млин, как могла опечатка затесаться, непонятно, бывает видимо, имелось ввиду VSS(-, GND) , речь шла о подключении 1602, чтоб выводить инфу что по 0му адресу у изучаемого дисплея.
хорошо. проверю скетч на разных дисплеях, черкну. ,// в скетче не должно быть использование
digitalRead(30) )
....
digitalRead(37)
дисплей же 8ми битный ))) . сейчас, погодь, посмотрю... чтобы получать второй байт нужно дергнуть RD , чтобы отправить второй байт, нужно дернуть WR ....
для одних дисплеев надо так
вот , пробуйте (протестировал на ili9325)
// читалка ID дисплеев V3.0beta только для 8ми битных дисплеев, у кого не в 00 адресе - не проверено , попробовать для них закоментить строчку ////////////////////////////////////////////////////////////////
// подключить 8ми битный дисплей к Arduino Mega/Due:
// DB0-7 (DB8-DB15 , DB10-DB17) , соответственно на arduino пины 22-29 ( микроконтроллера PORTA PA0-PA7 ) к примеру считать с 00D3 =>0xD3 младший
// Это же подключение соответственно UTFT распиновке.
#define CD_Pin 38 // (RS) //38
#define DCX 38
#define WR_Pin 39 //39
#define WRX 39
#define CS_Pin 40 //40
#define CSX 40
#define RST_Pin 41 //41
#define RSTX 41
#define RD_Pin 42 //42 __-
#define RDX 42
int i=0;
byte byteH;
byte byteL;
void setup()
{
Serial.begin(9600);
digitalWrite(RST_Pin, 0); // удержание в сбросе дисплея
digitalWrite(CS_Pin, 0); // активация шины данных дисплея (выбор кристалла ChipSelect)
for (i=22; i<=42;i++) { pinMode(i, OUTPUT); } // конфиг всех пинов на выход + управляющие пины //i=22; i<=42;i++
Serial.println("start... " );
//Serial.println("UTFT normal pin29-22(PORTA)-byteH(DB15-0) , pin37-30(PORTC)-byteL(DB7-0)");
Serial.println("");
digitalWrite(RST_Pin, 1); // вывод дисплея из сброса
delay(100);
digitalWrite(RST_Pin, 0); // удержание в сбросе дисплея
delay(100);
digitalWrite(RST_Pin, 1);// вывод дисплея из сброса
delay(500);
rstx_u();
Serial.println("register 00h for ILI9320(9320), ILI9325(9325), ILI9326(9326), SSD1289(1289,8989)" );
Serial.println(" HX8347D(047), HX8347G(075), HX8352A(052), HX8352B(065), HX8352C(072)");
Serial.println(" R61509V(B509), R61505W(C505), SPFD5420A(5408) ");
Serial.println("if (0 93 0 27) -> 8bit . if (93 27 93 27) -> 16bit " );
byteL=0x00 ; //
writeCommand_read6Parameter();
rstx_u();
Serial.println("register EFh for ILI9327(0 02 04 93 27 FF), " );
byteL=0xEF ; // для ili9327 - 00 02 04 93 27 FF
writeCommand_read6Parameter();
rstx_u();
Serial.println("register BFh for ILI9481(0 0 94 81 xx xx) " );
byteL=0xBF ; // для ili9481 - 00 00 94 81 xx xx
writeCommand_read6Parameter();
rstx_u();
Serial.println("register D3h for ILI9488(0 0 94 88 xx xx) " );
byteL=0xD3 ; // для ili9488 - 00 00 94 88 xx xx
writeCommand_read6Parameter();
rstx_u();
Serial.println("register 04h for HX8357(?DA-DC), HX8353(?80-85), " );
byteL=0x04 ; // для - xx xx
writeCommand_read6Parameter();
rstx_u();
}
// Г Л А В Н А Я П Р О Г Р А М М А
void loop()
{
// put your main code here, to run repeatedly:
}
// П О Д П Р О Г Р А М М Ы , Ф У Н К Ц И И
// RST вверх. Сброс дисплея
int rstx_u()
{
digitalWrite(WRX, 0);digitalWrite(DCX, 0);digitalWrite(RDX, 1);
digitalWrite(RSTX, 0); delay(100);
digitalWrite(RSTX, 1); delay(100);
}
// дергаем WR вверх
int wrx_u()
{
digitalWrite(WRX, 0); digitalWrite(WRX, 1); //digitalWrite(WRX, 0);
delay(2);
}
// дергаем RD вниз и считываем данные
int rdx_u()
{
//digitalWrite(RDX, 0); digitalWrite(RDX, 1); // digitalWrite(RDX, 0);
digitalWrite(RDX, 1); digitalWrite(RDX, 0); // оставим в 0 , чтоб порт дисплея был на выход,
// и преобразователи уровней на шилде (если они есть) тоже были на выход
delay(10);
//byteL=PINA; // считываем с выводов PORTA
byteL=0; // PORTA считаем
if ( digitalRead(29) ) byteL=byteL+128;
if ( digitalRead(28) ) byteL=byteL+64;
if ( digitalRead(27) ) byteL=byteL+32;
if ( digitalRead(26) ) byteL=byteL+16;
if ( digitalRead(25) ) byteL=byteL+8;
if ( digitalRead(24) ) byteL=byteL+4;
if ( digitalRead(23) ) byteL=byteL+2;
if ( digitalRead(22) ) byteL=byteL+1;
digitalWrite(RDX, 1); // считали, переводим дисплей обратно в режим приема инфы
delay(10);
}
// конфигурация порта на вход
int port_in()
{
//DDRA=0x00; DDRC=0x00; // конфиг всех пинов на вход
for (i=22; i<=37;i++) { pinMode(i, INPUT); }
//PORTA=0x00; PORTC=0x00; // выключение подтягивающих резисторов
for (i=22; i<=37;i++) { digitalWrite(i, LOW); }
}
// конфигурация портов на выход
int port_out()
{
//DDRA=0xFF; DDRC=0xFF; // конфиг всех пинов на выход
for (i=22; i<=37;i++) { pinMode(i, OUTPUT); }
//PORTA=0x00; PORTC=0x00; // выключение подтягивающих резисторов
for (i=22; i<=37;i++) { digitalWrite(i, LOW); }
}
int writeCommand_read6Parameter()
{
// передадим команду
digitalWrite(RDX, 1); // сначала порт дисплея в режим приема
port_out(); // конфим ардуинку на выход
// сначала передадим старший байт=00 (00 на порт уже установил port_out(); )
//for (i=22; i<=37;i++) { digitalWrite(i, LOW); }
wrx_u(); ///////////////////////////////////////////////////////////////////////////////////////////////
// теперь передадим младший байт
// if (byteL == 0x00) { for (i=22; i<=37;i++) { digitalWrite(i, LOW); } }
if (byteL == 0x00){
digitalWrite(22, LOW);
digitalWrite(23, LOW);
digitalWrite(24, LOW);
digitalWrite(25, LOW);
digitalWrite(26, LOW);
digitalWrite(27, LOW);
digitalWrite(28, LOW);
digitalWrite(29, LOW);
}
if (byteL == 0xEF){
digitalWrite(22, HIGH);
digitalWrite(23, HIGH);
digitalWrite(24, HIGH);
digitalWrite(25, HIGH);
digitalWrite(26, LOW);
digitalWrite(27, HIGH);
digitalWrite(28, HIGH);
digitalWrite(29, HIGH);
}
if (byteL == 0xBF){
digitalWrite(22, HIGH);
digitalWrite(23, HIGH);
digitalWrite(24, HIGH);
digitalWrite(25, HIGH);
digitalWrite(26, HIGH);
digitalWrite(27, HIGH);
digitalWrite(28, LOW);
digitalWrite(29, HIGH);
}
if (byteL == 0xD3){
digitalWrite(22, HIGH);
digitalWrite(23, HIGH);
digitalWrite(24, LOW);
digitalWrite(25, LOW);
digitalWrite(26, HIGH);
digitalWrite(27, LOW);
digitalWrite(28, HIGH);
digitalWrite(29, HIGH);
}
if (byteL == 0x04){
digitalWrite(22, LOW);
digitalWrite(23, LOW);
digitalWrite(24, HIGH);
digitalWrite(25, LOW);
digitalWrite(26, LOW);
digitalWrite(27, LOW);
digitalWrite(28, LOW);
digitalWrite(29, LOW);
}
Serial.print("register " );
Serial.println(byteL, HEX );
// 1-будем передавать команду
digitalWrite(DCX, 0); // для передачи команды в дисплей, а не данных
delay(10);
wrx_u(); // дергаем WRITE вверх
delay(10);
// 2-будем принимать данные
port_in(); // порт ардуины на вход
delay(10);
digitalWrite(DCX, 1); // работаем теперь с данными, а не с командой
delay(10);
rdx_u(); // дергаем RD вниз и получаем данные
Serial.print("1 Parameter " );
Serial.println(byteL, HEX);
rdx_u();
Serial.print("2 Parameter " );
Serial.println(byteL, HEX);
rdx_u();
Serial.print("3 Parameter " );
Serial.println(byteL, HEX);
rdx_u();
Serial.print("4 Parameter " );
Serial.println(byteL, HEX);
rdx_u();
Serial.print("5 Parameter " );
Serial.println(byteL, HEX);
rdx_u();
Serial.print("6 Parameter " );
Serial.println(byteL, HEX);
Serial.println("");
}
////11.02.2016
Если ответы будут 00 EF BF D3 04 , то скорее всего забыли после использования UTFT переключить RD дисплея обратно c "+" на 42пин . И проверьте всёже на Меге. у меня с десяток разных дисплеев у которых ID по 00 адресу, эта читалка превосходно их читает. других дисплеев пока нет.
Мне кажется это ни на что не влияет, так это всего лишь чтение с дисплея. Просто в итоге результат пишет чуть больше чем надо (так мне кажется). Только что попробовал: убрал из программы всякое использование 30-37. Результат тот же:
00000000
ID display: 00
На всякий случай, код программы Переделал под вывод в сериал:
#define CD_Pin 38 // (RS)
#define WR_Pin 39
#define CS_Pin 40
#define RST_Pin 41
#define RD_Pin 42
int i;
byte byteH;
byte byteL;
void setup(void) {
Serial.begin(9600);
digitalWrite(RST_Pin, 0); // удержание в сбросе дисплея
digitalWrite(CS_Pin, 1); // деактивация диспл. (отключение его шины данных DB0..DB15)
digitalWrite(RST_Pin, 0); // сброс дисплея
//for (i=22; i<=42;i++) { digitalWrite(i, 0); } // всё лог.0
for (i=22; i<=42;i++) { pinMode(i, OUTPUT); } // конфиг всех пинов на выход + управляющие пины
digitalWrite(RST_Pin, 1); // вывод дисплея из сброса
delay(5);
digitalWrite(RST_Pin, 0); // удержание в сбросе дисплея
delay(15);
digitalWrite(RST_Pin, 1);
delay(500);
// запишем команду
digitalWrite(RD_Pin, 1); // уст. порта дисплея на приём (ввод данных в дисплей)
digitalWrite(CD_Pin, 0); // будем работать 0-команда 1-данные
digitalWrite(CS_Pin, 0); // выбор дисплея (активация)
//PORTA=0x00; PORTC=0x00; // это команда для считывания ID дисплея =0x00
for (i=22; i<=22;i++) { digitalWrite(i, LOW); } //
digitalWrite(WR_Pin, 1); // дёргаем WR
digitalWrite(WR_Pin, 0);
digitalWrite(CS_Pin, 1); // деактивация диспл. (отключение его шины данных DB0..DB15)
//чтение данных
//DDRA=0x00; DDRC=0x00; // или
for (i=22; i<=22;i++) { pinMode(i, INPUT); } // конфиг всех пинов на вход
for (i=22; i<=22;i++) { digitalWrite(i, LOW); }
digitalWrite(RD_Pin, 0); // уст. порта дисплея на передачу (вывод данных с дисплея)
digitalWrite(CD_Pin, 1); // будем работать с 0-команда 1-данные
digitalWrite(CS_Pin, 0); // выбор дисплея (активация )
digitalWrite(WR_Pin, 1); // дёргаем WR
digitalWrite(WR_Pin, 0);
byteH=0;
if ( digitalRead(29) ) { byteH=byteH+128; Serial.print(1); } else Serial.print(0);
if ( digitalRead(28) ) { byteH=byteH+64; Serial.print(1); } else Serial.print(0);
if ( digitalRead(27) ) { byteH=byteH+32; Serial.print(1); } else Serial.print(0);
if ( digitalRead(26) ) { byteH=byteH+16; Serial.print(1); } else Serial.print(0);
if ( digitalRead(25) ) { byteH=byteH+8; Serial.print(1); } else Serial.print(0);
if ( digitalRead(24) ) { byteH=byteH+4; Serial.print(1); } else Serial.print(0);
if ( digitalRead(23) ) { byteH=byteH+2; Serial.print(1); } else Serial.print(0);
if ( digitalRead(22) ) { byteH=byteH+1; Serial.print(1); } else Serial.print(0);
Serial.println("");
Serial.print("ID display: ");
Serial.print(byteH, HEX);
digitalWrite(CS_Pin, 1); // деактивация диспл. (отключение шины данных DB0..DB15)
//DDRA=0xFF; DDRC=0xFF; // или
for (i=22; i<=22;i++) { pinMode(i, OUTPUT); } // конф. шины данных ARDUINO на выход
digitalWrite(RD_Pin, 1); // уст. порта дисплея на приём (ввод данных в дисплей)
//digitalWrite(RST_Pin, 1);
// вставка для UTFT
// pinMode(42, OUTPUT); // конф.ардуино для RD на выход
// digitalWrite(42, 1); // уст. RD=1 - чтобы порт дисплея был на приём (ввод данных в дисплей)
//delay(100);
}
void loop() {
// put your main code here, to run repeatedly:
}
Здраствуйте. Попался мне дисплей "CDT 128 96-002V2", дисплей от сотика, не могу найти на него нормальной информации, вроде - бы на контроллере ST7571, даташит на ST7571 нашёл но толку мало. Может кто использовал такай дисплей, подскажите.
ладно, буду писать следующие сообщения(по возможности сохраняя старые), чтоб прослеживалась последовательноость в диалоге, не в угоду конечно малостраничности темы (((
для одних дисплеев надо так: 16бит разбивается на 2 последовательных по8
на примере ili9325, для передачи адреса регистра сначала выводим старший байт ( 00 ), дергаем WR чтоб дисплей принял , потом выводим младший байт (00, или какой нужно) дергаем WR чтоб дисплей принял . Чтение тож в 2 последовательных байта (видимо м.б. и больше)
для других дисплеев на примере ili9488, регистры 8ми битные, поэтому нужен один такт WR для передачи адреса регистра, но несколько тактов, если будем записывать "параметры"(а они очень иногда глубокие, своего рода стек), и несколько тактов RD чтобы из регистра вынимать много "параметров"( последовательных байтов стека). Таким образом дстигается некоторое ускорение при записи/вычитывании байтов (не нужно передавать адрес следующего реристра, а контроллер сам инкрементирует его в пределах главного) , и уже эти "параметры" могут иметь 8/16/18 битное слово.
вот , пробуйте, накидал скетч читалка ID дисплеев V3.0beta Mega/Due (протестировал на Mega+8bit ili9325, делал не полное кажись соответствие диаграмме , но работает)
// читалка ID дисплеев V3.0beta только для 8ми битных дисплеев, у кого не в 00 адресе - не проверено , попробовать для них закоментить строчку ////////////////////////////////////////////////////////////////
// подключить 8ми битный дисплей к Arduino Mega/Due:
// DB0-7 (DB8-DB15 , DB10-DB17) , соответственно на arduino пины 22-29 ( микроконтроллера PORTA PA0-PA7 ) к примеру считать с 00D3 =>0xD3 младший
// Это же подключение соответственно UTFT распиновке.
#define CD_Pin 38 // (RS) //38
#define DCX 38
#define WR_Pin 39 //39
#define WRX 39
#define CS_Pin 40 //40
#define CSX 40
#define RST_Pin 41 //41
#define RSTX 41
#define RD_Pin 42 //42 __-
#define RDX 42
int i=0;
byte byteH;
byte byteL;
void setup()
{
Serial.begin(9600);
digitalWrite(RST_Pin, 0); // удержание в сбросе дисплея
digitalWrite(CS_Pin, 0); // активация шины данных дисплея (выбор кристалла ChipSelect)
for (i=22; i<=42;i++) { pinMode(i, OUTPUT); } // конфиг всех пинов на выход + управляющие пины //i=22; i<=42;i++
Serial.println("start... " );
//Serial.println("UTFT normal pin29-22(PORTA)-byteH(DB15-0) , pin37-30(PORTC)-byteL(DB7-0)");
Serial.println("");
digitalWrite(RST_Pin, 1); // вывод дисплея из сброса
delay(100);
digitalWrite(RST_Pin, 0); // удержание в сбросе дисплея
delay(100);
digitalWrite(RST_Pin, 1);// вывод дисплея из сброса
delay(500);
rstx_u();
Serial.println("register 00h for ILI9320(9320), ILI9325(9325), ILI9326(9326), SSD1289(1289,8989)" );
Serial.println(" HX8347D(047), HX8347G(075), HX8352A(052), HX8352B(065), HX8352C(072)");
Serial.println(" R61509V(B509), R61505W(C505), SPFD5420A(5408) ");
byteL=0x00 ; //
writeCommand_read6Parameter();
rstx_u();
Serial.println("register EFh for ILI9327(0 02 04 93 27 FF), " );
byteL=0xEF ; // для ili9327 - 00 02 04 93 27 FF
writeCommand_read6Parameter();
rstx_u();
Serial.println("register BFh for ILI9481(0 0 94 81 xx xx) " );
byteL=0xBF ; // для ili9481 - 00 00 94 81 xx xx
writeCommand_read6Parameter();
rstx_u();
Serial.println("register D3h for ILI9488(0 0 94 88 xx xx) " );
byteL=0xD3 ; // для ili9488 - 00 00 94 88 xx xx
writeCommand_read6Parameter();
rstx_u();
Serial.println("register 04h for HX8357(?DA-DC), HX8353(?80-85), " );
byteL=0x04 ; // для - xx xx
writeCommand_read6Parameter();
rstx_u();
}
// Г Л А В Н А Я П Р О Г Р А М М А
void loop()
{
// put your main code here, to run repeatedly:
}
// П О Д П Р О Г Р А М М Ы , Ф У Н К Ц И И
// RST вверх. Сброс дисплея
int rstx_u()
{
digitalWrite(WRX, 0);digitalWrite(DCX, 0);digitalWrite(RDX, 1);
digitalWrite(RSTX, 0); delay(100);
digitalWrite(RSTX, 1); delay(100);
}
// дергаем WR вверх
int wrx_u()
{
digitalWrite(WRX, 0); digitalWrite(WRX, 1); //digitalWrite(WRX, 0);
delay(2);
}
// дергаем RD вниз и считываем данные
int rdx_u()
{
//digitalWrite(RDX, 0); digitalWrite(RDX, 1); // digitalWrite(RDX, 0);
digitalWrite(RDX, 1); digitalWrite(RDX, 0); // оставим в 0 , чтоб порт дисплея был на выход,
// и преобразователи уровней на шилде (если они есть) тоже были на выход
delay(10);
//byteL=PINA; // считываем с выводов PORTA
byteL=0; // PORTA считаем
if ( digitalRead(29) ) byteL=byteL+128;
if ( digitalRead(28) ) byteL=byteL+64;
if ( digitalRead(27) ) byteL=byteL+32;
if ( digitalRead(26) ) byteL=byteL+16;
if ( digitalRead(25) ) byteL=byteL+8;
if ( digitalRead(24) ) byteL=byteL+4;
if ( digitalRead(23) ) byteL=byteL+2;
if ( digitalRead(22) ) byteL=byteL+1;
digitalWrite(RDX, 1); // считали, переводим дисплей обратно в режим приема инфы
delay(10);
}
// конфигурация порта на вход
int port_in()
{
//DDRA=0x00; DDRC=0x00; // конфиг всех пинов на вход
for (i=22; i<=37;i++) { pinMode(i, INPUT); }
//PORTA=0x00; PORTC=0x00; // выключение подтягивающих резисторов
for (i=22; i<=37;i++) { digitalWrite(i, LOW); }
}
// конфигурация портов на выход
int port_out()
{
//DDRA=0xFF; DDRC=0xFF; // конфиг всех пинов на выход
for (i=22; i<=37;i++) { pinMode(i, OUTPUT); }
//PORTA=0x00; PORTC=0x00; // выключение подтягивающих резисторов
for (i=22; i<=37;i++) { digitalWrite(i, LOW); }
}
int writeCommand_read6Parameter()
{
// передадим команду
digitalWrite(RDX, 1); // сначала порт дисплея в режим приема
port_out(); // конфим ардуинку на выход
// сначала передадим старший байт=00 (00 на порт уже установил port_out(); )
//for (i=22; i<=37;i++) { digitalWrite(i, LOW); }
wrx_u(); ///////////////////////////////////////////////////////////////////////////////////////////////
// теперь передадим младший байт
// if (byteL == 0x00) { for (i=22; i<=37;i++) { digitalWrite(i, LOW); } }
if (byteL == 0x00){
digitalWrite(22, LOW);
digitalWrite(23, LOW);
digitalWrite(24, LOW);
digitalWrite(25, LOW);
digitalWrite(26, LOW);
digitalWrite(27, LOW);
digitalWrite(28, LOW);
digitalWrite(29, LOW);
}
if (byteL == 0xEF){
digitalWrite(22, HIGH);
digitalWrite(23, HIGH);
digitalWrite(24, HIGH);
digitalWrite(25, HIGH);
digitalWrite(26, LOW);
digitalWrite(27, HIGH);
digitalWrite(28, HIGH);
digitalWrite(29, HIGH);
}
if (byteL == 0xBF){
digitalWrite(22, HIGH);
digitalWrite(23, HIGH);
digitalWrite(24, HIGH);
digitalWrite(25, HIGH);
digitalWrite(26, HIGH);
digitalWrite(27, HIGH);
digitalWrite(28, LOW);
digitalWrite(29, HIGH);
}
if (byteL == 0xD3){
digitalWrite(22, HIGH);
digitalWrite(23, HIGH);
digitalWrite(24, LOW);
digitalWrite(25, LOW);
digitalWrite(26, HIGH);
digitalWrite(27, LOW);
digitalWrite(28, HIGH);
digitalWrite(29, HIGH);
}
if (byteL == 0x04){
digitalWrite(22, LOW);
digitalWrite(23, LOW);
digitalWrite(24, HIGH);
digitalWrite(25, LOW);
digitalWrite(26, LOW);
digitalWrite(27, LOW);
digitalWrite(28, LOW);
digitalWrite(29, LOW);
}
Serial.print("register " );
Serial.println(byteL, HEX );
// 1-будем передавать команду
digitalWrite(DCX, 0); // для передачи команды в дисплей, а не данных
delay(10);
wrx_u(); // дергаем WRITE вверх
delay(10);
// 2-будем принимать данные
port_in(); // порт ардуины на вход
delay(10);
digitalWrite(DCX, 1); // работаем теперь с данными, а не с командой
delay(10);
rdx_u(); // дергаем RD вниз и получаем данные
Serial.print("1 Parameter " );
Serial.println(byteL, HEX);
rdx_u();
Serial.print("2 Parameter " );
Serial.println(byteL, HEX);
rdx_u();
Serial.print("3 Parameter " );
Serial.println(byteL, HEX);
rdx_u();
Serial.print("4 Parameter " );
Serial.println(byteL, HEX);
rdx_u();
Serial.print("5 Parameter " );
Serial.println(byteL, HEX);
rdx_u();
Serial.print("6 Parameter " );
Serial.println(byteL, HEX);
Serial.println("");
}
потом закоментить 158 строчку wrx_u(); ///// и посмотреть снова что выдаст монитор порта
Спасибо за пример! Правда мне све это еще сложно понять, точнее сложно понять согласование таймингов. Это так, к слову.
Попробовал ваш код, оба раза ответа не было. Потом появилась мысль немного увеличить задержки. Поменял delay(10) на delay(50). В результате в регистре "0" появилось "10". wrx_u(); - закоментированна.
Не пробавали написать код не в IDE arduino, а в Keil. По началу трудновато конечно, а потом как по маслу. Пройдены варианты и по SPI и с 8 и 16 бит шинами. И вот еще вопрос, как вы при инициализации управляете RESET-ом? Можно просто подключить к цепи сброса процессора, у меня так работает, экономит целый пин I/O.
diger67, Вариант, как по мне хороший, но подходит только для уже готового подключения и опознанного контроллера. Если же дисплей не опознан и нужно прочитать его ИД, то такой вариант не подходит, так как Ресет используется в процессе.
slider, наконец-то купил резисторы! Тодключил к Меге. Протестировал. Читалка из первого поста выдает одни нули. Читалки №2 и №3 вернули один и тот же ответ:
о, эт хорошо, что к меге, через резисторы, и ответ нормальный виден, и видно что не по 0му адресу у него ID. Из широкораспространеных адресов пока не понятно. Недавно диспл. от sony ericsson копал, так там вообще распиновка на 1бит оказалось сдвинута, не как по схеме. Еле запустил, пока не проверил что неспользованный пин лог.1/0 выдавал, он оказался вхож в нужные 8бит/пин. Эт я к тому что можно попробовать прикинуть какой ответ бы был, если зеркально перевернуть биты, или мож проще физически перевернуть и глянуть что выдаст. Вечерком с ноута скину читалку, сделал чтение всех подряд регистров с 0 по 255 (00 - FF ) // эт проще в меге счетчик for и кидаем это наращивание в порт PORTA, для дуе вообще мутно побитно получилось бы.
Так с некоторых дисплеев видно было, в регистрах попадалось разрешение контроллера (дисплея) 00EF 01AF 013F (240x432 x320) , ну и ID тож.
Проконтролируйте ещё напр. 3,3в , оно не должно быть выше, особенно когда запускались схожие иниты UTFT, когда был виден цветной мусор. Если есть время, можете прогнать теперь уже на меге иниты UTFT.
Для питания дисплея пока остановился на резисторе 100-150 Ом от 5в и стабилитроне 3.0 в с параллельно smd кондером 4-10мкф. (ибо если делать 300 Ом то при запуске инита, питание может просесть ниже 2,8в . И если ставить стабилитрон 3,3в, то без инита напряжение может подняться аж до 3,6в , а для контроллеров это уже критично) . Если ещё параллельно стабилитрону подключить, для опыта, белый светодиод , то по маленькому снижению его яркости можно судить о возможной подходящего инита(инициализации), что заработали внутренние преобразователи для питания ЖК матрицы. Если хорошо притухнет, эт плохо, значит было перенапряжение на дисплее и преобразователи скончались. хотя ID, перед запуском инита вычитывается правильно, типа как контроллер рабочий. Но в ваше случае всё живое 99,9% , ведь виден цветной мусор на некоторых инитах.
В вашем случае на меге можно запитать от меговских 3,3в и параллельно какую нить нагрузку кинуть, типа стабилитрона 3,3в.
И прикиньте примерно сколько у него разрешение, как, писал выше, раз такая байда затяжная получилась. Эт чтобы отсеять малые контроллеры.
Спасибо, буду ждать читалку. Проверил питание (от ардуины) - 3.25 вольта. Пробовал прогонять иниты - результат тот же что и на Дуе. Приложил линейку и через макро съемку получилось разрешение примерно 522*290 пикселей.
Спасибо, буду ждать читалку. Проверил питание (от ардуины) - 3.25 вольта. Пробовал прогонять иниты - результат тот же что и на Дуе. Приложил линейку и через макро съемку получилось разрешение примерно 522*290 пикселей.
читалка 3.1 PORTA, проверена на дисплеях с ID в 00h , и на других (ili9327 8bit , R61523 16bit) - отлично читает всю память, соответственно и ID в ней. (да, иногда некоторые регистры имеют глубину 10 , но ID так глубоко не запихивают, хватает в читалке и глубины =8) .
// ID_display_read_to_serial_monitor_universal_v3_1_PORTA.ino
// читалка ID дисплеев V3.1beta только для 8ми битных дисплеев PORTA,
// подключить 8ми битный дисплей к Arduino Mega/Due:
// DB0-7 (DB8-DB15 , DB10-DB17) , соответственно на arduino пины 22-29 ( микроконтроллера PORTA PA0-PA7 )
// к примеру считать с 00D3 =>0xD3 младший
// Это же подключение соответственно UTFT распиновке,
// только не забыть, в тесте UTFT, на 42 пин подать лог.1 хотя бы внутренним резистором
// digitalWrite(42, HIGH);
#define CD_Pin 38 // (RS) //38
#define DCX 38
#define WR_Pin 39 //39
#define WRX 39
#define CS_Pin 40 //40
#define CSX 40
#define RST_Pin 41 //41
#define RSTX 41
#define RD_Pin 42 //42 __-
#define RDX 42
int i,j;
byte byteLL; // вспомогательный , ибо основной используется
byte byteL;
void setup()
{ DDRA=0xFF;
// кнопка для продолжения скетча, если где надо его остановить, чтоб замерить лог. уровни
pinMode(A12, INPUT); // кнопку удобно воткнуть в 12й пин и в рядом GND
digitalWrite(12, HIGH); // внутренний подтягив. резистор к +
pinMode(13, OUTPUT); // и светодиод на плате чтоб мигал, когда можно нажать кнопку для продолжения
Serial.begin(9600);
digitalWrite(RST_Pin, 0); // удержание в сбросе дисплея
digitalWrite(CS_Pin, 0); // активация шины данных дисплея (выбор кристалла ChipSelect)
for (i=22; i<=42;i++) { pinMode(i, OUTPUT); } // конфиг всех пинов на выход + управляющие пины //i=22; i<=42;i++
Serial.println("start... " );
Serial.println("");
digitalWrite(RST_Pin, 1); // вывод дисплея из сброса
delay(100);
digitalWrite(RST_Pin, 0); // удержание в сбросе дисплея
delay(100);
digitalWrite(RST_Pin, 1);// вывод дисплея из сброса
delay(500);
rstx_u();
Serial.println(" ");
Serial.println(" 1p 2p 3p 4p 5p 6p 7p 8parameter(byte)");
Serial.println(" ");
byteL=0x00 ; //
writeCommand_read6Parameter();
rstx_u();
Serial.println(" ");
for (j=0; j<=255;j++) //255 0x4F
{
byteL=j ; //
writeCommand_read6Parameter();
rstx_u();
}
}
// Г Л А В Н А Я П Р О Г Р А М М А
void loop()
{
// put your main code here, to run repeatedly:
}
// П О Д П Р О Г Р А М М Ы , Ф У Н К Ц И И
// RST вверх. Сброс дисплея
int rstx_u()
{
digitalWrite(WRX, 0);digitalWrite(DCX, 0);digitalWrite(RDX, 1);
digitalWrite(RSTX, 0); delay(10);
digitalWrite(RSTX, 1); delay(10);
}
// дергаем WR вверх
int wrx_u()
{
digitalWrite(WRX, 0); digitalWrite(WRX, 1); //digitalWrite(WRX, 0);
delay(2);
}
// дергаем RD вниз и считываем данные
int rdx_u()
{
//digitalWrite(RDX, 0); digitalWrite(RDX, 1); // digitalWrite(RDX, 0);
digitalWrite(RDX, 1); digitalWrite(RDX, 0); // оставим в 0 , чтоб порт дисплея был на выход,
// и преобразователи уровней на шилде (если они есть) тоже были на выход
delay(2);
PORTA=0x00;
byteL=0; // PORTA считаем
byteL=PINA; // считываем с выводов PORTA
//knopel();
delay(2);
}
// конфигурация порта на вход
int port_in()
{
DDRA=0x00; // конфиг всех пинов на вход
PORTA=0x00; // выключение подтягивающих резисторов
}
// конфигурация портов на выход
int port_out()
{
DDRA=0xFF;// конфиг всех пинов на выход
PORTA=0x00; // выключение подтягивающих резисторов
}
int writeCommand_read6Parameter()
{
// передадим команду
digitalWrite(RDX, 1); // сначала порт дисплея в режим приема
port_out(); // конфим ардуинку на выход
// 1-будем передавать команду
digitalWrite(DCX, 0); // для передачи команды в дисплей, а не данных
delay(2);
// сначала передадим старший байт=00 (00 на порт уже установил port_out(); )
PORTA=0x00;
wrx_u(); /////////////wrx_u(); ///////////////////
// теперь передадим младший байт
PORTA=byteL;
wrx_u(); // дергаем WRITE вверх
delay(2);
Serial.print("register " ); pn();
Serial.print(byteL, HEX );
Serial.print(" " );
byteLL=byteL; // запомним для нужд
// 2-будем принимать данные
port_in(); // порт ардуины на вход
delay(2);
digitalWrite(DCX, 1); // работаем теперь с данными, а не с командой
delay(2);
// дергаем RD вниз и получаем данные \, к примеру прочесть до 8ми параметров , физически в памяти это просто последующие регистры,
// просто для скорости не надо задавать адрес последующего снова - это сделано во многих LCD контроллерах.
for (i=1; i<=8; i++)
{
rdx_u(); // дергаем RD вниз и получаем данные
Serial.print(" " ); pn();
Serial.print(byteL, HEX);
}
if ( byteLL==0x00 || byteLL==0xEF || byteLL==0xBF || byteLL==0x04 || byteLL==0xD3 ) Serial.print(" ***" );
if ( byteLL==0xDA || byteLL==0xDB || byteLL==0xDC ) Serial.print(" ***" );
Serial.println("");
digitalWrite(RDX, 1); // считали, переводим дисплей обратно в режим приема инфы
}
int pn() // печать дополнительный 0 , если 0 , чтоб печаталось в итоге 00
{
if (byteL<=0x0F) Serial.print("0");
}
int knopel() // остановка программы чтоб замерить уровни где надо и ожидание нажатия кнопки, для продолжения программы
{
while (digitalRead(12)==1) { digitalWrite(13, 1); delay(100);digitalWrite(13, 0); delay(200) ;}
delay(500);
}
~522*290 не встречал похожего разрешения, ближние разрешения 480x320 (ili9486,ili9488,ili9481,HX8357,HX8347,RM68040,R61581,...) и 640x360 (R61523,...)
судя по логу, это подделка (аналог) известного контроллера . не все ID знаю, но здесь подозрительно он слишком короткий (здесь м.б. данные с регистов 04 BF , DA DB DC, 2A 2B-размер), похоже на подделку . Но это не мешает работать этим дисплеям с ардуинкой. инит должен подойти от широкораспространённого. Есть ещё вариант поискать прошивку на этот тлф. по его названию , в прошивке глянуть какой драйвер дисплея используется. Еслиб тлф. был живой, то ещё вариант можно было включить анализатор при его включении, и снять короткий лог инита и вывода графики.
Ещё вариант, простой для вас, переберите иниты распространенных 480x320 дисплеев, которых нет в UTFT ( memorysaver.h ). какие можно поиском по aliexpress, инету, вайенжиниринг.ком найти, 480x320 , 320x480 , 480 x 320 LCD screen - будут много разных вариантов, смотрите описание , зачастую приводят тип контроллера, далее находите инит , подтыкаете в UTFT , заводите, радуетесь победе, и стряпаете на нём чтонибудь полезное.
// позже, если время будет, мож через недельку выложу ещё несколько изученных контроллеров/дисплеев вместе с логами читалки для сравнения , как оформлю. вот на днях попался 640x360 R61523 , подделка (ID почти пустое, как у вас, и не такое как в PDF) , но инит подошёл, UTFT тест кажет (подменил значения и переназвал функции в ините r61581, от найденного инита от STM в инете) , . как куплю оригинал, исследую , выложу инфу о разнице по чтению оригинала и аналога(подделки).
Вот по некоторым контроллерам есть ещё старенькая табличка LCD_Table.xls контроллеров, дисплеев, тлф найденная на просторах инета https://yadi.sk/i/Z_0aZQkAoyDGo . (мож существует и дополнение благодаря тому кто её составляет) . Когда ищите в ней, не забывайте , избегать выделенных фрагментов и ставить галку искать по всей книге, а не листу.
////Чтоб ветку не засорять, можете на емайл писать sеgun coб. яндekс ру (переписать все буквы латиницей)
Проблема в таче- он работает только с одной стороны экрана . Добавил #define TOUCH_ORIENTATION PORTRAIT , все равно точно не попадает куда нажимаешь. Я где то давно видел в библиотеку добавляется , что то типа x=480 y=240 и тогда точно работает . Сам искал - ненашел .
калибровка не помогает -вообще тогда не реагирует , а со стандартными значениями рисует сбоку в одной части экрана еще и зеркально .
Я по той ссылке что выше прочитал всего одно сообщение... И то там увидел что возможно у кого то перепутаны были пины... X и Y или что то в этом роде... Проверте у себя...
Про перепутанные пины это верно, есть у меня tft на ili9327. Подключение 8бит UNO. Работать нормально не хотел, пока в программе не подкорректировал подкючение выводов тача. Они там напрямую к ардуино подключены.
По теме вопрос. Есть такой tft WD666AB2H 39 pin. облазил весь интернет. Нашел только продаем, продаем, продаем. Хорошо хот контроллер озвучили ili9488. На руках его нет, но есть желание его приладить. Может кто встречал инфу, нужна распиновка.
По теме вопрос. Есть такой tft WD666AB2H 39 pin. облазил весь интернет. Нашел только продаем, продаем, продаем. Хорошо хот контроллер озвучили ili9488. На руках его нет, но есть желание его приладить. Может кто встречал инфу, нужна распиновка.
Раз его нет на руках, к чему тогда вопрос?! На сейчас он уже превосходно гуглиться, поиск и аналоги выдает. В соседней ветке вам отвечали по нему. Неохота снова искать? И еслли раз никто не потратил на него драгоценного времени, не выложил в инет, (раз был вопрос, значит рассчитывали на ответ) - предлагаю тогда самим потратить пару дней. разобраться безвозмездно и сделать добро, выложить инфу по нему. мож кому пригодиться. или мож скажут хотя бы спасибо. Находя себе тоже нужную инфу в инете, задумывались, кто то ж добрый потрудился, её выложил.
forfrends пишет:
Спасибо. Попробовал читалку. Что-то выдало. Вот результат:
...
register 04 54 66 00 00 00 00 00 00 *
..
register 2A 00 00 00 01 00 00 00 00
register 2B 00 00 00 01 00 00 00 00
...
register DA 54 54 54 54 54 54 54 54
register DB 80 80 80 80 80 80 80 80
register DC 66 66 66 66 66 66 66 66
...
глянул ещё парочку даташитов больших дисплейчиков , замечу, что ID иногда не только ложат в 04h (или вообще пустой оставят). но и дублируют ID1 ID2 ID3 в DAh DBh DCh . ( DAh - manufacture фабрика (не стоит обращать внимание)DBh DCh - module / driver драйвер ).
Из 800x480 864x480 попались такие замечательные даташиты
ILI9486 ILI9486L : 04h 1параметр не определен, 2й-фабрика. 3,4й-драйвер , DAh - xx , DBh от 80 до FF , DCh 00h (тоже немного подходит под то что выдала читалка)
кстати эти регистры м.б. перепрограммированы в OTP режиме.
Специально проводить экспиримент я и не просил. Знаю по себе как заниматься инженирингом. Покупать кота в мешке тоже не айс. Хватает вопросов и по работе с контроллерами и с их перефирией.
Да. спасибо. про vivaz знал, хорошая статейка. Ранее запускал уже дисплеи от SonyEricsson U5 и U8i на ардуино мега . шаманил UTFT под него.
Разрешение превосходное. Диагональ бы поболе. Повышайку для подсветки поставил готовый модуль MT3608, 19вольт через гасящий резистор. Подпаивал дисплей проводками, ибо разъем ( шаг 0.2мм против обычных 0.3мм ) стоит дороже дисплея в 4ре раза! . Ищу пока оригинал дисплея чтоб сравнить с неоригиналом. В плане потом черкнуть по ним. Да и флаи надо добить. U5 U8i перевести на 8 бит для мини, чтоб было много свободных пинов, весьма трудно , смотрел , очень тонкие дорожки от im0-2 со стекла в шлейф и там сразу на + и - . Если делать как есть 16бит , на мини остануться 4ре свободных пина, хотя для некоторых проектов хватит. И если сравнивать 8 бит и 16 бит на ардуино уно/мини/нано , то 8бит будет гораздо шустрее работать, чем 16 бит. (из-за раскидывании по многим разным портам при 16бит) . На меге да, 16 побыстрей будет чем 8 . К примеру тест UTFT на меге на ili9325 320x240 8бит-за 45сек, а в режиме 16бит - 41сек.
//////////////////// по R61523 Vivaz Arduino UTFT в следующих постах на 6й странице
Имхо LCD с разрешением более 320х240 подключать к 8-ми разрядным процам да еще по 8 разрядной шине считаю кащумством. Тогда уж лучше miniSTM на 103c8t, да на 16 полноценных битах. остается порядка 20 свободных пинов, есть адаптация под IDE arduino. http://www.stm32duino.com/viewforum.php?f=1&sid=776b93cae447043c5a6340572d148fe3
register EFh for ILI9327(0 02 04 93 27 FF),
register 0 EF
1 Parameter 0 EF
2 Parameter 0 EF
3 Parameter 0 EF
4 Parameter 0 EF
5 Parameter 0 EF
6 Parameter 0 EF
судя по логу (считывается тоже, что и посылается), у вас неподключен RD дисплея на 42й пин меги.
Для вставки кода , при написании сообщения, надо пользоваться значком {....} code , в окошко скопировать выданный код из монитор порта. В окошке, еще есть вкладка дополнительно , поставить галочку на Сворачитьвать код по умолчанию...
Примените читалку для 8ми бит. версию 3.1 она считывает все регистры. Управляющие пины подключать как написано в скетче читалки. шину данных два варианта:
читалка v3.1 для PORTC , если дисплей вы подключили на PORTC (пины ардуино 30-37 соответственно подключили к дисплейным DB7-DB0), то :
// ID_display_read_to_serial_monitor_universal_v3_1_PORTC.ino
// читалка ID дисплеев V3.1beta только для 8ми битных дисплеев,
// подключить 8ми битный дисплей к Arduino Mega/Due:
// дисплейные DB0-7 (и могут быть физические DB8-DB15 , DB10-DB17) , соответственно на arduino пины 37-30 ( микроконтроллера PORTC PC0-PC7 )
// к примеру считать с 00D3 =>0xD3 младший
// Это же подключение не соответствует UTFT распиновке, для 8ми бит она ориентирована на PORTA
// разве что для ili9327 в UTFT_v2.77b2_uno_ili9327_8bit_turbo, там используется PORTC
// тогда не забыть на 42 пин подать лог.1 хотя бы внутренним резистором digitalWrite(42, HIGH);
#define CD_Pin 38 // (RS) //38
#define DCX 38
#define WR_Pin 39 //39
#define WRX 39
#define CS_Pin 40 //40
#define CSX 40
#define RST_Pin 41 //41
#define RSTX 41
#define RD_Pin 42 //42 __-
#define RDX 42
int i,j;
byte byteLL; // вспомогательный , ибо основной используется
byte byteL;
void setup()
{ DDRA=0xFF;
// кнопка для продолжения скетча, если где надо его остановить, чтоб замерить лог. уровни
pinMode(A12, INPUT); // кнопку удобно воткнуть в 12й пин и в рядом GND
digitalWrite(12, HIGH); // внутренний подтягив. резистор к +
pinMode(13, OUTPUT); // и светодиод на плате чтоб мигал, когда можно нажать кнопку для продолжения
Serial.begin(9600);
digitalWrite(RST_Pin, 0); // удержание в сбросе дисплея
digitalWrite(CS_Pin, 0); // активация шины данных дисплея (выбор кристалла ChipSelect)
for (i=22; i<=42;i++) { pinMode(i, OUTPUT); } // конфиг всех пинов на выход + управляющие пины //i=22; i<=42;i++
Serial.println("start... " );
Serial.println("");
digitalWrite(RST_Pin, 1); // вывод дисплея из сброса
delay(100);
digitalWrite(RST_Pin, 0); // удержание в сбросе дисплея
delay(100);
digitalWrite(RST_Pin, 1);// вывод дисплея из сброса
delay(500);
rstx_u();
Serial.println(" ");
Serial.println(" 1p 2p 3p 4p 5p 6p 7p 8parameter(byte)");
Serial.println(" ");
byteL=0x00 ; //
writeCommand_read6Parameter();
rstx_u();
Serial.println(" ");
for (j=0; j<=255;j++) //255 0x4F
{
byteL=j ; //
writeCommand_read6Parameter();
rstx_u();
}
}
// Г Л А В Н А Я П Р О Г Р А М М А
void loop()
{
// put your main code here, to run repeatedly:
}
// П О Д П Р О Г Р А М М Ы , Ф У Н К Ц И И
// RST вверх. Сброс дисплея
int rstx_u()
{
digitalWrite(WRX, 0);digitalWrite(DCX, 0);digitalWrite(RDX, 1);
digitalWrite(RSTX, 0); delay(10);
digitalWrite(RSTX, 1); delay(10);
}
// дергаем WR вверх
int wrx_u()
{
digitalWrite(WRX, 0); digitalWrite(WRX, 1); //digitalWrite(WRX, 0);
delay(2);
}
// дергаем RD вниз и считываем данные
int rdx_u()
{
//digitalWrite(RDX, 0); digitalWrite(RDX, 1); // digitalWrite(RDX, 0);
digitalWrite(RDX, 1); digitalWrite(RDX, 0); // оставим в 0 , чтоб порт дисплея был на выход,
// и преобразователи уровней на шилде (если они есть) тоже были на выход
delay(2);
PORTC=0x00;
byteL=0; // PORTC считаем
byteL=PINC; // считываем с выводов PORTC
//knopel();
delay(2);
}
// конфигурация порта на вход
int port_in()
{
DDRC=0x00; // конфиг всех пинов на вход
PORTC=0x00; // выключение подтягивающих резисторов
}
// конфигурация портов на выход
int port_out()
{
DDRC=0xFF;// конфиг всех пинов на выход
PORTC=0x00; // выключение подтягивающих резисторов
}
int writeCommand_read6Parameter()
{
// передадим команду
digitalWrite(RDX, 1); // сначала порт дисплея в режим приема
port_out(); // конфим ардуинку на выход
// 1-будем передавать команду
digitalWrite(DCX, 0); // для передачи команды в дисплей, а не данных
delay(2);
// сначала передадим старший байт=00 (00 на порт уже установил port_out(); )
PORTC=0x00;
wrx_u(); /////////////wrx_u(); ///////////////////
// теперь передадим младший байт
PORTC=byteL;
wrx_u(); // дергаем WRITE вверх
delay(2);
Serial.print("register " ); pn();
Serial.print(byteL, HEX );
Serial.print(" " );
byteLL=byteL; // запомним для нужд
// 2-будем принимать данные
port_in(); // порт ардуины на вход
delay(2);
digitalWrite(DCX, 1); // работаем теперь с данными, а не с командой
delay(2);
// дергаем RD вниз и получаем данные \, к примеру прочесть до 8ми параметров , физически в памяти это просто последующие регистры,
// просто для скорости не надо задавать адрес последующего снова - это сделано во многих LCD контроллерах.
for (i=1; i<=8; i++)
{
rdx_u(); // дергаем RD вниз и получаем данные
Serial.print(" " ); pn();
Serial.print(byteL, HEX);
}
if ( byteLL==0x00 || byteLL==0xEF || byteLL==0xBF || byteLL==0x04 || byteLL==0xD3 ) Serial.print(" ***" );
if ( byteLL==0xDA || byteLL==0xDB || byteLL==0xDC ) Serial.print(" ***" );
Serial.println("");
digitalWrite(RDX, 1); // считали, переводим дисплей обратно в режим приема инфы
}
int pn() // печать дополнительный 0 , если 0 , чтоб печаталось в итоге 00
{
if (byteL<=0x0F) Serial.print("0");
}
int knopel() // остановка программы чтоб замерить уровни где надо и ожидание нажатия кнопки, для продолжения программы
{
while (digitalRead(12)==1) { digitalWrite(13, 1); delay(100);digitalWrite(13, 0); delay(200) ;}
delay(500);
}
читалка v3.1 для PORTA , если дисплей вы подключили на PORTA (пин 22-29 ардуино меги соответственно подключать к дисплейным DB0-DB7), то :
// ID_display_read_to_serial_monitor_universal_v3_1_PORTA.ino
// читалка ID дисплеев V3.1beta только для 8ми битных дисплеев PORTA,
// подключить 8ми битный дисплей к Arduino Mega/Due:
// DB0-7 (DB8-DB15 , DB10-DB17) , соответственно на arduino пины 22-29 ( микроконтроллера PORTA PA0-PA7 )
// к примеру считать с 00D3 =>0xD3 младший
// Это же подключение соответственно UTFT распиновке,
// только не забыть, в тесте UTFT, на 42 пин подать лог.1 хотя бы внутренним резистором
// digitalWrite(42, HIGH);
#define CD_Pin 38 // (RS) //38
#define DCX 38
#define WR_Pin 39 //39
#define WRX 39
#define CS_Pin 40 //40
#define CSX 40
#define RST_Pin 41 //41
#define RSTX 41
#define RD_Pin 42 //42 __-
#define RDX 42
int i,j;
byte byteLL; // вспомогательный , ибо основной используется
byte byteL;
void setup()
{ DDRA=0xFF;
// кнопка для продолжения скетча, если где надо его остановить, чтоб замерить лог. уровни
pinMode(A12, INPUT); // кнопку удобно воткнуть в 12й пин и в рядом GND
digitalWrite(12, HIGH); // внутренний подтягив. резистор к +
pinMode(13, OUTPUT); // и светодиод на плате чтоб мигал, когда можно нажать кнопку для продолжения
Serial.begin(9600);
digitalWrite(RST_Pin, 0); // удержание в сбросе дисплея
digitalWrite(CS_Pin, 0); // активация шины данных дисплея (выбор кристалла ChipSelect)
for (i=22; i<=42;i++) { pinMode(i, OUTPUT); } // конфиг всех пинов на выход + управляющие пины //i=22; i<=42;i++
Serial.println("start... " );
Serial.println("");
digitalWrite(RST_Pin, 1); // вывод дисплея из сброса
delay(100);
digitalWrite(RST_Pin, 0); // удержание в сбросе дисплея
delay(100);
digitalWrite(RST_Pin, 1);// вывод дисплея из сброса
delay(500);
rstx_u();
Serial.println(" ");
Serial.println(" 1p 2p 3p 4p 5p 6p 7p 8parameter(byte)");
Serial.println(" ");
byteL=0x00 ; //
writeCommand_read6Parameter();
rstx_u();
Serial.println(" ");
for (j=0; j<=255;j++) //255 0x4F
{
byteL=j ; //
writeCommand_read6Parameter();
rstx_u();
}
}
// Г Л А В Н А Я П Р О Г Р А М М А
void loop()
{
// put your main code here, to run repeatedly:
}
// П О Д П Р О Г Р А М М Ы , Ф У Н К Ц И И
// RST вверх. Сброс дисплея
int rstx_u()
{
digitalWrite(WRX, 0);digitalWrite(DCX, 0);digitalWrite(RDX, 1);
digitalWrite(RSTX, 0); delay(10);
digitalWrite(RSTX, 1); delay(10);
}
// дергаем WR вверх
int wrx_u()
{
digitalWrite(WRX, 0); digitalWrite(WRX, 1); //digitalWrite(WRX, 0);
delay(2);
}
// дергаем RD вниз и считываем данные
int rdx_u()
{
//digitalWrite(RDX, 0); digitalWrite(RDX, 1); // digitalWrite(RDX, 0);
digitalWrite(RDX, 1); digitalWrite(RDX, 0); // оставим в 0 , чтоб порт дисплея был на выход,
// и преобразователи уровней на шилде (если они есть) тоже были на выход
delay(2);
PORTA=0x00;
byteL=0; // PORTA считаем
byteL=PINA; // считываем с выводов PORTA
//knopel();
delay(2);
}
// конфигурация порта на вход
int port_in()
{
DDRA=0x00; // конфиг всех пинов на вход
PORTA=0x00; // выключение подтягивающих резисторов
}
// конфигурация портов на выход
int port_out()
{
DDRA=0xFF;// конфиг всех пинов на выход
PORTA=0x00; // выключение подтягивающих резисторов
}
int writeCommand_read6Parameter()
{
// передадим команду
digitalWrite(RDX, 1); // сначала порт дисплея в режим приема
port_out(); // конфим ардуинку на выход
// 1-будем передавать команду
digitalWrite(DCX, 0); // для передачи команды в дисплей, а не данных
delay(2);
// сначала передадим старший байт=00 (00 на порт уже установил port_out(); )
PORTA=0x00;
wrx_u(); /////////////wrx_u(); ///////////////////
// теперь передадим младший байт
PORTA=byteL;
wrx_u(); // дергаем WRITE вверх
delay(2);
Serial.print("register " ); pn();
Serial.print(byteL, HEX );
Serial.print(" " );
byteLL=byteL; // запомним для нужд
// 2-будем принимать данные
port_in(); // порт ардуины на вход
delay(2);
digitalWrite(DCX, 1); // работаем теперь с данными, а не с командой
delay(2);
// дергаем RD вниз и получаем данные \, к примеру прочесть до 8ми параметров , физически в памяти это просто последующие регистры,
// просто для скорости не надо задавать адрес последующего снова - это сделано во многих LCD контроллерах.
for (i=1; i<=8; i++)
{
rdx_u(); // дергаем RD вниз и получаем данные
Serial.print(" " ); pn();
Serial.print(byteL, HEX);
}
if ( byteLL==0x00 || byteLL==0xEF || byteLL==0xBF || byteLL==0x04 || byteLL==0xD3 ) Serial.print(" ***" );
if ( byteLL==0xDA || byteLL==0xDB || byteLL==0xDC ) Serial.print(" ***" );
Serial.println("");
digitalWrite(RDX, 1); // считали, переводим дисплей обратно в режим приема инфы
}
int pn() // печать дополнительный 0 , если 0 , чтоб печаталось в итоге 00
{
if (byteL<=0x0F) Serial.print("0");
}
int knopel() // остановка программы чтоб замерить уровни где надо и ожидание нажатия кнопки, для продолжения программы
{
while (digitalRead(12)==1) { digitalWrite(13, 1); delay(100);digitalWrite(13, 0); delay(200) ;}
delay(500);
}
Вот к примеру что она выдала для неизвестного 2.4" tft lcd shield arduino uno
, который тоже запустился на адафруитской переделке от SPFD5408 (для запуска на UTFT, никто видимо не хочет попыхтеть для него, можно было сделать на базе UTFT_v2.77b2_uno_ili9327_8bit_turbo).
Как видно из лога, это вообще непонятный левый аналог. Согласно даташиту http://www.micro4you.com/files/lcd/SPFD5408A.pdf , для SPFD5408, ID должен лежать в 00h , и должно было считаться 54 08 .
По факту в дисплее стоит контроллер - аналог . Поэтому и применяют переделки, в частности от adafruita ,они не вычитывают какой id контроллера, чтобы скормить ему подходящий инит , а тупо дают ему определенный инит. Собственно как и делает UTFT, для неизвестных дисплеев в нем может не оказаться подходящего инита, да и подходящую битность там надо установить. К тому же в UTFT ,если дисплей переведен с 16ти на 8 бит, иногда приходиться немного попыхтеть. К примеру выставить все 16ть бит bytedtm[] = {16, 16 ... 16}, но физически использоватьмладшие 8мь бит, т.е. PORTC ( пин 30-37 соответственно подключать к дисплейным DB7-DB0 ) , так хоть можно увидеть какие нибудь корявые картинки теста. Т.о. перебирая иниты можно убедиться что дисплей жив и может что-то рисовать.
как конечное решение можно , подсмотреть на переделке UTFT UTFT_v2.77b2_uno_ili9327_8bit_turbo , на форуме она есть . Для меги, уновский шилд по умолчанию подключать проводочками на PORTC . Можно и напрямую , в соседней ветке про 3.5", выкладывал переделку на базе её, чтоб уновский адафруитский дисплей воткнутый в мегу работал.
по поводу подключения - я не вижу смысла подключать дисплей иначе как у него штырьки стоят, прям на плату втыкаешь и всё. зачем огород городить, если можно пины переназначить в программе. или это только для проверки ?
у меня дсиплей с вот такими пинами LCD_CS A3 LCD_CD A2 LCD_WR A1 LCD_RD A0. это фактическое подключение в соответствии с надписями на дисплее. переделка так работает
я пробовал для UTFT делать инит в соответствии с рабочей AdafruiSPFD5408, вроде всё верно, но всё равно белый экран
а почему именно белый экран горит? что это значит? почему не абракадабру выводит?
самое интересное что я пробовал в соответствии с инструкцией рабочей переделки исправить оргинал Adafrui, но всё равно белый экран, вот это и странно
а есть ли какаято статья обучающая про это всё про битность способы передачи регистры и тп, именно при работе с дисплеями такими а то ничего почти не понятно? вот этим было бы интерсно заняться, там бы исам разобрался
по поводу подключения - я не вижу смысла подключать дисплей иначе как у него штырьки стоят, прям на плату втыкаешь и всё. зачем огород городить, если можно пины переназначить в программе. или это только для проверки ?
так уновские дисплеи на проводках никто и не собирается использовать, невнимательно читали. Это подключение только для удобного считывания ID программе. и если что удобного и понятного управления. И как стандартное подключение меговских шилдов. Читалку специально для уновского дисплея напрямую воткнутого в мегу , нету надобности делать , ибо не всегда у них реально выведен RD, да и по некоторым адресам сама адафруитская либа умеет считывать и выводит в монитор порта.
Для использования же Уновских Адафруитских шилдов на меге и уно, подходят либы и адафруит и UTFT-подшаманенная. В теме про 3.5" явный пример использования UTFT для связки Уно+адафруитский уновский шилд к примеру на базе ili9327 - решение UTFT_v2.77b2_uno_ili9327_8bit_turbo. Для связки Мега+адафруитский уновский шилд -http://arduino.ru/forum/apparatnye-voprosy/tft-35-i-arduino?page=6#comment-90708 разбирался сам в работе библиотеки , и на форуме обсуждалось что и как, изучите внимательней. там же народ нашёл методы ещё ускорения работы UTFT.
// на адафруитском уновском шилде DB0 DB1 заведены на пины ардуиновские D8 D9 . Для UTFT в уновском шилде по умолчанию они должны быть физически на пинах D0 D1 (на которых находится сериал порт, адафруит их высвобождает) .
по R00h вычитывается ID 0x52 что соответствует HX8352A . В UTFT он есть . вызов UTFT myGLCD(HX8352A,38,39,40,41); . Дисплейчик 16бит. Перевод в 8бит на шлейфе не предусмотрен (разве что чем нибудь острым перекоммутировать дорожки со стекла в шлейф).
пришли стабилизаторы 3,3в 0.25-0.5A XC6206P332MR , маркировка 662K , теперь по питанию лучше их ставить .
Вот такой вот шилд получился. Габариты дисплея не загораживают верхний и нижний ряд выводов ардуино.
углы обзора вверх вниз вправо хорошие , влево не очень . Попробовал пины длинные long , поэтому можно под шилдом разместить обычную плату или шилд.
по R00h вычитолась ID 6809h , изучение даташитов дало что это контроллер RM68090 , причём в старой версии rev01 этот контроллер имеет ID 6807h , в новой версии rev04 - ID 6809h .
На шлейфе есть даже подписанная перемычка R1-16bit R2-8bit (используютсяDB0-DB7) .
Методом подбора подошли инициализации UTFT для 16бит: ILI9325D_16 , ILI9325D_16ALT . для 8 бит: ILI9325D_8 ILI9325C . Время теста UTFT на 16бит = 41сек. , на 8бит = 45сек.. Углы обзора хорошие .
дисплей пока некуда приспособить, изучал на одной из макеток (резисторы 10ком), по питанию такая вот такое исследование получилось: при стабилитроне 3,3в и резисторе
- 300ом , при запуске инита напряжение с 3,3в падает до 2,5в(эт уже мало) ,
- 200ом , с 3,5в до 2,9в
- 150 ом , с 3,6в(эт уже много) до 3,1в
так что вывод , лучше либо ставить стабилитрон 3,0в и резистор 100-150ом , либо ставить микросхему стабилизатор 3,3в .
инет находит еще соответствия OT-906 A906 A919 8K4669 FPC706-10 W939 , но подобных распиновок не было найдено.
картинки кликабельны:
собрал макетку для исследования дисплеев с плоским разъемом , с шагом пинов 0.3мм
исследование дорожек в шлейфе и вход и в кристалл выявило ШинуДанных 18бит .и непонятные управляющие вывода ШиныУправления. Толстые дорожки - это VCC .
Методика дальше такова : устанавливаем на упр. вывода (через резисторы 10к) лог.0 , и по одному выводу, потом по 2 выводу подавать лог1. . Смотреть на несколько подключенных на ШД белых светодиодов, через 10к на +3,3в . Т.о. если свечение тускло - это Zсост , если ярко - это лог.1 , если тухнет - лог.0 .
Это выявило
- DC (RS) - лог 1 вызывает смену ШД с Z-сост в лог0
- CS и RD - лог.1 на них переводят оюратно шину данных с лог.0 на Z-состояние.
- при подаче разных лог. уровней на 39 38 вывод , на ШД появляются лог. на разных пинах , а именно 00 - 16бит 10 - 8бит 10 - 18бит 11 - 9бит . И теперь понятна очередность бит с пин11по пин28 соостветствие c DB0 по DB17 .
методом подбора ШУ вычиталось с r00h ID 0x47 . Путем пересмотра PDF нашелся такой ID в HX8347D
и это можно было предположить и по редко встечающемуся распределению ШД , а именно вывода очередности DB0-DB17 не друг за дружкой, а по паре ,
пересматривая PDF наткнуться на HX8347D
и уже по дорожкам в шлейфе прослеживаем более точное распределение im0-3 ШД ШУ на разъеме.
установка UTFT всё на 16бит и перебор всех инитов не завёл дисплей. Значит в поиск по инету родной init code HX8347D . пришлось зарегаться на китайском хранилище и от туда его взять . ( есть ещё какое-то еще иностранное, так там вообще попандос, платить деньги)
найденный расчитанный для напряжения питания 2,8в (как показала практика и на 3,1в тож хорошо кажет) :
вызов UTFT myGLCD(0,38,39,40,41); либо UTFT myGLCD(HX8347A,38,39,40,41);
для справки замечу из PDF серии HX8347x соответствие контроллеров -
регистр - ID
HX8347A r67h ID 0x47
HX8347B r00h ID 0x9325 (ID1 ID2 ID3 м.б. в rDAh rDBh rDCh - программируется в OTP режиме)
HX8347D r00h ID 0x47
HX8347G r00h ID 0x75
HX8347I pdf бесплатный не найден . возможно ID 0x9595
дисплей разгадан и запущен:
Время теста UTFT в режимах 8бит - 45сек и 16бит - 40 сек. (при закомменте в setxy.h // LCD_Write_COM_DATA(0x04,x2>>8); ещё немного быстрее, т.к. разрешение экрана не большое)
На этот дисплейчик больше всего дней ушло. распиновка кристалла таже (шина данных выводится попарно в шлейф) , но инит от hx8347d не хотел подходить. оказался ili9338 . На 16бит запустился , на 8 нивкакую. Читалкой(без сбросов аппаратных и командных) потом смотрю после инита UTFT - параметры записывались с чередованием 0x00 . Помогла только UTFT_v2.77b2_uno_ili9327_8bit_turbo . Да и редкий контроллер оказался ili9338 ( ili9338b ) . его ID в регистре D3h xx 00 xx 38 ( читалка выдает register D3 00 00 93 38 38 38 38 38 * )
LCD_Write_COM(0x11);// обязательно
delay(100);
//LCD_Write_COM(0x13);
LCD_Write_COM(0x3A); // Pixel Format Set
LCD_Write_DATA(0x05); //0x05-65k color565
LCD_Write_COM(0x36); // Memory Acces Control
LCD_Write_DATA(0x48); //e8-orig , 48-ili9327 16bit! ,
LCD_Write_COM(0x29); // обязательно
LCD_Write_COM(0x2C); // обязательно
Вот архив , где собрал datasheet ili9338 ( ili9338b ) , hx8347d , hx8347a hx8347b hx8347g ili9335 ili9340 ili9342 , подготовленные UTFT для 16 и 8 битного режимов.
forfrends, перевод на ДУЕ неудобен, там с портами набезобразили, раскидали кусками по всей плате и обозначаются иначе.
неужели у друзей или знакомых нет какойнибудь электроники? этих резисторов валом везде, особенно в старых материнках, cd-rom, hdd , платах принтеров, телевизоров, ... . пойдут от 10ком-20ком (мож и поменьше номиналы, непроверял) . вместо стабилитрона 3,0-3,3в белый светодиод, или 2 старых красных последовательно.
Lelick, как подключить смотрите внимательно подобные примеры выше, можете в инете найти схему на тлф и глянуть, на других форумах от сониэриков подключали, ссылка подобного давал в предыдущем посте.
вызов библиотеки UTFT myGLCD(ILI9325D_16ALT,38,39,40,41);
всё таки для надёжности лучше не использовать подсветку дисплея в качестве стабилизатора , желательно стабилитроном 3,0-3,3в . Разноцветные эмальрованные провода с моторчиков cd-rom, старых кассетных магнитофонов,....
Slider, можете помочь? Пытаюсь подогнать программу из первого поста к Дуе... Сразу возникло несколько вопросов:
В коде используется пин #define CD_Pin 38 // (RS), Но у меня в распиновке нет ни CD ни RS, это случайно не DC? Также вопрос: в коде есть RST_Pin 41 это подключение пина RESET дисплея?
И еще : PORTA=0x00; PORTC=0x00; // это команда для считывания ID дисплея =0x00
Как именно происходит считывание ИД дисплея? Если не ошибаюсь - это команды настройки портов А и С на вход? Можно ли просто заменить на код for (i=22; i<=37;i++) { pinMode(i, INPUT); }
Проверьте правильность подключения дисплея:
Попробовал переделать код под Arduino DUE и дисплей 128*64 на контроллере ST7920. Вот что получилось:
#include "U8glib.h" #define CD_Pin 38 // (RS) #define WR_Pin 39 #define CS_Pin 40 #define RST_Pin 41 #define RD_Pin 42 U8GLIB_ST7920_128X64_4X u8g(48, 47, 49); // SPI Com: SCK = En = 18, MOSI = rw = 16, CS=RS=di= 17 int i; byte byteH; byte byteL; void draw(void) { // graphic commands to redraw the complete screen should be placed here u8g.setFont(u8g_font_unifont); //lcd.begin(16, 2); digitalWrite(CS_Pin, 1); // деактивация диспл. (отключение его шины данных DB0..DB15) digitalWrite(RST_Pin, 0); // сброс дисплея //for (i=22; i<=42;i++) { digitalWrite(i, 0); } // всё лог.0 for (i=22; i<=42;i++) { pinMode(i, OUTPUT); } // конфиг всех пинов на выход + управляющие пины digitalWrite(RST_Pin, 1); // вывод дисплея из сброса // запишем команду digitalWrite(RD_Pin, 1); // уст. порта дисплея на приём (ввод данных в дисплей) digitalWrite(CD_Pin, 0); // будем работать 0-команда 1-данные digitalWrite(CS_Pin, 0); // выбор дисплея (активация) //PORTA=0x00; PORTC=0x00; // это команда для считывания ID дисплея =0x00 for (i=22; i<=42;i++) { digitalWrite(i, LOW); } // digitalWrite(WR_Pin, 1); // дёргаем WR digitalWrite(WR_Pin, 0); digitalWrite(CS_Pin, 1); // деактивация диспл. (отключение его шины данных DB0..DB15) //чтение данных //DDRA=0x00; DDRC=0x00; // или for (i=22; i<=37;i++) { pinMode(i, INPUT); } // конфиг всех пинов на вход digitalWrite(RD_Pin, 0); // уст. порта дисплея на передачу (вывод данных с дисплея) digitalWrite(CD_Pin, 1); // будем работать с 0-команда 1-данные digitalWrite(CS_Pin, 0); // выбор дисплея (активация ) digitalWrite(WR_Pin, 1); // дёргаем WR digitalWrite(WR_Pin, 0); u8g.setPrintPos(0, 10); byteH=0; if ( digitalRead(29) ) { byteH=byteH+128; u8g.print(1); } else u8g.print(0); if ( digitalRead(28) ) { byteH=byteH+64; u8g.print(1); } else u8g.print(0); if ( digitalRead(27) ) { byteH=byteH+32; u8g.print(1); } else u8g.print(0); if ( digitalRead(26) ) { byteH=byteH+16; u8g.print(1); } else u8g.print(0); if ( digitalRead(25) ) { byteH=byteH+8; u8g.print(1); } else u8g.print(0); if ( digitalRead(24) ) { byteH=byteH+4; u8g.print(1); } else u8g.print(0); if ( digitalRead(23) ) { byteH=byteH+2; u8g.print(1); } else u8g.print(0); if ( digitalRead(22) ) { byteH=byteH+1; u8g.print(1); } else u8g.print(0); byteL=0; if ( digitalRead(30) ) { byteL=byteL+128; u8g.print(1); } else u8g.print(0); if ( digitalRead(31) ) { byteL=byteL+64; u8g.print(1); } else u8g.print(0); if ( digitalRead(32) ) { byteL=byteL+32; u8g.print(1); } else u8g.print(0); if ( digitalRead(33) ) { byteL=byteL+16; u8g.print(1); } else u8g.print(0); if ( digitalRead(34) ) { byteL=byteL+8; u8g.print(1); } else u8g.print(0); if ( digitalRead(35) ) { byteL=byteL+4; u8g.print(1); } else u8g.print(0); if ( digitalRead(36) ) { byteL=byteL+2; u8g.print(1); } else u8g.print(0); if ( digitalRead(37) ) { byteL=byteL+1; u8g.print(1); } else u8g.print(0); u8g.setPrintPos(0, 30); u8g.print("ID display: "); u8g.print(byteH, HEX); u8g.setPrintPos(0, 50); u8g.print(byteL, HEX); digitalWrite(CS_Pin, 1); // деактивация диспл. (отключение шины данных DB0..DB15) //DDRA=0xFF; DDRC=0xFF; // или for (i=22; i<=37;i++) { pinMode(i, OUTPUT); } // конф. шины данных ARDUINO на выход digitalWrite(RD_Pin, 1); // уст. порта дисплея на приём (ввод данных в дисплей) //digitalWrite(RST_Pin, 1); // вставка для UTFT // pinMode(42, OUTPUT); // конф.ардуино для RD на выход // digitalWrite(42, 1); // уст. RD=1 - чтобы порт дисплея был на приём (ввод данных в дисплей) //delay(100); } void setup(void) { u8g.firstPage(); do { draw(); } while( u8g.nextPage() ); } void loop() { // put your main code here, to run repeatedly: }В результате в верхней строке только нули и ИД контроллера - тоже нули. Есть большое побозрение на неправильное подключение дисплея (писал в предыдущем посте). Можете с этим помочь?
Перелапатил кучу сайтов... Не нашел никакой другой распиновки кроме той что уже имеется. НО! Везде распиновка была на дисплеи 1.5-2.5 дюймов, а здесь все 4". Настораживает это.
Попробовал переделать программу читалка ID дисплеев v2.0 под ДУЕ. Собственно, вот что получилось:
#define CD_Pin 38 // (RS) //38 #define DCX 38 #define WR_Pin 39 //39 #define WRX 39 #define CS_Pin 40 //40 #define CSX 40 #define RST_Pin 41 //41 #define RSTX 41 #define RD_Pin 42 //42 __- #define RDX 42 int i=0; byte byteH; byte byteL; void setup() { Serial.begin(9600); digitalWrite(RST_Pin, 0); // удержание в сбросе дисплея digitalWrite(CS_Pin, 0); // активация шины данных дисплея (выбор кристалла ChipSelect) for (i=22; i<=42;i++) { pinMode(i, OUTPUT); } // конфиг всех пинов на выход + управляющие пины //i=22; i<=42;i++ Serial.println("start... " ); Serial.println("UTFT normal pin29-22(PORTA)-byteH(DB15-0) , pin37-30(PORTC)-byteL(DB7-0)"); Serial.println(""); digitalWrite(RST_Pin, 1); // вывод дисплея из сброса delay(5); digitalWrite(RST_Pin, 0); // удержание в сбросе дисплея delay(15); digitalWrite(RST_Pin, 1); delay(500); Serial.println("register 00h for ILI9320(9320), ILI9325(9325), ILI9326(9326), SSD1289(1289,8989)" ); Serial.println(" HX8347D(047), HX8347G(075), HX8352A(052), HX8352B(065), HX8352C(072)"); Serial.println(" R61509V(B509), R61505W(C505), SPFD5420A(5408) "); Serial.println("if (0 93 0 27) -> 8bit . if (93 27 93 27) -> 16bit " ); byteH=0x00 ; byteL=0x00 ; // writeCommand_read6Parameter(); rstx_u(); Serial.println("register EFh for ILI9327(0 02 04 93 27 FF), " ); byteH=0x00 ; byteL=0xEF ; // для ili9327 - 00 02 04 93 27 FF writeCommand_read6Parameter(); rstx_u(); Serial.println("register BFh for ILI9481(0 0 94 81 xx xx) " ); byteH=0x00 ; byteL=0xBF ; // для ili9481 - 00 00 94 81 xx xx writeCommand_read6Parameter(); rstx_u(); Serial.println("register D3h for ILI9488(0 0 94 88 xx xx) " ); byteH=0x00 ; byteL=0xD3 ; // для ili9488 - 00 00 94 88 xx xx writeCommand_read6Parameter(); rstx_u(); Serial.println("register 04h for HX8357(?DA-DC), HX8353(?80-85), " ); byteH=0x00 ; byteL=0x04 ; // для - xx xx writeCommand_read6Parameter(); rstx_u(); } // Г Л А В Н А Я П Р О Г Р А М М А void loop() { // put your main code here, to run repeatedly: } // П О Д П Р О Г Р А М М Ы , Ф У Н К Ц И И // RST вверх. Сброс дисплея int rstx_u() { digitalWrite(RSTX, 0); delay(15); digitalWrite(RSTX, 1); delay(250); } // дергаем WR вверх int wrx_u() { digitalWrite(WRX, 0); digitalWrite(WRX, 1); //digitalWrite(WRX, 0); delay(2); } // дергаем RD вверх и считываем данные int rdx_u() { //digitalWrite(RDX, 0); digitalWrite(RDX, 1); // digitalWrite(RDX, 0); digitalWrite(RDX, 1); digitalWrite(RDX, 0); // оставим в 0 , чтоб порт дисплея был на выход, // и преобразователи уровней на шилде (если они есть) тоже были на выход delay(2); //byteH=0; byteL=0; //byteH=PINA; // считываем с выводов PORTA //byteL=PINC; // считываем с выводов PORTC byteH=0; // PORTA считаем if ( digitalRead(29) ) byteH=byteH+128; if ( digitalRead(28) ) byteH=byteH+64; if ( digitalRead(27) ) byteH=byteH+32; if ( digitalRead(26) ) byteH=byteH+16; if ( digitalRead(25) ) byteH=byteH+8; if ( digitalRead(24) ) byteH=byteH+4; if ( digitalRead(23) ) byteH=byteH+2; if ( digitalRead(22) ) byteH=byteH+1; byteL=0; // PORTC считаем if ( digitalRead(30) ) byteL=byteL+128; if ( digitalRead(31) ) byteL=byteL+64; if ( digitalRead(32) ) byteL=byteL+32; if ( digitalRead(33) ) byteL=byteL+16; if ( digitalRead(34) ) byteL=byteL+8; if ( digitalRead(35) ) byteL=byteL+4; if ( digitalRead(36) ) byteL=byteL+2; if ( digitalRead(37) ) byteL=byteL+1; } // конфигурация порта на вход int port_in() { //DDRA=0x00; DDRC=0x00; // конфиг всех пинов на вход for (i=22; i<=37;i++) { pinMode(i, INPUT); } //PORTA=0x00; PORTC=0x00; // выключение подтягивающих резисторов for (i=22; i<=37;i++) { digitalWrite(i, LOW); } } // конфигурация портов на выход int port_out() { //DDRA=0xFF; DDRC=0xFF; // конфиг всех пинов на выход for (i=22; i<=37;i++) { pinMode(i, OUTPUT); } //PORTA=0x00; PORTC=0x00; // выключение подтягивающих резисторов for (i=22; i<=37;i++) { digitalWrite(i, LOW); } } int writeCommand_read6Parameter() { // передадим команду digitalWrite(RDX, 1); // сначала порт дисплея в режим приема port_out(); // конфим ардуинку на выход //PORTA=byteH ; //PORTC=byteL ; if (byteL == 0x00){ for (i=22; i<=37;i++) { digitalWrite(i, LOW); } } if (byteL == 0xEF){ digitalWrite(22, HIGH); digitalWrite(23, HIGH); digitalWrite(24, HIGH); digitalWrite(25, HIGH); digitalWrite(26, LOW); digitalWrite(27, HIGH); digitalWrite(28, HIGH); digitalWrite(29, HIGH); digitalWrite(30, LOW); digitalWrite(31, LOW); digitalWrite(32, LOW); digitalWrite(33, LOW); digitalWrite(34, LOW); digitalWrite(35, LOW); digitalWrite(36, LOW); digitalWrite(37, LOW); } if (byteL == 0xBF){ digitalWrite(22, HIGH); digitalWrite(23, HIGH); digitalWrite(24, HIGH); digitalWrite(25, HIGH); digitalWrite(26, HIGH); digitalWrite(27, HIGH); digitalWrite(28, LOW); digitalWrite(29, HIGH); digitalWrite(30, LOW); digitalWrite(31, LOW); digitalWrite(32, LOW); digitalWrite(33, LOW); digitalWrite(34, LOW); digitalWrite(35, LOW); digitalWrite(36, LOW); digitalWrite(37, LOW); } if (byteL == 0xD3){ digitalWrite(22, HIGH); digitalWrite(23, HIGH); digitalWrite(24, LOW); digitalWrite(25, LOW); digitalWrite(26, HIGH); digitalWrite(27, LOW); digitalWrite(28, HIGH); digitalWrite(29, HIGH); digitalWrite(30, LOW); digitalWrite(31, LOW); digitalWrite(32, LOW); digitalWrite(33, LOW); digitalWrite(34, LOW); digitalWrite(35, LOW); digitalWrite(36, LOW); digitalWrite(37, LOW); } if (byteL == 0x04){ digitalWrite(22, LOW); digitalWrite(23, LOW); digitalWrite(24, HIGH); digitalWrite(25, LOW); digitalWrite(26, LOW); digitalWrite(27, LOW); digitalWrite(28, LOW); digitalWrite(29, LOW); digitalWrite(30, LOW); digitalWrite(31, LOW); digitalWrite(32, LOW); digitalWrite(33, LOW); digitalWrite(34, LOW); digitalWrite(35, LOW); digitalWrite(36, LOW); digitalWrite(37, LOW); } Serial.print("register " ); Serial.print(byteH, HEX );Serial.print(" ");Serial.println(byteL, HEX ); // 1-будем передавать команду //digitalWrite(RDX, 1); // порт дисплея в режим приема *************** digitalWrite(DCX, 0); // для передачи команды в дисплей, а не данных wrx_u(); // дергаем WRITE вверх // 2-будем принимать данные port_in(); // порт ардуины на вход digitalWrite(DCX, 1); // работаем теперь с данными, а не с командой digitalWrite(WRX, 1); rdx_u(); // дергаем RD и получаем данные Serial.print("1 Parameter " ); Serial.print(byteH,HEX);Serial.print(" ");Serial.println(byteL, HEX); rdx_u(); Serial.print("2 Parameter " ); Serial.print(byteH,HEX);Serial.print(" ");Serial.println(byteL, HEX); rdx_u(); Serial.print("3 Parameter " ); Serial.print(byteH,HEX);Serial.print(" ");Serial.println(byteL, HEX); rdx_u(); Serial.print("4 Parameter " ); Serial.print(byteH,HEX);Serial.print(" ");Serial.println(byteL, HEX); rdx_u(); Serial.print("5 Parameter " ); Serial.print(byteH,HEX);Serial.print(" ");Serial.println(byteL, HEX); rdx_u(); Serial.print("6 Parameter " ); Serial.print(byteH,HEX);Serial.print(" ");Serial.println(byteL, HEX); Serial.println(""); }Из дисплея ничего не читает. Пины DB7-0 подключал к пинам 37-30 ардуины.
так то правильно перевод байтов на пины и обратно, молодец,(точность не проверял, но принцип вы точно уловили) так мне кажется проще для DUE (можно и ещё упростить чтение с пинов используя операции сдвига в байте - эт для заядлых разбирающихся в С++, я начинал с программирования на ассемблере, С++ для меня тяжко, надо постоянно в нём быть, чтоб помнить что к чему).
Как вариант , можно ещё глянуть как пересылает UTFT 8ми битные байты (H+L) в 32х разрядные для DUE , в файлике ...Arduino\libraries\UTFT\hardware\arm\HW_SAM3X8E.h
.... case 8: #if defined(CTE_DUE_SHIELD) || defined(EHOUSE_DUE_SHIELD) REG_PIOC_CODR=0xFF000; REG_PIOC_SODR=(VH<<12) & 0xFF000; pulse_low(P_WR, B_WR); REG_PIOC_CODR=0xFF000; REG_PIOC_SODR=(VL<<12) & 0xFF000; pulse_low(P_WR, B_WR); #else REG_PIOA_CODR=0x0000C000; REG_PIOD_CODR=0x0000064F; REG_PIOA_SODR=(VH & 0x06)<<13; (VH & 0x01) ? REG_PIOB_SODR = 0x4000000 : REG_PIOB_CODR = 0x4000000; REG_PIOD_SODR=((VH & 0x78)>>3) | ((VH & 0x80)>>1); pulse_low(P_WR, B_WR); REG_PIOA_CODR=0x0000C000; REG_PIOD_CODR=0x0000064F; REG_PIOA_SODR=(VL & 0x06)<<13; (VL & 0x01) ? REG_PIOB_SODR = 0x4000000 : REG_PIOB_CODR = 0x4000000; REG_PIOD_SODR=((VL & 0x78)>>3) | ((VL & 0x80)>>1); pulse_low(P_WR, B_WR); #endif break; case 16: #if defined(CTE_DUE_SHIELD) REG_PIOC_CODR=0xFF1FE; REG_PIOC_SODR=(VL<<1) & 0x1FE; REG_PIOC_SODR=(VH<<12) & 0xFF000; #elif defined(EHOUSE_DUE_SHIELD) PIOC->PIO_ODSR = ((PIOC->PIO_ODSR&(~0x000FF3FC)) | ((((uint32_t)VL)<<2) | (((uint32_t)VH)<<12))); #else REG_PIOA_CODR=0x0000C080; REG_PIOC_CODR=0x0000003E; REG_PIOD_CODR=0x0000064F; REG_PIOA_SODR=((VH & 0x06)<<13) | ((VL & 0x40)<<1); (VH & 0x01) ? REG_PIOB_SODR = 0x4000000 : REG_PIOB_CODR = 0x4000000; REG_PIOC_SODR=((VL & 0x01)<<5) | ((VL & 0x02)<<3) | ((VL & 0x04)<<1) | ((VL & 0x08)>>1) | ((VL & 0x10)>>3); REG_PIOD_SODR=((VH & 0x78)>>3) | ((VH & 0x80)>>1) | ((VL & 0x20)<<5) | ((VL & 0x80)<<2); #endif pulse_low(P_WR, B_WR); break; case LATCHED_16: asm("nop"); // Mode is unsupported break; .....через установку побитно 0 и 1 в 32х разрядном байте DUE , для попадания на нужные пины по плате. Но эт для скорости вывода такая припарка из-за разбросанности пинов порта по плате. Для чтения ID скорость не важна.
Проще посылать в сериал монитор и смотреть там, зачем приляпывать экран для вывода ID , хотя и 4х строчный на ST7920 . Вторая читалка выдаёт очень много инфы , по многим часто встречающимся адресам, поэтому внешний дисплей не покажет это всё сразу. Первая читалка(с первого сообщения) только по нулевому адресу, поэтому там и внешний экран для вывода.
И так, у вас дисплей только с 8ми битной шиной http://arduino.ru/forum/apparatnye-voprosy/arduino-i-displei-ot-sotikov-mobilnykh-telefonov#comment-162948 , распиновка 99% известна (если есть ещё возможность, то скиньте качественные фото шлейфа с 2х сторон и платы где он стоял, на какойнибудь бесплатный без регистрации фотохостинкг типа ipicture.ru http://fastpic.ru/ http://radikal.ru/ ) . Есть Мега (но нужны резисторы и стабилитрон, чтобы уровни через резисторы не пересиливали питание) , и DUE (не нужно согласование),
Вижу 2 варианта запустить ваш неизвестный дисплей на DUE.
1.способ вероятность 70% , перебиранием инициализаций UTFT
пока ваше подключение не проверял, но надо подключить как указано в UTFT_Requirements.pdf , на стр2 есть табличка , 6-е уточнение - для 8ми битного дисплея DB0-DB7 на земле, тогда подключать к пинам D22...D29 (начиная с младшего заканчивая старшим, в вашем случае соответственно дисплейные DB10...DB17 , т.е. D22 DUE подключаем к DB10 дисплейному и т.д.) . на RD подаем лог1 (+3,3в). Далее убеждаемся что в файле memorysaver.h все disable иницициализаций закоментированы. Далее в файле UTFT.cpp меняем byte dtm[] = {16, .... , SERIAL_5PIN}; на все "8" byte dtm[] = {8, .... , 8}; , т.е. перестраиваем все режимы на 8бит . ( word dsx[] = и word dsy[] пока необязательно, главно пока угадать инициализацию) Далее открываем пример, к примеру UTFT\examples\Arduino (ARM) + Teensy\UTFT_Demo_400x240 (можно под лупой разглядеть пиксели на экране на сантиметр и примерно прикинуть его разрешение) и перебираем UTFT myGLCD(ITDB32WD,38,39,40,41); 32 раза от UTFT myGLCD(0,38,39,40,41); до UTFT myGLCD(31,38,39,40,41); загружая в ардуино , и ожидая около 5 секунд на какой инициализации что появится на экране. Если экран хоть немного сменит яркость - эт тоже хорошо(дисплей проснулся, заработали преобразователи для питания ЖК матрицы), значит инициализация немного подходит к семейству его контроллера. Ну а в лучшем случае появится тест на экране.
И обязательно попробовать UTFT_v2.77b2_uno_ili9327_8bit_turbo либу из соседней ветки 3.5", на Уно подключается как адафруитский шилд (DB0-DB7 к D8,D9,D2-D7) , на меге к портуС (D37-D30) . Ибо с некоторыми контоллерами дисплеев в режиме 8бит надо немного по другому общаться. В этой либе по умолчанию настроен №31 инит - ili9327, но можно подменять закидывая в папку UTFT_\tft_drivers\ili9327_8 другие иниты и установки.
2.способ вероятность 99,9% , считать ID, и использовать его инициализацию в UTFT, если в ней не окажется , то запросто найти в инете и подменить схожую в UTFT.
либо а). переделать первую читалку согласно пинам DUE , и перебрать все самые распространённые регистры где может лежать ID .
либо б). лучше также переделать вторую читалку, + возможно её прийдётся переделать на 8 бит (добавляется ещё дерганье WR для пересылки второго 8бит для 16ти битной инфы , и дерганье RD для принятия второго 8битного 16ти битной инфы) , хотя вроде в дисплеях у которых адрес не лежит в 0x00 адресе, и так адрес(регистр) 8ми битный. Или мож там просто предусмотреть переключение PORTA и PORTC между собой, ибо при переключении разных контроллеров с 16 на 8 бит, у них эти 8бит оказываются у кого на PORTA, у кого на PORTC (речь о Меге).
посмотреть к примеру можно скачать даташит ili9488 стр.40-42 , на 40стр показано запись и чтение в 8ми битном режиме "DBI Type B 8-bit". на 41-42 графики записи чтения 16ти битного режима , надо только добавить дерганье соответственно WR и RD для отправки/получения второго и последующего 8ми битного байта. Что-то мне помниться оно немного иное чем для контроллеров у которых ID лежит по 0x00 адресу.
// 8битные дисплеи вторая читалка хорошо читает, если у них ID лежит в 0x00 адресе(регистре). Если в других регистрах, надо время тестить проверять/допиливать на 8бит на DUE(у меня её нет). Если будете переделывать первую читалку, то проверте в ней чтоб правильно устанавливались лог. уровни управляющих сигналов согласно графикам записи чтения , а то я сомневаюсь там в правильности. Вторую читалку переделывать/проверять на 8бит пока у меня нет ни надобности(все дисплеи что мне попадаются, имеют возможность 16ти битного режима) ни самого главного - времени.
//// 1. сделайте 1 способ. 2. когда будете добивать второй способ , то там для 8ми битов надо оставить только их ,
без того что должно падать во второй порт PORTA на другие пины, ибо если вторая читалка ничего не вычитала (лог сериал монитора надо было приложить, подключение D37пин меги/дуе младший бит к младшему биту вашего дисплея D10 и т.д.) , то скорее всего у вас контроллер у которого ID не по 0x00 адресу, пилите вторую читалку, выложите что она ответила в сериал монитор. т.е. выложите что отвечает в сериал монитор переделанная вторая читалка без убирания старшего байта, и с убиранием работы со старшим байтом (пины 29-22).
Спасибо за помощь! С программой сегодня уже не успею, скорее всего завтра- послезавтра. Надеюсь на следующей неделе выбраться в город и купить резисторы, что бы попробовать с Мегой (если не получится с ДУЕ).
Вот ссылки на фото дисплея и схемы от телефона:
А вот что выдает 2-я программа чтения ИД:
start... UTFT normal pin29-22(PORTA)-byteH(DB15-0) , pin37-30(PORTC)-byteL(DB7-0) register 00h for ILI9320(9320), ILI9325(9325), ILI9326(9326), SSD1289(1289,8989) HX8347D(047), HX8347G(075), HX8352A(052), HX8352B(065), HX8352C(072) R61509V(B509), R61505W(C505), SPFD5420A(5408) if (0 93 0 27) -> 8bit . if (93 27 93 27) -> 16bit register 0 0 1 Parameter 0 0 2 Parameter 0 0 3 Parameter 0 0 4 Parameter 0 0 5 Parameter 0 0 6 Parameter 0 0 register EFh for ILI9327(0 02 04 93 27 FF), register 0 EF 1 Parameter EF 0 2 Parameter EF 0 3 Parameter EF 0 4 Parameter EF 0 5 Parameter EF 0 6 Parameter EF 0 register BFh for ILI9481(0 0 94 81 xx xx) register 0 BF 1 Parameter BF 0 2 Parameter BF 0 3 Parameter BF 0 4 Parameter BF 0 5 Parameter BF 0 6 Parameter BF 0 register D3h for ILI9488(0 0 94 88 xx xx) register 0 D3 1 Parameter D3 0 2 Parameter D3 0 3 Parameter D3 0 4 Parameter D3 0 5 Parameter D3 0 6 Parameter D3 0 register 04h for HX8357(?DA-DC), HX8353(?80-85), register 0 4 1 Parameter 4 0 2 Parameter 4 0 3 Parameter 4 0 4 Parameter 4 0 5 Parameter 4 0 6 Parameter 4 0Начал читать UTFT_Requirements.pdf, немного не понятно: написанно что для 8-ми битного режима пины DB0-DB7 (подключенные к D37-D30) нужно подключить к земле. Соответственно в 8-ми битном режиме используются только старшие пины DB8-DB15 (подключенные к D22-D29). Но на дисплее только младшие пины DB0-DB7. Получается их нужно поставить на место старших? Так? Что-то я сегодня устал и немного торможу...
forfrends, покажи пожалуйста подробную схему подключения... если можно все.. и весь код? у меня тоже несколько экранчиков есть но на них практически нет информации... есть информация более менее на экранчик от k750i... но вот с чего начать не знаю.... боюсь что спалить..
говорил D10-D17 эт по распиновке http://arduino.ru/forum/apparatnye-voprosy/arduino-i-displei-ot-sotikov-mobilnykh-telefonov#comment-163168 , да их можно как вы DB8-DB15 обзываете.
Точно, извиняюсь ,ошибся, (исправил по возможности), при дисплеях 8бит надо подключать к меге/дуе D22-D29 а не к D30-37. Т.е. у вас младшим битом DB8 к младшему D22 и т.д.
цветной мусор это очень хорошо. это значит дисплей работает, выводится на экран что в видеоОЗУ в контроллере при включении оказалось , значит либо неработает только очистка экрана, м.б. из-за большой скорости дуе, экран не успел отработать или попробуйте перевернуть подключение DB8..DB15 на DB15..DB8 (крайне редко встречал когда распиновка зеркальна была в отличии как на схеме распиновки), либо у UTFT не оказалось нужной инициализации, без чтения ID не обойтись.
// судя по фоткам дорожек в шлейфе и в какой очередности они заходят в стекло, можно попробовать перевернуть DB8..DB15 на зеркально DB15..DB8 и снова прогнать все иниты в UTFT
и попробуйте ещё с прямым и зеркальным подключением инит от ili9488, https://yadi.sk/d/eO7CXOMQkpdYV (файлы из папки UTFT\tft_drivers\ili9486 закиньте в свою UTFT\tft_drivers\ili9486 , вызов UTFT myGLCD(28,38,39,40,41); )
если не поможет, пробуйте вычитать ID, скиньте свою переделку под дуе на 8 бит, проверю на меге (отвечать изменять буду на старые свои сообщения уже заблокированные для изменения, чтоб у вас был доступ отредактировать свое последнее, чтоб не засирать ветку новыми сообщениями)
Пробую вариант 2. Пересмотрел код из первого поста, вроде все верно, но я могу и ошибаться.
// программа для определения ID контроллера дисплея, подключать все 16бит // (эт чтоб найти старшие биты , ибо в большинстве случаев именно они используются для 8ми битного режима) // // в верхней строчке покажет 16 бит ответа с дисплея , начиная со старшего бита // в нижней строчке в HEX коде старший и младший байты. (для ILI контроллеров это будет 9325, 9320, 9327,...) // при угадывании правильного подключения шины данных дисплея должно получиться к примеру: // 1я строчка: 1001 0011 0010 0101 // 2я строчка: 9 3 2 5 ,т.е. это контроллер ILI9325 // подсветку дисплея через ом~20-30 к +5v, питание дисплея от ардуиновских 3.3v (если надо то занизить стабилитроном // или стабилизатором до 2.8v - т.к. иногда инициализации дисплеев приводятся для 2.8v - там константы напряжений // для правильной работы ЖК матрицы) // // выводы дисплея желательно подключать через резист. делители к примеру 10к+22к , на крайняк тупо через 10к, // но тогда на питание диспл. посадить стабилитрон 3,0-3,1v и запитывать через резист. ом~20-30 от +3,3v, // иначе дисплей запитается через выводы и ~4-5v пересилят ардуиновские +3,3v // // выводы подключать стандартно UTFT на arduino mega RS(CD),WR, CS, RST // Standard Arduino Mega/Due shield : <display model>,38, 39, 40, 41 // CTE TFT LCD/SD Shield for Arduino Mega : <display model>,38, 39, 40, 41 // //выводы ардуино меги 22-29 к предполагаемым выводам дисплея DB8-DB15 //выводы ардуино меги 30-37 к предполагаемым выводам дисплея DB8-DB0 // и дополнительно, для получения ответа от дисплея, необходимо // к выв. ардуино меги 42 подключить вывод RD дисплея. (по умолчанию на шилдах он кинут на +3.3v) // Дисплей 1602, выводы VSS, VDD, RS, E, D4, D5, D6, D7 // к выводам ардуино меги GND, +5v, 13, 12, 11, 10, 9, 8 // помним на дисплее поставить резистор 3,3к между VO и VSS(+) , RW замкнуть на VSS(+), подключить A и K к VSS(+) и VDD #include "U8glib.h" //#include <LiquidCrystal.h> #define CD_Pin 38 // (RS) #define WR_Pin 39 #define CS_Pin 40 #define RST_Pin 41 #define RD_Pin 42 U8GLIB_ST7920_128X64_4X u8g(48, 47, 49); // SPI Com: SCK = En = 18, MOSI = rw = 16, CS=RS=di= 17 //LiquidCrystal lcd(13, 12, 11, 10, 9, 8); int i; byte byteH; byte byteL; void draw(void) { // graphic commands to redraw the complete screen should be placed here u8g.setFont(u8g_font_unifont); //lcd.begin(16, 2); digitalWrite(RST_Pin, 0); // удержание в сбросе дисплея digitalWrite(CS_Pin, 1); // деактивация диспл. (отключение его шины данных DB0..DB15) digitalWrite(RST_Pin, 0); // сброс дисплея //for (i=22; i<=42;i++) { digitalWrite(i, 0); } // всё лог.0 for (i=22; i<=42;i++) { pinMode(i, OUTPUT); } // конфиг всех пинов на выход + управляющие пины digitalWrite(RST_Pin, 1); // вывод дисплея из сброса delay(5); digitalWrite(RST_Pin, 0); // удержание в сбросе дисплея delay(15); digitalWrite(RST_Pin, 1); delay(500); // запишем команду digitalWrite(RD_Pin, 1); // уст. порта дисплея на приём (ввод данных в дисплей) digitalWrite(CD_Pin, 0); // будем работать 0-команда 1-данные digitalWrite(CS_Pin, 0); // выбор дисплея (активация) //PORTA=0x00; PORTC=0x00; // это команда для считывания ID дисплея =0x00 for (i=22; i<=37;i++) { digitalWrite(i, LOW); } // digitalWrite(WR_Pin, 1); // дёргаем WR digitalWrite(WR_Pin, 0); digitalWrite(CS_Pin, 1); // деактивация диспл. (отключение его шины данных DB0..DB15) //чтение данных //DDRA=0x00; DDRC=0x00; // или for (i=22; i<=37;i++) { pinMode(i, INPUT); } // конфиг всех пинов на вход for (i=22; i<=37;i++) { digitalWrite(i, LOW); } digitalWrite(RD_Pin, 0); // уст. порта дисплея на передачу (вывод данных с дисплея) digitalWrite(CD_Pin, 1); // будем работать с 0-команда 1-данные digitalWrite(CS_Pin, 0); // выбор дисплея (активация ) digitalWrite(WR_Pin, 1); // дёргаем WR digitalWrite(WR_Pin, 0); u8g.setPrintPos(0, 10); byteH=0; if ( digitalRead(29) ) { byteH=byteH+128; u8g.print(1); } else u8g.print(0); if ( digitalRead(28) ) { byteH=byteH+64; u8g.print(1); } else u8g.print(0); if ( digitalRead(27) ) { byteH=byteH+32; u8g.print(1); } else u8g.print(0); if ( digitalRead(26) ) { byteH=byteH+16; u8g.print(1); } else u8g.print(0); if ( digitalRead(25) ) { byteH=byteH+8; u8g.print(1); } else u8g.print(0); if ( digitalRead(24) ) { byteH=byteH+4; u8g.print(1); } else u8g.print(0); if ( digitalRead(23) ) { byteH=byteH+2; u8g.print(1); } else u8g.print(0); if ( digitalRead(22) ) { byteH=byteH+1; u8g.print(1); } else u8g.print(0); byteL=0; if ( digitalRead(30) ) { byteL=byteL+128; u8g.print(1); } else u8g.print(0); if ( digitalRead(31) ) { byteL=byteL+64; u8g.print(1); } else u8g.print(0); if ( digitalRead(32) ) { byteL=byteL+32; u8g.print(1); } else u8g.print(0); if ( digitalRead(33) ) { byteL=byteL+16; u8g.print(1); } else u8g.print(0); if ( digitalRead(34) ) { byteL=byteL+8; u8g.print(1); } else u8g.print(0); if ( digitalRead(35) ) { byteL=byteL+4; u8g.print(1); } else u8g.print(0); if ( digitalRead(36) ) { byteL=byteL+2; u8g.print(1); } else u8g.print(0); if ( digitalRead(37) ) { byteL=byteL+1; u8g.print(1); } else u8g.print(0); u8g.setPrintPos(0, 30); u8g.print("ID display: "); u8g.print(byteH, HEX); u8g.setPrintPos(0, 50); u8g.print(byteL, HEX); digitalWrite(CS_Pin, 1); // деактивация диспл. (отключение шины данных DB0..DB15) //DDRA=0xFF; DDRC=0xFF; // или for (i=22; i<=37;i++) { pinMode(i, OUTPUT); } // конф. шины данных ARDUINO на выход digitalWrite(RD_Pin, 1); // уст. порта дисплея на приём (ввод данных в дисплей) //digitalWrite(RST_Pin, 1); // вставка для UTFT // pinMode(42, OUTPUT); // конф.ардуино для RD на выход // digitalWrite(42, 1); // уст. RD=1 - чтобы порт дисплея был на приём (ввод данных в дисплей) //delay(100); } void setup(void) { // flip screen, if required // u8g.setRot180(); u8g.firstPage(); do { draw(); } while( u8g.nextPage() ); } void loop() { // put your main code here, to run repeatedly: }Единственное что я не делал: в коментарии к коду написанно RW замкнуть на VSS(+), я этого не делал так как RW используется в коде, и если замкнуть на + то никакие команды по этому пину не пойдут. Результат тот же что и раньше - одни нули. Мне кажется что просто код неправильно переведен под ДУЕ.
А вот вариант Б с переделкой 2-й читалки под 8 бит - для меня это пока что высшая математика. Вроде все просто объяснено, но я сам это не смогу сделать - не хватает знаний.
Кстати, меня терзают сомнения по поводу правильности моего перевода 2-й читалки. Особенно перевода 0x00, 0xEF и др... Мне кажется я мог биты в обратном порядке написать, но как проверить - не знаю.
..... что я не делал: в коментарии к коду написанно RW замкнуть на VSS(+), я этого не делал так как RW используется в коде, и если замкнуть на + то никакие команды по этому пину не пойдут. Результат тот же что и раньше - одни нули. Мне кажется что просто код неправильно переведен под ДУЕ.
.....
млин, как могла опечатка затесаться, непонятно, бывает видимо, имелось ввиду VSS(-, GND) , речь шла о подключении 1602, чтоб выводить инфу что по 0му адресу у изучаемого дисплея.
хорошо. проверю скетч на разных дисплеях, черкну. ,// в скетче не должно быть использование
digitalRead(30) )....
digitalRead(37)дисплей же 8ми битный ))) . сейчас, погодь, посмотрю... чтобы получать второй байт нужно дергнуть RD , чтобы отправить второй байт, нужно дернуть WR ....
для одних дисплеев надо так
вот , пробуйте (протестировал на ili9325)
// читалка ID дисплеев V3.0beta только для 8ми битных дисплеев, у кого не в 00 адресе - не проверено , попробовать для них закоментить строчку //////////////////////////////////////////////////////////////// // подключить 8ми битный дисплей к Arduino Mega/Due: // DB0-7 (DB8-DB15 , DB10-DB17) , соответственно на arduino пины 22-29 ( микроконтроллера PORTA PA0-PA7 ) к примеру считать с 00D3 =>0xD3 младший // Это же подключение соответственно UTFT распиновке. #define CD_Pin 38 // (RS) //38 #define DCX 38 #define WR_Pin 39 //39 #define WRX 39 #define CS_Pin 40 //40 #define CSX 40 #define RST_Pin 41 //41 #define RSTX 41 #define RD_Pin 42 //42 __- #define RDX 42 int i=0; byte byteH; byte byteL; void setup() { Serial.begin(9600); digitalWrite(RST_Pin, 0); // удержание в сбросе дисплея digitalWrite(CS_Pin, 0); // активация шины данных дисплея (выбор кристалла ChipSelect) for (i=22; i<=42;i++) { pinMode(i, OUTPUT); } // конфиг всех пинов на выход + управляющие пины //i=22; i<=42;i++ Serial.println("start... " ); //Serial.println("UTFT normal pin29-22(PORTA)-byteH(DB15-0) , pin37-30(PORTC)-byteL(DB7-0)"); Serial.println(""); digitalWrite(RST_Pin, 1); // вывод дисплея из сброса delay(100); digitalWrite(RST_Pin, 0); // удержание в сбросе дисплея delay(100); digitalWrite(RST_Pin, 1);// вывод дисплея из сброса delay(500); rstx_u(); Serial.println("register 00h for ILI9320(9320), ILI9325(9325), ILI9326(9326), SSD1289(1289,8989)" ); Serial.println(" HX8347D(047), HX8347G(075), HX8352A(052), HX8352B(065), HX8352C(072)"); Serial.println(" R61509V(B509), R61505W(C505), SPFD5420A(5408) "); Serial.println("if (0 93 0 27) -> 8bit . if (93 27 93 27) -> 16bit " ); byteL=0x00 ; // writeCommand_read6Parameter(); rstx_u(); Serial.println("register EFh for ILI9327(0 02 04 93 27 FF), " ); byteL=0xEF ; // для ili9327 - 00 02 04 93 27 FF writeCommand_read6Parameter(); rstx_u(); Serial.println("register BFh for ILI9481(0 0 94 81 xx xx) " ); byteL=0xBF ; // для ili9481 - 00 00 94 81 xx xx writeCommand_read6Parameter(); rstx_u(); Serial.println("register D3h for ILI9488(0 0 94 88 xx xx) " ); byteL=0xD3 ; // для ili9488 - 00 00 94 88 xx xx writeCommand_read6Parameter(); rstx_u(); Serial.println("register 04h for HX8357(?DA-DC), HX8353(?80-85), " ); byteL=0x04 ; // для - xx xx writeCommand_read6Parameter(); rstx_u(); } // Г Л А В Н А Я П Р О Г Р А М М А void loop() { // put your main code here, to run repeatedly: } // П О Д П Р О Г Р А М М Ы , Ф У Н К Ц И И // RST вверх. Сброс дисплея int rstx_u() { digitalWrite(WRX, 0);digitalWrite(DCX, 0);digitalWrite(RDX, 1); digitalWrite(RSTX, 0); delay(100); digitalWrite(RSTX, 1); delay(100); } // дергаем WR вверх int wrx_u() { digitalWrite(WRX, 0); digitalWrite(WRX, 1); //digitalWrite(WRX, 0); delay(2); } // дергаем RD вниз и считываем данные int rdx_u() { //digitalWrite(RDX, 0); digitalWrite(RDX, 1); // digitalWrite(RDX, 0); digitalWrite(RDX, 1); digitalWrite(RDX, 0); // оставим в 0 , чтоб порт дисплея был на выход, // и преобразователи уровней на шилде (если они есть) тоже были на выход delay(10); //byteL=PINA; // считываем с выводов PORTA byteL=0; // PORTA считаем if ( digitalRead(29) ) byteL=byteL+128; if ( digitalRead(28) ) byteL=byteL+64; if ( digitalRead(27) ) byteL=byteL+32; if ( digitalRead(26) ) byteL=byteL+16; if ( digitalRead(25) ) byteL=byteL+8; if ( digitalRead(24) ) byteL=byteL+4; if ( digitalRead(23) ) byteL=byteL+2; if ( digitalRead(22) ) byteL=byteL+1; digitalWrite(RDX, 1); // считали, переводим дисплей обратно в режим приема инфы delay(10); } // конфигурация порта на вход int port_in() { //DDRA=0x00; DDRC=0x00; // конфиг всех пинов на вход for (i=22; i<=37;i++) { pinMode(i, INPUT); } //PORTA=0x00; PORTC=0x00; // выключение подтягивающих резисторов for (i=22; i<=37;i++) { digitalWrite(i, LOW); } } // конфигурация портов на выход int port_out() { //DDRA=0xFF; DDRC=0xFF; // конфиг всех пинов на выход for (i=22; i<=37;i++) { pinMode(i, OUTPUT); } //PORTA=0x00; PORTC=0x00; // выключение подтягивающих резисторов for (i=22; i<=37;i++) { digitalWrite(i, LOW); } } int writeCommand_read6Parameter() { // передадим команду digitalWrite(RDX, 1); // сначала порт дисплея в режим приема port_out(); // конфим ардуинку на выход // сначала передадим старший байт=00 (00 на порт уже установил port_out(); ) //for (i=22; i<=37;i++) { digitalWrite(i, LOW); } wrx_u(); /////////////////////////////////////////////////////////////////////////////////////////////// // теперь передадим младший байт // if (byteL == 0x00) { for (i=22; i<=37;i++) { digitalWrite(i, LOW); } } if (byteL == 0x00){ digitalWrite(22, LOW); digitalWrite(23, LOW); digitalWrite(24, LOW); digitalWrite(25, LOW); digitalWrite(26, LOW); digitalWrite(27, LOW); digitalWrite(28, LOW); digitalWrite(29, LOW); } if (byteL == 0xEF){ digitalWrite(22, HIGH); digitalWrite(23, HIGH); digitalWrite(24, HIGH); digitalWrite(25, HIGH); digitalWrite(26, LOW); digitalWrite(27, HIGH); digitalWrite(28, HIGH); digitalWrite(29, HIGH); } if (byteL == 0xBF){ digitalWrite(22, HIGH); digitalWrite(23, HIGH); digitalWrite(24, HIGH); digitalWrite(25, HIGH); digitalWrite(26, HIGH); digitalWrite(27, HIGH); digitalWrite(28, LOW); digitalWrite(29, HIGH); } if (byteL == 0xD3){ digitalWrite(22, HIGH); digitalWrite(23, HIGH); digitalWrite(24, LOW); digitalWrite(25, LOW); digitalWrite(26, HIGH); digitalWrite(27, LOW); digitalWrite(28, HIGH); digitalWrite(29, HIGH); } if (byteL == 0x04){ digitalWrite(22, LOW); digitalWrite(23, LOW); digitalWrite(24, HIGH); digitalWrite(25, LOW); digitalWrite(26, LOW); digitalWrite(27, LOW); digitalWrite(28, LOW); digitalWrite(29, LOW); } Serial.print("register " ); Serial.println(byteL, HEX ); // 1-будем передавать команду digitalWrite(DCX, 0); // для передачи команды в дисплей, а не данных delay(10); wrx_u(); // дергаем WRITE вверх delay(10); // 2-будем принимать данные port_in(); // порт ардуины на вход delay(10); digitalWrite(DCX, 1); // работаем теперь с данными, а не с командой delay(10); rdx_u(); // дергаем RD вниз и получаем данные Serial.print("1 Parameter " ); Serial.println(byteL, HEX); rdx_u(); Serial.print("2 Parameter " ); Serial.println(byteL, HEX); rdx_u(); Serial.print("3 Parameter " ); Serial.println(byteL, HEX); rdx_u(); Serial.print("4 Parameter " ); Serial.println(byteL, HEX); rdx_u(); Serial.print("5 Parameter " ); Serial.println(byteL, HEX); rdx_u(); Serial.print("6 Parameter " ); Serial.println(byteL, HEX); Serial.println(""); }////11.02.2016
Если ответы будут 00 EF BF D3 04 , то скорее всего забыли после использования UTFT переключить RD дисплея обратно c "+" на 42пин . И проверьте всёже на Меге. у меня с десяток разных дисплеев у которых ID по 00 адресу, эта читалка превосходно их читает. других дисплеев пока нет.
.
Мне кажется это ни на что не влияет, так это всего лишь чтение с дисплея. Просто в итоге результат пишет чуть больше чем надо (так мне кажется). Только что попробовал: убрал из программы всякое использование 30-37. Результат тот же:
#define CD_Pin 38 // (RS) #define WR_Pin 39 #define CS_Pin 40 #define RST_Pin 41 #define RD_Pin 42 int i; byte byteH; byte byteL; void setup(void) { Serial.begin(9600); digitalWrite(RST_Pin, 0); // удержание в сбросе дисплея digitalWrite(CS_Pin, 1); // деактивация диспл. (отключение его шины данных DB0..DB15) digitalWrite(RST_Pin, 0); // сброс дисплея //for (i=22; i<=42;i++) { digitalWrite(i, 0); } // всё лог.0 for (i=22; i<=42;i++) { pinMode(i, OUTPUT); } // конфиг всех пинов на выход + управляющие пины digitalWrite(RST_Pin, 1); // вывод дисплея из сброса delay(5); digitalWrite(RST_Pin, 0); // удержание в сбросе дисплея delay(15); digitalWrite(RST_Pin, 1); delay(500); // запишем команду digitalWrite(RD_Pin, 1); // уст. порта дисплея на приём (ввод данных в дисплей) digitalWrite(CD_Pin, 0); // будем работать 0-команда 1-данные digitalWrite(CS_Pin, 0); // выбор дисплея (активация) //PORTA=0x00; PORTC=0x00; // это команда для считывания ID дисплея =0x00 for (i=22; i<=22;i++) { digitalWrite(i, LOW); } // digitalWrite(WR_Pin, 1); // дёргаем WR digitalWrite(WR_Pin, 0); digitalWrite(CS_Pin, 1); // деактивация диспл. (отключение его шины данных DB0..DB15) //чтение данных //DDRA=0x00; DDRC=0x00; // или for (i=22; i<=22;i++) { pinMode(i, INPUT); } // конфиг всех пинов на вход for (i=22; i<=22;i++) { digitalWrite(i, LOW); } digitalWrite(RD_Pin, 0); // уст. порта дисплея на передачу (вывод данных с дисплея) digitalWrite(CD_Pin, 1); // будем работать с 0-команда 1-данные digitalWrite(CS_Pin, 0); // выбор дисплея (активация ) digitalWrite(WR_Pin, 1); // дёргаем WR digitalWrite(WR_Pin, 0); byteH=0; if ( digitalRead(29) ) { byteH=byteH+128; Serial.print(1); } else Serial.print(0); if ( digitalRead(28) ) { byteH=byteH+64; Serial.print(1); } else Serial.print(0); if ( digitalRead(27) ) { byteH=byteH+32; Serial.print(1); } else Serial.print(0); if ( digitalRead(26) ) { byteH=byteH+16; Serial.print(1); } else Serial.print(0); if ( digitalRead(25) ) { byteH=byteH+8; Serial.print(1); } else Serial.print(0); if ( digitalRead(24) ) { byteH=byteH+4; Serial.print(1); } else Serial.print(0); if ( digitalRead(23) ) { byteH=byteH+2; Serial.print(1); } else Serial.print(0); if ( digitalRead(22) ) { byteH=byteH+1; Serial.print(1); } else Serial.print(0); Serial.println(""); Serial.print("ID display: "); Serial.print(byteH, HEX); digitalWrite(CS_Pin, 1); // деактивация диспл. (отключение шины данных DB0..DB15) //DDRA=0xFF; DDRC=0xFF; // или for (i=22; i<=22;i++) { pinMode(i, OUTPUT); } // конф. шины данных ARDUINO на выход digitalWrite(RD_Pin, 1); // уст. порта дисплея на приём (ввод данных в дисплей) //digitalWrite(RST_Pin, 1); // вставка для UTFT // pinMode(42, OUTPUT); // конф.ардуино для RD на выход // digitalWrite(42, 1); // уст. RD=1 - чтобы порт дисплея был на приём (ввод данных в дисплей) //delay(100); } void loop() { // put your main code here, to run repeatedly: }Здраствуйте. Попался мне дисплей "CDT 128 96-002V2", дисплей от сотика, не могу найти на него нормальной информации, вроде - бы на контроллере ST7571, даташит на ST7571 нашёл но толку мало. Может кто использовал такай дисплей, подскажите.
ладно, буду писать следующие сообщения(по возможности сохраняя старые), чтоб прослеживалась последовательноость в диалоге, не в угоду конечно малостраничности темы (((
для одних дисплеев надо так: 16бит разбивается на 2 последовательных по8
на примере ili9325, для передачи адреса регистра сначала выводим старший байт ( 00 ), дергаем WR чтоб дисплей принял , потом выводим младший байт (00, или какой нужно) дергаем WR чтоб дисплей принял . Чтение тож в 2 последовательных байта (видимо м.б. и больше)
для других дисплеев на примере ili9488, регистры 8ми битные, поэтому нужен один такт WR для передачи адреса регистра, но несколько тактов, если будем записывать "параметры"(а они очень иногда глубокие, своего рода стек), и несколько тактов RD чтобы из регистра вынимать много "параметров"( последовательных байтов стека). Таким образом дстигается некоторое ускорение при записи/вычитывании байтов (не нужно передавать адрес следующего реристра, а контроллер сам инкрементирует его в пределах главного) , и уже эти "параметры" могут иметь 8/16/18 битное слово.
вот , пробуйте, накидал скетч читалка ID дисплеев V3.0beta Mega/Due (протестировал на Mega+8bit ili9325, делал не полное кажись соответствие диаграмме , но работает)
// читалка ID дисплеев V3.0beta только для 8ми битных дисплеев, у кого не в 00 адресе - не проверено , попробовать для них закоментить строчку //////////////////////////////////////////////////////////////// // подключить 8ми битный дисплей к Arduino Mega/Due: // DB0-7 (DB8-DB15 , DB10-DB17) , соответственно на arduino пины 22-29 ( микроконтроллера PORTA PA0-PA7 ) к примеру считать с 00D3 =>0xD3 младший // Это же подключение соответственно UTFT распиновке. #define CD_Pin 38 // (RS) //38 #define DCX 38 #define WR_Pin 39 //39 #define WRX 39 #define CS_Pin 40 //40 #define CSX 40 #define RST_Pin 41 //41 #define RSTX 41 #define RD_Pin 42 //42 __- #define RDX 42 int i=0; byte byteH; byte byteL; void setup() { Serial.begin(9600); digitalWrite(RST_Pin, 0); // удержание в сбросе дисплея digitalWrite(CS_Pin, 0); // активация шины данных дисплея (выбор кристалла ChipSelect) for (i=22; i<=42;i++) { pinMode(i, OUTPUT); } // конфиг всех пинов на выход + управляющие пины //i=22; i<=42;i++ Serial.println("start... " ); //Serial.println("UTFT normal pin29-22(PORTA)-byteH(DB15-0) , pin37-30(PORTC)-byteL(DB7-0)"); Serial.println(""); digitalWrite(RST_Pin, 1); // вывод дисплея из сброса delay(100); digitalWrite(RST_Pin, 0); // удержание в сбросе дисплея delay(100); digitalWrite(RST_Pin, 1);// вывод дисплея из сброса delay(500); rstx_u(); Serial.println("register 00h for ILI9320(9320), ILI9325(9325), ILI9326(9326), SSD1289(1289,8989)" ); Serial.println(" HX8347D(047), HX8347G(075), HX8352A(052), HX8352B(065), HX8352C(072)"); Serial.println(" R61509V(B509), R61505W(C505), SPFD5420A(5408) "); byteL=0x00 ; // writeCommand_read6Parameter(); rstx_u(); Serial.println("register EFh for ILI9327(0 02 04 93 27 FF), " ); byteL=0xEF ; // для ili9327 - 00 02 04 93 27 FF writeCommand_read6Parameter(); rstx_u(); Serial.println("register BFh for ILI9481(0 0 94 81 xx xx) " ); byteL=0xBF ; // для ili9481 - 00 00 94 81 xx xx writeCommand_read6Parameter(); rstx_u(); Serial.println("register D3h for ILI9488(0 0 94 88 xx xx) " ); byteL=0xD3 ; // для ili9488 - 00 00 94 88 xx xx writeCommand_read6Parameter(); rstx_u(); Serial.println("register 04h for HX8357(?DA-DC), HX8353(?80-85), " ); byteL=0x04 ; // для - xx xx writeCommand_read6Parameter(); rstx_u(); } // Г Л А В Н А Я П Р О Г Р А М М А void loop() { // put your main code here, to run repeatedly: } // П О Д П Р О Г Р А М М Ы , Ф У Н К Ц И И // RST вверх. Сброс дисплея int rstx_u() { digitalWrite(WRX, 0);digitalWrite(DCX, 0);digitalWrite(RDX, 1); digitalWrite(RSTX, 0); delay(100); digitalWrite(RSTX, 1); delay(100); } // дергаем WR вверх int wrx_u() { digitalWrite(WRX, 0); digitalWrite(WRX, 1); //digitalWrite(WRX, 0); delay(2); } // дергаем RD вниз и считываем данные int rdx_u() { //digitalWrite(RDX, 0); digitalWrite(RDX, 1); // digitalWrite(RDX, 0); digitalWrite(RDX, 1); digitalWrite(RDX, 0); // оставим в 0 , чтоб порт дисплея был на выход, // и преобразователи уровней на шилде (если они есть) тоже были на выход delay(10); //byteL=PINA; // считываем с выводов PORTA byteL=0; // PORTA считаем if ( digitalRead(29) ) byteL=byteL+128; if ( digitalRead(28) ) byteL=byteL+64; if ( digitalRead(27) ) byteL=byteL+32; if ( digitalRead(26) ) byteL=byteL+16; if ( digitalRead(25) ) byteL=byteL+8; if ( digitalRead(24) ) byteL=byteL+4; if ( digitalRead(23) ) byteL=byteL+2; if ( digitalRead(22) ) byteL=byteL+1; digitalWrite(RDX, 1); // считали, переводим дисплей обратно в режим приема инфы delay(10); } // конфигурация порта на вход int port_in() { //DDRA=0x00; DDRC=0x00; // конфиг всех пинов на вход for (i=22; i<=37;i++) { pinMode(i, INPUT); } //PORTA=0x00; PORTC=0x00; // выключение подтягивающих резисторов for (i=22; i<=37;i++) { digitalWrite(i, LOW); } } // конфигурация портов на выход int port_out() { //DDRA=0xFF; DDRC=0xFF; // конфиг всех пинов на выход for (i=22; i<=37;i++) { pinMode(i, OUTPUT); } //PORTA=0x00; PORTC=0x00; // выключение подтягивающих резисторов for (i=22; i<=37;i++) { digitalWrite(i, LOW); } } int writeCommand_read6Parameter() { // передадим команду digitalWrite(RDX, 1); // сначала порт дисплея в режим приема port_out(); // конфим ардуинку на выход // сначала передадим старший байт=00 (00 на порт уже установил port_out(); ) //for (i=22; i<=37;i++) { digitalWrite(i, LOW); } wrx_u(); /////////////////////////////////////////////////////////////////////////////////////////////// // теперь передадим младший байт // if (byteL == 0x00) { for (i=22; i<=37;i++) { digitalWrite(i, LOW); } } if (byteL == 0x00){ digitalWrite(22, LOW); digitalWrite(23, LOW); digitalWrite(24, LOW); digitalWrite(25, LOW); digitalWrite(26, LOW); digitalWrite(27, LOW); digitalWrite(28, LOW); digitalWrite(29, LOW); } if (byteL == 0xEF){ digitalWrite(22, HIGH); digitalWrite(23, HIGH); digitalWrite(24, HIGH); digitalWrite(25, HIGH); digitalWrite(26, LOW); digitalWrite(27, HIGH); digitalWrite(28, HIGH); digitalWrite(29, HIGH); } if (byteL == 0xBF){ digitalWrite(22, HIGH); digitalWrite(23, HIGH); digitalWrite(24, HIGH); digitalWrite(25, HIGH); digitalWrite(26, HIGH); digitalWrite(27, HIGH); digitalWrite(28, LOW); digitalWrite(29, HIGH); } if (byteL == 0xD3){ digitalWrite(22, HIGH); digitalWrite(23, HIGH); digitalWrite(24, LOW); digitalWrite(25, LOW); digitalWrite(26, HIGH); digitalWrite(27, LOW); digitalWrite(28, HIGH); digitalWrite(29, HIGH); } if (byteL == 0x04){ digitalWrite(22, LOW); digitalWrite(23, LOW); digitalWrite(24, HIGH); digitalWrite(25, LOW); digitalWrite(26, LOW); digitalWrite(27, LOW); digitalWrite(28, LOW); digitalWrite(29, LOW); } Serial.print("register " ); Serial.println(byteL, HEX ); // 1-будем передавать команду digitalWrite(DCX, 0); // для передачи команды в дисплей, а не данных delay(10); wrx_u(); // дергаем WRITE вверх delay(10); // 2-будем принимать данные port_in(); // порт ардуины на вход delay(10); digitalWrite(DCX, 1); // работаем теперь с данными, а не с командой delay(10); rdx_u(); // дергаем RD вниз и получаем данные Serial.print("1 Parameter " ); Serial.println(byteL, HEX); rdx_u(); Serial.print("2 Parameter " ); Serial.println(byteL, HEX); rdx_u(); Serial.print("3 Parameter " ); Serial.println(byteL, HEX); rdx_u(); Serial.print("4 Parameter " ); Serial.println(byteL, HEX); rdx_u(); Serial.print("5 Parameter " ); Serial.println(byteL, HEX); rdx_u(); Serial.print("6 Parameter " ); Serial.println(byteL, HEX); Serial.println(""); }Спасибо за пример! Правда мне све это еще сложно понять, точнее сложно понять согласование таймингов. Это так, к слову.
Попробовал ваш код, оба раза ответа не было. Потом появилась мысль немного увеличить задержки. Поменял delay(10) на delay(50). В результате в регистре "0" появилось "10". wrx_u(); - закоментированна.
start... register 00h for ILI9320(9320), ILI9325(9325), ILI9326(9326), SSD1289(1289,8989) HX8347D(047), HX8347G(075), HX8352A(052), HX8352B(065), HX8352C(072) R61509V(B509), R61505W(C505), SPFD5420A(5408) register 0 1 Parameter 0 2 Parameter 0 3 Parameter 0 4 Parameter 0 5 Parameter 0 6 Parameter 10 register EFh for ILI9327(0 02 04 93 27 FF), register EF 1 Parameter EF 2 Parameter EF 3 Parameter EF 4 Parameter EF 5 Parameter EF 6 Parameter EF register BFh for ILI9481(0 0 94 81 xx xx) register BF 1 Parameter BF 2 Parameter BF 3 Parameter BF 4 Parameter BF 5 Parameter BF 6 Parameter BF register D3h for ILI9488(0 0 94 88 xx xx) register D3 1 Parameter D3 2 Parameter D3 3 Parameter D3 4 Parameter D3 5 Parameter D3 6 Parameter D3 register 04h for HX8357(?DA-DC), HX8353(?80-85), register 4 1 Parameter 4 2 Parameter 4 3 Parameter 4 4 Parameter 4 5 Parameter 4 6 Parameter 4После поднятия задержек до "100" картина совсем изменилась:
start... register 00h for ILI9320(9320), ILI9325(9325), ILI9326(9326), SSD1289(1289,8989) HX8347D(047), HX8347G(075), HX8352A(052), HX8352B(065), HX8352C(072) R61509V(B509), R61505W(C505), SPFD5420A(5408) register 0 1 Parameter 0 2 Parameter 0 3 Parameter 10 4 Parameter 7E 5 Parameter 7F 6 Parameter FF register EFh for ILI9327(0 02 04 93 27 FF), register EF 1 Parameter EF 2 Parameter EF 3 Parameter EF 4 Parameter EF 5 Parameter FF 6 Parameter FF register BFh for ILI9481(0 0 94 81 xx xx) register BF 1 Parameter BF 2 Parameter BF 3 Parameter BF 4 Parameter BF 5 Parameter FF 6 Parameter FF register D3h for ILI9488(0 0 94 88 xx xx) register D3 1 Parameter D3 2 Parameter D3 3 Parameter D3 4 Parameter FF 5 Parameter FF 6 Parameter FF register 04h for HX8357(?DA-DC), HX8353(?80-85), register 4 1 Parameter 4 2 Parameter 4 3 Parameter 54 4 Parameter 7F 5 Parameter FF 6 Parameter FFМне кажется что это не ответ а просто ошибки чтения из-за сильно больших пауз
Не пробавали написать код не в IDE arduino, а в Keil. По началу трудновато конечно, а потом как по маслу. Пройдены варианты и по SPI и с 8 и 16 бит шинами. И вот еще вопрос, как вы при инициализации управляете RESET-ом? Можно просто подключить к цепи сброса процессора, у меня так работает, экономит целый пин I/O.
diger67, Вариант, как по мне хороший, но подходит только для уже готового подключения и опознанного контроллера. Если же дисплей не опознан и нужно прочитать его ИД, то такой вариант не подходит, так как Ресет используется в процессе.
slider, наконец-то купил резисторы! Тодключил к Меге. Протестировал. Читалка из первого поста выдает одни нули. Читалки №2 и №3 вернули один и тот же ответ:
start... register 00h for ILI9320(9320), ILI9325(9325), ILI9326(9326), SSD1289(1289,8989) HX8347D(047), HX8347G(075), HX8352A(052), HX8352B(065), HX8352C(072) R61509V(B509), R61505W(C505), SPFD5420A(5408) register 0 1 Parameter 0 2 Parameter 0 3 Parameter 0 4 Parameter 0 5 Parameter 0 6 Parameter 0 register EFh for ILI9327(0 02 04 93 27 FF), register EF 1 Parameter 0 2 Parameter 0 3 Parameter 0 4 Parameter 0 5 Parameter 0 6 Parameter 0 register BFh for ILI9481(0 0 94 81 xx xx) register BF 1 Parameter FF 2 Parameter 74 3 Parameter 0 4 Parameter 0 5 Parameter 0 6 Parameter 0 register D3h for ILI9488(0 0 94 88 xx xx) register D3 1 Parameter 0 2 Parameter 0 3 Parameter 86 4 Parameter 0 5 Parameter 0 6 Parameter 0 register 04h for HX8357(?DA-DC), HX8353(?80-85), register 4 1 Parameter 54 2 Parameter 66 3 Parameter 0 4 Parameter 0 5 Parameter 0 6 Parameter 0Что можете сказать по этому поводу? Это типа у меня контроллер дисплея HX5466 или ILI8600 или ...? Что выдала читалка?
о, эт хорошо, что к меге, через резисторы, и ответ нормальный виден, и видно что не по 0му адресу у него ID. Из широкораспространеных адресов пока не понятно. Недавно диспл. от sony ericsson копал, так там вообще распиновка на 1бит оказалось сдвинута, не как по схеме. Еле запустил, пока не проверил что неспользованный пин лог.1/0 выдавал, он оказался вхож в нужные 8бит/пин. Эт я к тому что можно попробовать прикинуть какой ответ бы был, если зеркально перевернуть биты, или мож проще физически перевернуть и глянуть что выдаст. Вечерком с ноута скину читалку, сделал чтение всех подряд регистров с 0 по 255 (00 - FF ) // эт проще в меге счетчик for и кидаем это наращивание в порт PORTA, для дуе вообще мутно побитно получилось бы.
Так с некоторых дисплеев видно было, в регистрах попадалось разрешение контроллера (дисплея) 00EF 01AF 013F (240x432 x320) , ну и ID тож.
Проконтролируйте ещё напр. 3,3в , оно не должно быть выше, особенно когда запускались схожие иниты UTFT, когда был виден цветной мусор. Если есть время, можете прогнать теперь уже на меге иниты UTFT.
Для питания дисплея пока остановился на резисторе 100-150 Ом от 5в и стабилитроне 3.0 в с параллельно smd кондером 4-10мкф. (ибо если делать 300 Ом то при запуске инита, питание может просесть ниже 2,8в . И если ставить стабилитрон 3,3в, то без инита напряжение может подняться аж до 3,6в , а для контроллеров это уже критично) . Если ещё параллельно стабилитрону подключить, для опыта, белый светодиод , то по маленькому снижению его яркости можно судить о возможной подходящего инита(инициализации), что заработали внутренние преобразователи для питания ЖК матрицы. Если хорошо притухнет, эт плохо, значит было перенапряжение на дисплее и преобразователи скончались. хотя ID, перед запуском инита вычитывается правильно, типа как контроллер рабочий. Но в ваше случае всё живое 99,9% , ведь виден цветной мусор на некоторых инитах.
В вашем случае на меге можно запитать от меговских 3,3в и параллельно какую нить нагрузку кинуть, типа стабилитрона 3,3в.
И прикиньте примерно сколько у него разрешение, как, писал выше, раз такая байда затяжная получилась. Эт чтобы отсеять малые контроллеры.
Спасибо, буду ждать читалку. Проверил питание (от ардуины) - 3.25 вольта. Пробовал прогонять иниты - результат тот же что и на Дуе. Приложил линейку и через макро съемку получилось разрешение примерно 522*290 пикселей.
Спасибо, буду ждать читалку. Проверил питание (от ардуины) - 3.25 вольта. Пробовал прогонять иниты - результат тот же что и на Дуе. Приложил линейку и через макро съемку получилось разрешение примерно 522*290 пикселей.
читалка 3.1 PORTA, проверена на дисплеях с ID в 00h , и на других (ili9327 8bit , R61523 16bit) - отлично читает всю память, соответственно и ID в ней. (да, иногда некоторые регистры имеют глубину 10 , но ID так глубоко не запихивают, хватает в читалке и глубины =8) .
// ID_display_read_to_serial_monitor_universal_v3_1_PORTA.ino // читалка ID дисплеев V3.1beta только для 8ми битных дисплеев PORTA, // подключить 8ми битный дисплей к Arduino Mega/Due: // DB0-7 (DB8-DB15 , DB10-DB17) , соответственно на arduino пины 22-29 ( микроконтроллера PORTA PA0-PA7 ) // к примеру считать с 00D3 =>0xD3 младший // Это же подключение соответственно UTFT распиновке, // только не забыть, в тесте UTFT, на 42 пин подать лог.1 хотя бы внутренним резистором // digitalWrite(42, HIGH); #define CD_Pin 38 // (RS) //38 #define DCX 38 #define WR_Pin 39 //39 #define WRX 39 #define CS_Pin 40 //40 #define CSX 40 #define RST_Pin 41 //41 #define RSTX 41 #define RD_Pin 42 //42 __- #define RDX 42 int i,j; byte byteLL; // вспомогательный , ибо основной используется byte byteL; void setup() { DDRA=0xFF; // кнопка для продолжения скетча, если где надо его остановить, чтоб замерить лог. уровни pinMode(A12, INPUT); // кнопку удобно воткнуть в 12й пин и в рядом GND digitalWrite(12, HIGH); // внутренний подтягив. резистор к + pinMode(13, OUTPUT); // и светодиод на плате чтоб мигал, когда можно нажать кнопку для продолжения Serial.begin(9600); digitalWrite(RST_Pin, 0); // удержание в сбросе дисплея digitalWrite(CS_Pin, 0); // активация шины данных дисплея (выбор кристалла ChipSelect) for (i=22; i<=42;i++) { pinMode(i, OUTPUT); } // конфиг всех пинов на выход + управляющие пины //i=22; i<=42;i++ Serial.println("start... " ); Serial.println(""); digitalWrite(RST_Pin, 1); // вывод дисплея из сброса delay(100); digitalWrite(RST_Pin, 0); // удержание в сбросе дисплея delay(100); digitalWrite(RST_Pin, 1);// вывод дисплея из сброса delay(500); rstx_u(); Serial.println(" "); Serial.println(" 1p 2p 3p 4p 5p 6p 7p 8parameter(byte)"); Serial.println(" "); byteL=0x00 ; // writeCommand_read6Parameter(); rstx_u(); Serial.println(" "); for (j=0; j<=255;j++) //255 0x4F { byteL=j ; // writeCommand_read6Parameter(); rstx_u(); } } // Г Л А В Н А Я П Р О Г Р А М М А void loop() { // put your main code here, to run repeatedly: } // П О Д П Р О Г Р А М М Ы , Ф У Н К Ц И И // RST вверх. Сброс дисплея int rstx_u() { digitalWrite(WRX, 0);digitalWrite(DCX, 0);digitalWrite(RDX, 1); digitalWrite(RSTX, 0); delay(10); digitalWrite(RSTX, 1); delay(10); } // дергаем WR вверх int wrx_u() { digitalWrite(WRX, 0); digitalWrite(WRX, 1); //digitalWrite(WRX, 0); delay(2); } // дергаем RD вниз и считываем данные int rdx_u() { //digitalWrite(RDX, 0); digitalWrite(RDX, 1); // digitalWrite(RDX, 0); digitalWrite(RDX, 1); digitalWrite(RDX, 0); // оставим в 0 , чтоб порт дисплея был на выход, // и преобразователи уровней на шилде (если они есть) тоже были на выход delay(2); PORTA=0x00; byteL=0; // PORTA считаем byteL=PINA; // считываем с выводов PORTA //knopel(); delay(2); } // конфигурация порта на вход int port_in() { DDRA=0x00; // конфиг всех пинов на вход PORTA=0x00; // выключение подтягивающих резисторов } // конфигурация портов на выход int port_out() { DDRA=0xFF;// конфиг всех пинов на выход PORTA=0x00; // выключение подтягивающих резисторов } int writeCommand_read6Parameter() { // передадим команду digitalWrite(RDX, 1); // сначала порт дисплея в режим приема port_out(); // конфим ардуинку на выход // 1-будем передавать команду digitalWrite(DCX, 0); // для передачи команды в дисплей, а не данных delay(2); // сначала передадим старший байт=00 (00 на порт уже установил port_out(); ) PORTA=0x00; wrx_u(); /////////////wrx_u(); /////////////////// // теперь передадим младший байт PORTA=byteL; wrx_u(); // дергаем WRITE вверх delay(2); Serial.print("register " ); pn(); Serial.print(byteL, HEX ); Serial.print(" " ); byteLL=byteL; // запомним для нужд // 2-будем принимать данные port_in(); // порт ардуины на вход delay(2); digitalWrite(DCX, 1); // работаем теперь с данными, а не с командой delay(2); // дергаем RD вниз и получаем данные \, к примеру прочесть до 8ми параметров , физически в памяти это просто последующие регистры, // просто для скорости не надо задавать адрес последующего снова - это сделано во многих LCD контроллерах. for (i=1; i<=8; i++) { rdx_u(); // дергаем RD вниз и получаем данные Serial.print(" " ); pn(); Serial.print(byteL, HEX); } if ( byteLL==0x00 || byteLL==0xEF || byteLL==0xBF || byteLL==0x04 || byteLL==0xD3 ) Serial.print(" ***" ); if ( byteLL==0xDA || byteLL==0xDB || byteLL==0xDC ) Serial.print(" ***" ); Serial.println(""); digitalWrite(RDX, 1); // считали, переводим дисплей обратно в режим приема инфы } int pn() // печать дополнительный 0 , если 0 , чтоб печаталось в итоге 00 { if (byteL<=0x0F) Serial.print("0"); } int knopel() // остановка программы чтоб замерить уровни где надо и ожидание нажатия кнопки, для продолжения программы { while (digitalRead(12)==1) { digitalWrite(13, 1); delay(100);digitalWrite(13, 0); delay(200) ;} delay(500); }~522*290 не встречал похожего разрешения, ближние разрешения 480x320 (ili9486,ili9488,ili9481,HX8357,HX8347,RM68040,R61581,...) и 640x360 (R61523,...)
Спасибо. Попробовал читалку. Что-то выдало. Вот результат:
start... 1p 2p 3p 4p 5p 6p 7p 8parameter(byte) register 00 00 00 00 00 00 00 00 00 * register 00 00 00 00 00 00 00 00 00 * register 01 00 00 00 00 00 00 00 00 register 02 00 00 00 00 00 00 00 00 register 03 00 00 00 00 00 00 00 00 register 04 54 66 00 00 00 00 00 00 * register 05 00 00 00 00 00 00 00 00 register 06 00 00 00 00 00 00 00 00 register 07 00 00 00 00 00 00 00 00 register 08 00 00 00 00 00 00 00 00 register 09 00 00 00 00 00 00 00 00 register 0A 08 08 08 08 08 08 08 08 register 0B 00 00 00 00 00 00 00 00 register 0C 66 66 66 66 66 66 66 66 register 0D 00 00 00 00 00 00 00 00 register 0E 00 00 00 00 00 00 00 00 register 0F 00 00 00 00 00 00 00 00 register 10 00 00 00 00 00 00 00 00 register 11 00 00 00 00 00 00 00 00 register 12 00 00 00 00 00 00 00 00 register 13 00 00 00 00 00 00 00 00 register 14 00 00 00 00 00 00 00 00 register 15 00 00 00 00 00 00 00 00 register 16 00 00 00 00 00 00 00 00 register 17 00 00 00 00 00 00 00 00 register 18 00 00 00 00 00 00 00 00 register 19 00 00 00 00 00 00 00 00 register 1A 00 00 00 00 00 00 00 00 register 1B 00 00 00 00 00 00 00 00 register 1C 00 00 00 00 00 00 00 00 register 1D 00 00 00 00 00 00 00 00 register 1E 00 00 00 00 00 00 00 00 register 1F 00 00 00 00 00 00 00 00 register 20 00 00 00 00 00 00 00 00 register 21 00 00 00 00 00 00 00 00 register 22 00 00 00 00 00 00 00 00 register 23 00 00 00 00 00 00 00 00 register 24 00 00 00 00 00 00 00 00 register 25 00 00 00 00 00 00 00 00 register 26 00 00 00 00 00 00 00 00 register 27 00 00 00 00 00 00 00 00 register 28 00 00 00 00 00 00 00 00 register 29 00 00 00 00 00 00 00 00 register 2A 00 00 00 01 00 00 00 00 register 2B 00 00 00 01 00 00 00 00 register 2C 00 00 00 00 00 00 00 00 register 2D 00 00 00 00 00 00 00 00 register 2E 00 00 00 00 F0 70 00 00 register 2F 00 00 00 00 00 00 00 00 register 30 00 00 00 01 00 00 00 00 register 31 00 00 00 00 00 00 00 00 register 32 00 00 00 00 00 00 00 00 register 33 00 00 00 01 00 00 00 00 register 34 00 00 00 00 00 00 00 00 register 35 00 00 00 00 00 00 00 00 register 36 00 00 00 00 00 00 00 00 register 37 00 00 00 00 00 00 00 00 register 38 00 00 00 00 00 00 00 00 register 39 00 00 00 00 00 00 00 00 register 3A 66 66 66 66 66 66 66 66 register 3B 00 00 00 00 00 00 00 00 register 3C 00 00 00 00 00 00 00 00 register 3D 00 00 00 00 00 00 00 00 register 3E 00 68 00 00 00 00 F0 70 register 3F 00 00 00 00 00 00 00 00 register 40 00 00 00 00 00 00 00 00 register 41 00 00 00 00 00 00 00 00 register 42 00 00 00 00 00 00 00 00 register 43 00 00 00 00 00 00 00 00 register 44 00 00 00 00 00 00 00 00 register 45 00 00 00 00 00 00 00 00 register 46 00 00 00 00 00 00 00 00 register 47 00 00 00 00 00 00 00 00 register 48 00 00 00 00 00 00 00 00 register 49 00 00 00 00 00 00 00 00 register 4A 00 00 00 00 00 00 00 00 register 4B 00 00 00 00 00 00 00 00 register 4C 00 00 00 00 00 00 00 00 register 4D 00 00 00 00 00 00 00 00 register 4E 00 00 00 00 00 00 00 00 register 4F 00 00 00 00 00 00 00 00 register 50 00 00 00 00 00 00 00 00 register 51 00 00 00 00 00 00 00 00 register 52 00 00 00 00 00 00 00 00 register 53 00 00 00 00 00 00 00 00 register 54 00 00 00 00 00 00 00 00 register 55 00 00 00 00 00 00 00 00 register 56 00 00 00 00 00 00 00 00 register 57 00 00 00 00 00 00 00 00 register 58 00 00 00 00 00 00 00 00 register 59 00 00 00 00 00 00 00 00 register 5A 00 00 00 00 00 00 00 00 register 5B 00 00 00 00 00 00 00 00 register 5C 00 00 00 00 00 00 00 00 register 5D 00 00 00 00 00 00 00 00 register 5E 00 00 00 00 00 00 00 00 register 5F 00 00 00 00 00 00 00 00 register 60 00 00 00 00 00 00 00 00 register 61 00 00 00 00 00 00 00 00 register 62 00 00 00 00 00 00 00 00 register 63 00 00 00 00 00 00 00 00 register 64 00 00 00 00 00 00 00 00 register 65 00 00 00 00 00 00 00 00 register 66 00 00 00 00 00 00 00 00 register 67 00 00 00 00 00 00 00 00 register 68 00 00 00 00 00 00 00 00 register 69 00 00 00 00 00 00 00 00 register 6A 00 00 00 00 00 00 00 00 register 6B 00 00 00 00 00 00 00 00 register 6C 00 00 00 00 00 00 00 00 register 6D 00 00 00 00 00 00 00 00 register 6E 00 00 00 00 00 00 00 00 register 6F 00 00 00 00 00 00 00 00 register 70 00 00 00 00 00 00 00 00 register 71 00 00 00 00 00 00 00 00 register 72 00 00 00 00 00 00 00 00 register 73 00 00 00 00 00 00 00 00 register 74 00 00 00 00 00 00 00 00 register 75 00 00 00 00 00 00 00 00 register 76 00 00 00 00 00 00 00 00 register 77 00 00 00 00 00 00 00 00 register 78 00 00 00 00 00 00 00 00 register 79 00 00 00 00 00 00 00 00 register 7A 00 00 00 00 00 00 00 00 register 7B 00 00 00 00 00 00 00 00 register 7C 00 00 00 00 00 00 00 00 register 7D 00 00 00 00 00 00 00 00 register 7E 00 00 00 00 00 00 00 00 register 7F 00 00 00 00 00 00 00 00 register 80 00 00 00 00 00 00 00 00 register 81 00 00 00 00 00 00 00 00 register 82 00 00 00 00 00 00 00 00 register 83 00 00 00 00 00 00 00 00 register 84 00 00 00 00 00 00 00 00 register 85 00 00 00 00 00 00 00 00 register 86 00 00 00 00 00 00 00 00 register 87 00 00 00 00 00 00 00 00 register 88 00 00 00 00 00 00 00 00 register 89 00 00 00 00 00 00 00 00 register 8A 00 00 00 00 00 00 00 00 register 8B 00 00 00 00 00 00 00 00 register 8C 00 00 00 00 00 00 00 00 register 8D 00 00 00 00 00 00 00 00 register 8E 00 00 00 00 00 00 00 00 register 8F 00 00 00 00 00 00 00 00 register 90 00 00 00 00 00 00 00 00 register 91 00 00 00 00 00 00 00 00 register 92 00 00 00 00 00 00 00 00 register 93 00 00 00 00 00 00 00 00 register 94 00 00 00 00 00 00 00 00 register 95 00 00 00 00 00 00 00 00 register 96 00 00 00 00 00 00 00 00 register 97 00 00 00 00 00 00 00 00 register 98 00 00 00 00 00 00 00 00 register 99 00 00 00 00 00 00 00 00 register 9A 00 00 00 00 00 00 00 00 register 9B 00 00 00 00 00 00 00 00 register 9C 00 00 00 00 00 00 00 00 register 9D 00 00 00 00 00 00 00 00 register 9E 00 00 00 00 00 00 00 00 register 9F 00 00 00 00 00 00 00 00 register A0 00 00 00 00 00 00 00 00 register A1 00 00 00 00 00 00 00 00 register A2 00 00 00 00 00 00 00 00 register A3 00 00 00 00 00 00 00 00 register A4 00 00 00 00 00 00 00 00 register A5 00 00 00 00 00 00 00 00 register A6 00 00 00 00 00 00 00 00 register A7 00 00 00 00 00 00 00 00 register A8 00 00 00 00 00 00 00 00 register A9 00 00 00 00 00 00 00 00 register AA 00 00 00 00 00 00 00 00 register AB 00 00 00 00 00 00 00 00 register AC 00 00 00 00 00 00 00 00 register AD 00 00 00 00 00 00 00 00 register AE 00 00 00 00 00 00 00 00 register AF 00 00 00 00 00 00 00 00 register B0 00 00 00 00 00 00 00 00 register B1 B0 01 00 00 00 00 00 00 register B2 00 00 11 00 00 00 00 00 register B3 00 00 15 00 00 00 00 00 register B4 00 00 00 00 00 00 00 00 register B5 02 02 02 0A 00 00 00 00 register B6 02 02 02 00 00 00 00 00 register B7 06 06 06 06 06 06 06 06 register B8 00 00 00 00 00 00 00 00 register B9 00 00 00 00 00 00 00 00 register BA 00 00 00 00 00 00 00 00 register BB 00 00 00 00 00 00 00 00 register BC 00 00 00 00 00 00 00 00 register BD 00 00 00 00 00 00 00 00 register BE 00 00 00 00 00 00 00 00 register BF FF 14 00 00 00 00 00 00 * register C0 0E 00 00 00 00 00 00 00 register C1 04 04 00 00 00 00 00 00 register C2 33 33 33 33 33 33 33 33 register C3 33 33 33 33 33 33 33 33 register C4 33 33 33 33 33 33 33 33 register C5 00 00 00 00 00 00 00 00 register C6 00 00 00 00 00 00 00 00 register C7 00 00 00 00 00 00 00 00 register C8 00 00 00 00 00 00 00 00 register C9 00 00 00 00 00 00 00 00 register CA 00 00 00 00 00 00 00 00 register CB 00 00 00 00 00 00 00 00 register CC 00 00 00 00 00 00 00 00 register CD 00 00 00 00 00 00 00 00 register CE 00 00 00 00 00 00 00 00 register CF 00 00 00 00 00 00 00 00 register D0 00 00 00 00 00 00 00 00 register D1 00 00 00 00 00 00 00 00 register D2 00 00 00 00 00 00 00 00 register D3 00 00 86 00 00 00 00 00 * register D4 00 00 00 00 00 00 00 00 register D5 00 00 00 00 00 00 00 00 register D6 00 00 00 00 00 00 00 00 register D7 00 00 00 00 00 00 00 00 register D8 00 00 00 00 00 00 00 00 register D9 00 00 00 00 00 00 00 00 register DA 54 54 54 54 54 54 54 54 register DB 80 80 80 80 80 80 80 80 register DC 66 66 66 66 66 66 66 66 register DD 00 00 00 00 00 00 00 00 register DE 00 00 00 00 00 00 00 00 register DF 00 00 00 00 00 00 00 00 register E0 00 00 07 05 08 00 07 05 register E1 00 00 00 00 00 00 00 00 register E2 00 00 00 00 00 00 00 00 register E3 00 00 00 00 00 00 00 00 register E4 00 00 00 00 00 00 00 00 register E5 00 00 00 00 00 00 00 00 register E6 00 00 00 00 00 00 00 00 register E7 00 00 00 00 00 00 00 00 register E8 00 00 00 00 00 00 00 00 register E9 00 00 00 00 00 00 00 00 register EA 00 00 00 00 00 00 00 00 register EB 00 00 00 00 00 00 00 00 register EC 00 00 00 00 00 00 00 00 register ED 00 00 00 00 00 00 00 00 register EE 00 00 00 00 00 00 00 00 register EF 00 00 00 00 00 00 00 00 * register F0 00 00 00 00 00 00 00 00 register F1 00 00 00 00 00 00 00 00 register F2 00 00 00 00 00 00 00 00 register F3 00 00 00 00 00 00 00 00 register F4 00 00 00 00 00 00 00 00 register F5 00 00 00 00 00 00 00 00 register F6 00 00 00 00 00 00 00 00 register F7 00 00 00 00 00 00 00 00 register F8 00 00 00 00 00 00 00 00 register F9 00 00 00 00 00 00 00 00 register FA 00 00 00 00 00 00 00 00 register FB 00 00 00 00 00 00 00 00 register FC 00 00 00 00 00 00 00 00 register FD 00 00 00 00 00 00 00 00 register FE 00 00 00 00 00 00 00 00 register FF 01 01 00 00 00 00 00 00А это результат с закоментированной wrx_u();
start... 1p 2p 3p 4p 5p 6p 7p 8parameter(byte) register 00 00 00 00 00 00 00 00 00 * register 00 00 00 00 00 00 00 00 00 * register 01 00 00 00 00 00 00 00 00 register 02 00 00 00 00 00 00 00 00 register 03 00 00 00 00 00 00 00 00 register 04 54 66 00 00 00 00 00 00 * register 05 00 00 00 00 00 00 00 00 register 06 00 00 00 00 00 00 00 00 register 07 00 00 00 00 00 00 00 00 register 08 00 00 00 00 00 00 00 00 register 09 00 00 00 00 00 00 00 00 register 0A 08 08 08 08 08 08 08 08 register 0B 00 00 00 00 00 00 00 00 register 0C 66 66 66 66 66 66 66 66 register 0D 00 00 00 00 00 00 00 00 register 0E 00 00 00 00 00 00 00 00 register 0F 00 00 00 00 00 00 00 00 register 10 00 00 00 00 00 00 00 00 register 11 00 00 00 00 00 00 00 00 register 12 00 00 00 00 00 00 00 00 register 13 00 00 00 00 00 00 00 00 register 14 00 00 00 00 00 00 00 00 register 15 00 00 00 00 00 00 00 00 register 16 00 00 00 00 00 00 00 00 register 17 00 00 00 00 00 00 00 00 register 18 00 00 00 00 00 00 00 00 register 19 00 00 00 00 00 00 00 00 register 1A 00 00 00 00 00 00 00 00 register 1B 00 00 00 00 00 00 00 00 register 1C 00 00 00 00 00 00 00 00 register 1D 00 00 00 00 00 00 00 00 register 1E 00 00 00 00 00 00 00 00 register 1F 00 00 00 00 00 00 00 00 register 20 00 00 00 00 00 00 00 00 register 21 00 00 00 00 00 00 00 00 register 22 00 00 00 00 00 00 00 00 register 23 00 00 00 00 00 00 00 00 register 24 00 00 00 00 00 00 00 00 register 25 00 00 00 00 00 00 00 00 register 26 00 00 00 00 00 00 00 00 register 27 00 00 00 00 00 00 00 00 register 28 00 00 00 00 00 00 00 00 register 29 00 00 00 00 00 00 00 00 register 2A 00 00 00 01 00 00 00 00 register 2B 00 00 00 01 00 00 00 00 register 2C 00 00 00 00 00 00 00 00 register 2D 00 00 00 00 00 00 00 00 register 2E 00 68 00 00 00 F0 70 00 register 2F 00 00 00 00 00 00 00 00 register 30 00 00 00 01 00 00 00 00 register 31 00 00 00 00 00 00 00 00 register 32 00 00 00 00 00 00 00 00 register 33 00 00 00 01 00 00 00 00 register 34 00 00 00 00 00 00 00 00 register 35 00 00 00 00 00 00 00 00 register 36 00 00 00 00 00 00 00 00 register 37 00 00 00 00 00 00 00 00 register 38 00 00 00 00 00 00 00 00 register 39 00 00 00 00 00 00 00 00 register 3A 66 66 66 66 66 66 66 66 register 3B 00 00 00 00 00 00 00 00 register 3C 00 00 00 00 00 00 00 00 register 3D 00 00 00 00 00 00 00 00 register 3E 00 68 00 00 00 00 F0 70 register 3F 00 00 00 00 00 00 00 00 register 40 00 00 00 00 00 00 00 00 register 41 00 00 00 00 00 00 00 00 register 42 00 00 00 00 00 00 00 00 register 43 00 00 00 00 00 00 00 00 register 44 00 00 00 00 00 00 00 00 register 45 00 00 00 00 00 00 00 00 register 46 00 00 00 00 00 00 00 00 register 47 00 00 00 00 00 00 00 00 register 48 00 00 00 00 00 00 00 00 register 49 00 00 00 00 00 00 00 00 register 4A 00 00 00 00 00 00 00 00 register 4B 00 00 00 00 00 00 00 00 register 4C 00 00 00 00 00 00 00 00 register 4D 00 00 00 00 00 00 00 00 register 4E 00 00 00 00 00 00 00 00 register 4F 00 00 00 00 00 00 00 00 register 50 00 00 00 00 00 00 00 00 register 51 00 00 00 00 00 00 00 00 register 52 00 00 00 00 00 00 00 00 register 53 00 00 00 00 00 00 00 00 register 54 00 00 00 00 00 00 00 00 register 55 00 00 00 00 00 00 00 00 register 56 00 00 00 00 00 00 00 00 register 57 00 00 00 00 00 00 00 00 register 58 00 00 00 00 00 00 00 00 register 59 00 00 00 00 00 00 00 00 register 5A 00 00 00 00 00 00 00 00 register 5B 00 00 00 00 00 00 00 00 register 5C 00 00 00 00 00 00 00 00 register 5D 00 00 00 00 00 00 00 00 register 5E 00 00 00 00 00 00 00 00 register 5F 00 00 00 00 00 00 00 00 register 60 00 00 00 00 00 00 00 00 register 61 00 00 00 00 00 00 00 00 register 62 00 00 00 00 00 00 00 00 register 63 00 00 00 00 00 00 00 00 register 64 00 00 00 00 00 00 00 00 register 65 00 00 00 00 00 00 00 00 register 66 00 00 00 00 00 00 00 00 register 67 00 00 00 00 00 00 00 00 register 68 00 00 00 00 00 00 00 00 register 69 00 00 00 00 00 00 00 00 register 6A 00 00 00 00 00 00 00 00 register 6B 00 00 00 00 00 00 00 00 register 6C 00 00 00 00 00 00 00 00 register 6D 00 00 00 00 00 00 00 00 register 6E 00 00 00 00 00 00 00 00 register 6F 00 00 00 00 00 00 00 00 register 70 00 00 00 00 00 00 00 00 register 71 00 00 00 00 00 00 00 00 register 72 00 00 00 00 00 00 00 00 register 73 00 00 00 00 00 00 00 00 register 74 00 00 00 00 00 00 00 00 register 75 00 00 00 00 00 00 00 00 register 76 00 00 00 00 00 00 00 00 register 77 00 00 00 00 00 00 00 00 register 78 00 00 00 00 00 00 00 00 register 79 00 00 00 00 00 00 00 00 register 7A 00 00 00 00 00 00 00 00 register 7B 00 00 00 00 00 00 00 00 register 7C 00 00 00 00 00 00 00 00 register 7D 00 00 00 00 00 00 00 00 register 7E 00 00 00 00 00 00 00 00 register 7F 00 00 00 00 00 00 00 00 register 80 00 00 00 00 00 00 00 00 register 81 00 00 00 00 00 00 00 00 register 82 00 00 00 00 00 00 00 00 register 83 00 00 00 00 00 00 00 00 register 84 00 00 00 00 00 00 00 00 register 85 00 00 00 00 00 00 00 00 register 86 00 00 00 00 00 00 00 00 register 87 00 00 00 00 00 00 00 00 register 88 00 00 00 00 00 00 00 00 register 89 00 00 00 00 00 00 00 00 register 8A 00 00 00 00 00 00 00 00 register 8B 00 00 00 00 00 00 00 00 register 8C 00 00 00 00 00 00 00 00 register 8D 00 00 00 00 00 00 00 00 register 8E 00 00 00 00 00 00 00 00 register 8F 00 00 00 00 00 00 00 00 register 90 00 00 00 00 00 00 00 00 register 91 00 00 00 00 00 00 00 00 register 92 00 00 00 00 00 00 00 00 register 93 00 00 00 00 00 00 00 00 register 94 00 00 00 00 00 00 00 00 register 95 00 00 00 00 00 00 00 00 register 96 00 00 00 00 00 00 00 00 register 97 00 00 00 00 00 00 00 00 register 98 00 00 00 00 00 00 00 00 register 99 00 00 00 00 00 00 00 00 register 9A 00 00 00 00 00 00 00 00 register 9B 00 00 00 00 00 00 00 00 register 9C 00 00 00 00 00 00 00 00 register 9D 00 00 00 00 00 00 00 00 register 9E 00 00 00 00 00 00 00 00 register 9F 00 00 00 00 00 00 00 00 register A0 00 00 00 00 00 00 00 00 register A1 00 00 00 00 00 00 00 00 register A2 00 00 00 00 00 00 00 00 register A3 00 00 00 00 00 00 00 00 register A4 00 00 00 00 00 00 00 00 register A5 00 00 00 00 00 00 00 00 register A6 00 00 00 00 00 00 00 00 register A7 00 00 00 00 00 00 00 00 register A8 00 00 00 00 00 00 00 00 register A9 00 00 00 00 00 00 00 00 register AA 00 00 00 00 00 00 00 00 register AB 00 00 00 00 00 00 00 00 register AC 00 00 00 00 00 00 00 00 register AD 00 00 00 00 00 00 00 00 register AE 00 00 00 00 00 00 00 00 register AF 00 00 00 00 00 00 00 00 register B0 00 00 00 00 00 00 00 00 register B1 B0 01 00 00 00 00 00 00 register B2 00 00 11 00 00 00 00 00 register B3 00 00 15 00 00 00 00 00 register B4 00 00 00 00 00 00 00 00 register B5 02 02 02 0A 00 00 00 00 register B6 02 02 02 00 00 00 00 00 register B7 06 06 06 06 06 06 06 06 register B8 00 00 00 00 00 00 00 00 register B9 00 00 00 00 00 00 00 00 register BA 00 00 00 00 00 00 00 00 register BB 00 00 00 00 00 00 00 00 register BC 00 00 00 00 00 00 00 00 register BD 00 00 00 00 00 00 00 00 register BE 00 00 00 00 00 00 00 00 register BF FF 14 00 00 00 00 00 00 * register C0 0E 00 00 00 00 00 00 00 register C1 04 04 00 00 00 00 00 00 register C2 33 33 33 33 33 33 33 33 register C3 33 33 33 33 33 33 33 33 register C4 33 33 33 33 33 33 33 33 register C5 00 00 00 00 00 00 00 00 register C6 00 00 00 00 00 00 00 00 register C7 00 00 00 00 00 00 00 00 register C8 00 00 00 00 00 00 00 00 register C9 00 00 00 00 00 00 00 00 register CA 00 00 00 00 00 00 00 00 register CB 00 00 00 00 00 00 00 00 register CC 00 00 00 00 00 00 00 00 register CD 00 00 00 00 00 00 00 00 register CE 00 00 00 00 00 00 00 00 register CF 00 00 00 00 00 00 00 00 register D0 00 00 00 00 00 00 00 00 register D1 00 00 00 00 00 00 00 00 register D2 00 00 00 00 00 00 00 00 register D3 00 00 86 00 00 00 00 00 * register D4 00 00 00 00 00 00 00 00 register D5 00 00 00 00 00 00 00 00 register D6 00 00 00 00 00 00 00 00 register D7 00 00 00 00 00 00 00 00 register D8 00 00 00 00 00 00 00 00 register D9 00 00 00 00 00 00 00 00 register DA 54 54 54 54 54 54 54 54 register DB 80 80 80 80 80 80 80 80 register DC 66 66 66 66 66 66 66 66 register DD 00 00 00 00 00 00 00 00 register DE 00 00 00 00 00 00 00 00 register DF 00 00 00 00 00 00 00 00 register E0 00 00 07 05 08 00 07 05 register E1 00 00 00 00 00 00 00 00 register E2 00 00 00 00 00 00 00 00 register E3 00 00 00 00 00 00 00 00 register E4 00 00 00 00 00 00 00 00 register E5 00 00 00 00 00 00 00 00 register E6 00 00 00 00 00 00 00 00 register E7 00 00 00 00 00 00 00 00 register E8 00 00 00 00 00 00 00 00 register E9 00 00 00 00 00 00 00 00 register EA 00 00 00 00 00 00 00 00 register EB 00 00 00 00 00 00 00 00 register EC 00 00 00 00 00 00 00 00 register ED 00 00 00 00 00 00 00 00 register EE 00 00 00 00 00 00 00 00 register EF 00 00 00 00 00 00 00 00 * register F0 00 00 00 00 00 00 00 00 register F1 00 00 00 00 00 00 00 00 register F2 00 00 00 00 00 00 00 00 register F3 00 00 00 00 00 00 00 00 register F4 00 00 00 00 00 00 00 00 register F5 00 00 00 00 00 00 00 00 register F6 00 00 00 00 00 00 00 00 register F7 00 00 00 00 00 00 00 00 register F8 00 00 00 00 00 00 00 00 register F9 00 00 00 00 00 00 00 00 register FA 00 00 00 00 00 00 00 00 register FB 00 00 00 00 00 00 00 00 register FC 00 00 00 00 00 00 00 00 register FD 00 00 00 00 00 00 00 00 register FE 00 00 00 00 00 00 00 00 register FF 01 01 00 00 00 00 00 00Результат, похоже, одинаковый
судя по логу, это подделка (аналог) известного контроллера . не все ID знаю, но здесь подозрительно он слишком короткий (здесь м.б. данные с регистов 04 BF , DA DB DC, 2A 2B-размер), похоже на подделку . Но это не мешает работать этим дисплеям с ардуинкой. инит должен подойти от широкораспространённого. Есть ещё вариант поискать прошивку на этот тлф. по его названию , в прошивке глянуть какой драйвер дисплея используется. Еслиб тлф. был живой, то ещё вариант можно было включить анализатор при его включении, и снять короткий лог инита и вывода графики.
Ещё вариант, простой для вас, переберите иниты распространенных 480x320 дисплеев, которых нет в UTFT ( memorysaver.h ). какие можно поиском по aliexpress, инету, вайенжиниринг.ком найти, 480x320 , 320x480 , 480 x 320 LCD screen - будут много разных вариантов, смотрите описание , зачастую приводят тип контроллера, далее находите инит , подтыкаете в UTFT , заводите, радуетесь победе, и стряпаете на нём чтонибудь полезное.
// позже, если время будет, мож через недельку выложу ещё несколько изученных контроллеров/дисплеев вместе с логами читалки для сравнения , как оформлю. вот на днях попался 640x360 R61523 , подделка (ID почти пустое, как у вас, и не такое как в PDF) , но инит подошёл, UTFT тест кажет (подменил значения и переназвал функции в ините r61581, от найденного инита от STM в инете) , . как куплю оригинал, исследую , выложу инфу о разнице по чтению оригинала и аналога(подделки).
Вот по некоторым контроллерам есть ещё старенькая табличка LCD_Table.xls контроллеров, дисплеев, тлф найденная на просторах инета https://yadi.sk/i/Z_0aZQkAoyDGo . (мож существует и дополнение благодаря тому кто её составляет) . Когда ищите в ней, не забывайте , избегать выделенных фрагментов и ставить галку искать по всей книге, а не листу.
////Чтоб ветку не засорять, можете на емайл писать sеgun coб. яндekс ру (переписать все буквы латиницей)
Интересно подниму тему :-)
.
Здравствуйте помогите разобраться :
дисплей с мегой
http://ru.aliexpress.com/item/MEGA-2560-ATmega2560-16AU-Board-For-Arduin...
в скетче инициализация :
UTFT myGLCD(CTE40,38,39,40,41);
UTouch myTouch(6, 5, 4, 3, 2);
бтблиотеки -
#include <UTFT.h>
#include <UTouch.h>
#include <UTFT_Buttons.h>
Проблема в таче- он работает только с одной стороны экрана . Добавил #define TOUCH_ORIENTATION PORTRAIT , все равно точно не попадает куда нажимаешь. Я где то давно видел в библиотеку добавляется , что то типа x=480 y=240 и тогда точно работает . Сам искал - ненашел .
Здравствуйте помогите разобраться :
.....
http://arduino.ru/forum/apparatnye-voprosy/kalibrovka-ekrana-tft-lcd-7#comment-169444
Здравствуйте помогите разобраться :
.....
http://arduino.ru/forum/apparatnye-voprosy/kalibrovka-ekrana-tft-lcd-7#comment-169444
калибровка не помогает -вообще тогда не реагирует , а со стандартными значениями рисует сбоку в одной части экрана еще и зеркально .
Здравствуйте помогите разобраться :
.....
http://arduino.ru/forum/apparatnye-voprosy/kalibrovka-ekrana-tft-lcd-7#comment-169444
калибровка не помогает -вообще тогда не реагирует , а со стандартными значениями рисует сбоку в одной части экрана еще и зеркально .
Я по той ссылке что выше прочитал всего одно сообщение... И то там увидел что возможно у кого то перепутаны были пины... X и Y или что то в этом роде... Проверте у себя...
Про перепутанные пины это верно, есть у меня tft на ili9327. Подключение 8бит UNO. Работать нормально не хотел, пока в программе не подкорректировал подкючение выводов тача. Они там напрямую к ардуино подключены.
по калибровке, пожалуйста, пишите в одноименные темы .
По теме вопрос. Есть такой tft WD666AB2H 39 pin. облазил весь интернет. Нашел только продаем, продаем, продаем. Хорошо хот контроллер озвучили ili9488. На руках его нет, но есть желание его приладить. Может кто встречал инфу, нужна распиновка.
По теме вопрос. Есть такой tft WD666AB2H 39 pin. облазил весь интернет. Нашел только продаем, продаем, продаем. Хорошо хот контроллер озвучили ili9488. На руках его нет, но есть желание его приладить. Может кто встречал инфу, нужна распиновка.
Раз его нет на руках, к чему тогда вопрос?! На сейчас он уже превосходно гуглиться, поиск и аналоги выдает. В соседней ветке вам отвечали по нему. Неохота снова искать? И еслли раз никто не потратил на него драгоценного времени, не выложил в инет, (раз был вопрос, значит рассчитывали на ответ) - предлагаю тогда самим потратить пару дней. разобраться безвозмездно и сделать добро, выложить инфу по нему. мож кому пригодиться. или мож скажут хотя бы спасибо. Находя себе тоже нужную инфу в инете, задумывались, кто то ж добрый потрудился, её выложил.
Спасибо. Попробовал читалку. Что-то выдало. Вот результат:
...
register 2A 00 00 00 01 00 00 00 00register 2B 00 00 00 01 00 00 00 00...
register DA 54 54 54 54 54 54 54 54register DB 80 80 80 80 80 80 80 80register DC 66 66 66 66 66 66 66 66...
глянул ещё парочку даташитов больших дисплейчиков , замечу, что ID иногда не только ложат в 04h (или вообще пустой оставят). но и дублируют ID1 ID2 ID3 в DAh DBh DCh . ( DAh - manufacture фабрика (не стоит обращать внимание) DBh DCh - module / driver драйвер ).
Из 800x480 864x480 попались такие замечательные даташиты
NT35510 : 04h 00 80 00 , DAh 00 , DBh 80 , DCh 00 .
HX8369 HX8369A : 04h-отсутствует , DAh 00 , DBh 80 ( 81 82 83 84 85 ) , DCh 00 .
иниты гугляться . к примеру " HX8369 init "
480x320
ILI9486 ILI9486L : 04h 1параметр не определен, 2й-фабрика. 3,4й-драйвер , DAh - xx , DBh от 80 до FF , DCh 00h (тоже немного подходит под то что выдала читалка)
кстати эти регистры м.б. перепрограммированы в OTP режиме.
т.е. у вас получается id1 0x54 id2 0x80 id3 0x66
что то такое подобное уже гуглиться , https://github.com/notro/fbtft/issues/62
# tinylcd35: 0x2A, 0x40, 0x33
возможно похоже на HX8369 , скормите его инит дисплею .
в книге LCD_Table.xls (спасибо составителю) https://www.google.ru/url?sa=t&rct=j&q=&esrc=s&source=web&cd=6&cad=rja&uact=8&ved=0ahUKEwiu6vXx2IrLAhULDCwKHanVDi0QFghGMAU&url=http%3A%2F%2Fvrtp.ru%2Findex.php%3Fact%3DAttach%26type%3Dpost%26id%3D385043&usg=AFQjCNF0lMgp6m6m0UoU_nnF17Uwp79spA&bvm=bv.114733917,d.bGg поищите подходящие по разрешению контроллеры, и в инете гляньте в их даташитах , какие у них бывают ID .
вот ещё попалось интересное место инитов с файлов какой-то версии андроида под контроллеры применяемых больших дисплеев https://github.com/wiko-sources/cink-slim/tree/master/mediatek/custom/common/kernel/lcm . Также из файловой системы андроида, полагаю можно подсмотреть инфу чтобы подключить емкостный тачскрин к ардуино, ведь они тоже дешевые , от 50руб. ( Разработка ядер и прошивок для Android http://4pda.ru/forum/index.php?showtopic=583114 )
Специально проводить экспиримент я и не просил. Знаю по себе как заниматься инженирингом. Покупать кота в мешке тоже не айс. Хватает вопросов и по работе с контроллерами и с их перефирией.
вот здесь много и со ссылками где заказать сделать плату и с написаными драйверами
http://andybrown.me.uk/2013/10/19/vivaz-u5-lcd/
Да. спасибо. про vivaz знал, хорошая статейка. Ранее запускал уже дисплеи от SonyEricsson U5 и U8i на ардуино мега . шаманил UTFT под него.
Разрешение превосходное. Диагональ бы поболе. Повышайку для подсветки поставил готовый модуль MT3608, 19вольт через гасящий резистор. Подпаивал дисплей проводками, ибо разъем ( шаг 0.2мм против обычных 0.3мм ) стоит дороже дисплея в 4ре раза! . Ищу пока оригинал дисплея чтоб сравнить с неоригиналом. В плане потом черкнуть по ним. Да и флаи надо добить. U5 U8i перевести на 8 бит для мини, чтоб было много свободных пинов, весьма трудно , смотрел , очень тонкие дорожки от im0-2 со стекла в шлейф и там сразу на + и - . Если делать как есть 16бит , на мини остануться 4ре свободных пина, хотя для некоторых проектов хватит. И если сравнивать 8 бит и 16 бит на ардуино уно/мини/нано , то 8бит будет гораздо шустрее работать, чем 16 бит. (из-за раскидывании по многим разным портам при 16бит) . На меге да, 16 побыстрей будет чем 8 . К примеру тест UTFT на меге на ili9325 320x240 8бит-за 45сек, а в режиме 16бит - 41сек.
//////////////////// по R61523 Vivaz Arduino UTFT в следующих постах на 6й странице
Имхо LCD с разрешением более 320х240 подключать к 8-ми разрядным процам да еще по 8 разрядной шине считаю кащумством. Тогда уж лучше miniSTM на 103c8t, да на 16 полноценных битах. остается порядка 20 свободных пинов, есть адаптация под IDE arduino. http://www.stm32duino.com/viewforum.php?f=1&sid=776b93cae447043c5a6340572d148fe3
И быстре решает задачи. и больше перифирии.
у меня меньше пинов, 10 штук . дисплей от айфона 5+++( татч косил, ну я его и списал на запчасти).
пины просто подписаны 1.......10,
может кто даст в какую сторону искать и как прозвонить пины
у меня TFT 2.8/ Не работает с оргиналом Адафруита ни с UTFT, но работает вот с этой переделкой https://hackaday.io/project/6829-spfd5408-arduino-library-for-24-tft
У меня программа вот это выдала, не пойм что с этим делать? как понять что за дисплей? подключал в соответсвии с пинами на плате как есть
start...
UTFT normal pin29-22(PORTA)-byteH(DB15-0) , pin37-30(PORTC)-byteL(DB7-0)
register 00h for ILI9320(9320), ILI9325(9325), ILI9326(9326), SSD1289(1289,8989)
HX8347D(047), HX8347G(075), HX8352A(052), HX8352B(065), HX8352C(072)
R61509V(B509), R61505W(C505), SPFD5420A(5408)
if (0 93 0 27) -> 8bit . if (93 27 93 27) -> 16bit
register 0 0
1 Parameter 0 0
2 Parameter 0 0
3 Parameter 0 0
4 Parameter 0 0
5 Parameter 0 0
6 Parameter 0 0
register EFh for ILI9327(0 02 04 93 27 FF),
register 0 EF
1 Parameter 0 EF
2 Parameter 0 EF
3 Parameter 0 EF
4 Parameter 0 EF
5 Parameter 0 EF
6 Parameter 0 EF
register BFh for ILI9481(0 0 94 81 xx xx)
register 0 BF
1 Parameter 0 BF
2 Parameter 0 BF
3 Parameter 0 BF
4 Parameter 0 BF
5 Parameter 0 BF
6 Parameter 0 BF
register D3h for ILI9488(0 0 94 88 xx xx)
register 0 D3
1 Parameter 0 D3
2 Parameter 0 D3
3 Parameter 0 D3
4 Parameter 0 D3
5 Parameter 0 D3
6 Parameter 0 D3
register 04h for HX8357(?DA-DC), HX8353(?80-85),
register 0 4
1 Parameter 0 4
2 Parameter 0 4
3 Parameter 0 4
4 Parameter 0 4
5 Parameter 0 4
6 Parameter 0 4
у меня TFT 2.8/ Не работает с оргиналом Адафруита ни с UTFT, но работает вот с этой переделкой https://hackaday.io/project/6829-spfd5408-arduino-library-for-24-tft
Если работает, тогда нечего уже и пытать.
судя по логу (считывается тоже, что и посылается), у вас неподключен RD дисплея на 42й пин меги.
Для вставки кода , при написании сообщения, надо пользоваться значком {....} code , в окошко скопировать выданный код из монитор порта. В окошке, еще есть вкладка дополнительно , поставить галочку на Сворачитьвать код по умолчанию...
Примените читалку для 8ми бит . версию 3.1 она считывает все регистры. Управляющие пины подключать как написано в скетче читалки. шину данных два варианта:
читалка v3.1 для PORTC , если дисплей вы подключили на PORTC (пины ардуино 30-37 соответственно подключили к дисплейным DB7-DB0), то :
// ID_display_read_to_serial_monitor_universal_v3_1_PORTC.ino // читалка ID дисплеев V3.1beta только для 8ми битных дисплеев, // подключить 8ми битный дисплей к Arduino Mega/Due: // дисплейные DB0-7 (и могут быть физические DB8-DB15 , DB10-DB17) , соответственно на arduino пины 37-30 ( микроконтроллера PORTC PC0-PC7 ) // к примеру считать с 00D3 =>0xD3 младший // Это же подключение не соответствует UTFT распиновке, для 8ми бит она ориентирована на PORTA // разве что для ili9327 в UTFT_v2.77b2_uno_ili9327_8bit_turbo, там используется PORTC // тогда не забыть на 42 пин подать лог.1 хотя бы внутренним резистором digitalWrite(42, HIGH); #define CD_Pin 38 // (RS) //38 #define DCX 38 #define WR_Pin 39 //39 #define WRX 39 #define CS_Pin 40 //40 #define CSX 40 #define RST_Pin 41 //41 #define RSTX 41 #define RD_Pin 42 //42 __- #define RDX 42 int i,j; byte byteLL; // вспомогательный , ибо основной используется byte byteL; void setup() { DDRA=0xFF; // кнопка для продолжения скетча, если где надо его остановить, чтоб замерить лог. уровни pinMode(A12, INPUT); // кнопку удобно воткнуть в 12й пин и в рядом GND digitalWrite(12, HIGH); // внутренний подтягив. резистор к + pinMode(13, OUTPUT); // и светодиод на плате чтоб мигал, когда можно нажать кнопку для продолжения Serial.begin(9600); digitalWrite(RST_Pin, 0); // удержание в сбросе дисплея digitalWrite(CS_Pin, 0); // активация шины данных дисплея (выбор кристалла ChipSelect) for (i=22; i<=42;i++) { pinMode(i, OUTPUT); } // конфиг всех пинов на выход + управляющие пины //i=22; i<=42;i++ Serial.println("start... " ); Serial.println(""); digitalWrite(RST_Pin, 1); // вывод дисплея из сброса delay(100); digitalWrite(RST_Pin, 0); // удержание в сбросе дисплея delay(100); digitalWrite(RST_Pin, 1);// вывод дисплея из сброса delay(500); rstx_u(); Serial.println(" "); Serial.println(" 1p 2p 3p 4p 5p 6p 7p 8parameter(byte)"); Serial.println(" "); byteL=0x00 ; // writeCommand_read6Parameter(); rstx_u(); Serial.println(" "); for (j=0; j<=255;j++) //255 0x4F { byteL=j ; // writeCommand_read6Parameter(); rstx_u(); } } // Г Л А В Н А Я П Р О Г Р А М М А void loop() { // put your main code here, to run repeatedly: } // П О Д П Р О Г Р А М М Ы , Ф У Н К Ц И И // RST вверх. Сброс дисплея int rstx_u() { digitalWrite(WRX, 0);digitalWrite(DCX, 0);digitalWrite(RDX, 1); digitalWrite(RSTX, 0); delay(10); digitalWrite(RSTX, 1); delay(10); } // дергаем WR вверх int wrx_u() { digitalWrite(WRX, 0); digitalWrite(WRX, 1); //digitalWrite(WRX, 0); delay(2); } // дергаем RD вниз и считываем данные int rdx_u() { //digitalWrite(RDX, 0); digitalWrite(RDX, 1); // digitalWrite(RDX, 0); digitalWrite(RDX, 1); digitalWrite(RDX, 0); // оставим в 0 , чтоб порт дисплея был на выход, // и преобразователи уровней на шилде (если они есть) тоже были на выход delay(2); PORTC=0x00; byteL=0; // PORTC считаем byteL=PINC; // считываем с выводов PORTC //knopel(); delay(2); } // конфигурация порта на вход int port_in() { DDRC=0x00; // конфиг всех пинов на вход PORTC=0x00; // выключение подтягивающих резисторов } // конфигурация портов на выход int port_out() { DDRC=0xFF;// конфиг всех пинов на выход PORTC=0x00; // выключение подтягивающих резисторов } int writeCommand_read6Parameter() { // передадим команду digitalWrite(RDX, 1); // сначала порт дисплея в режим приема port_out(); // конфим ардуинку на выход // 1-будем передавать команду digitalWrite(DCX, 0); // для передачи команды в дисплей, а не данных delay(2); // сначала передадим старший байт=00 (00 на порт уже установил port_out(); ) PORTC=0x00; wrx_u(); /////////////wrx_u(); /////////////////// // теперь передадим младший байт PORTC=byteL; wrx_u(); // дергаем WRITE вверх delay(2); Serial.print("register " ); pn(); Serial.print(byteL, HEX ); Serial.print(" " ); byteLL=byteL; // запомним для нужд // 2-будем принимать данные port_in(); // порт ардуины на вход delay(2); digitalWrite(DCX, 1); // работаем теперь с данными, а не с командой delay(2); // дергаем RD вниз и получаем данные \, к примеру прочесть до 8ми параметров , физически в памяти это просто последующие регистры, // просто для скорости не надо задавать адрес последующего снова - это сделано во многих LCD контроллерах. for (i=1; i<=8; i++) { rdx_u(); // дергаем RD вниз и получаем данные Serial.print(" " ); pn(); Serial.print(byteL, HEX); } if ( byteLL==0x00 || byteLL==0xEF || byteLL==0xBF || byteLL==0x04 || byteLL==0xD3 ) Serial.print(" ***" ); if ( byteLL==0xDA || byteLL==0xDB || byteLL==0xDC ) Serial.print(" ***" ); Serial.println(""); digitalWrite(RDX, 1); // считали, переводим дисплей обратно в режим приема инфы } int pn() // печать дополнительный 0 , если 0 , чтоб печаталось в итоге 00 { if (byteL<=0x0F) Serial.print("0"); } int knopel() // остановка программы чтоб замерить уровни где надо и ожидание нажатия кнопки, для продолжения программы { while (digitalRead(12)==1) { digitalWrite(13, 1); delay(100);digitalWrite(13, 0); delay(200) ;} delay(500); }читалка v3.1 для PORTA , если дисплей вы подключили на PORTA (пин 22-29 ардуино меги соответственно подключать к дисплейным DB0-DB7), то :
// ID_display_read_to_serial_monitor_universal_v3_1_PORTA.ino // читалка ID дисплеев V3.1beta только для 8ми битных дисплеев PORTA, // подключить 8ми битный дисплей к Arduino Mega/Due: // DB0-7 (DB8-DB15 , DB10-DB17) , соответственно на arduino пины 22-29 ( микроконтроллера PORTA PA0-PA7 ) // к примеру считать с 00D3 =>0xD3 младший // Это же подключение соответственно UTFT распиновке, // только не забыть, в тесте UTFT, на 42 пин подать лог.1 хотя бы внутренним резистором // digitalWrite(42, HIGH); #define CD_Pin 38 // (RS) //38 #define DCX 38 #define WR_Pin 39 //39 #define WRX 39 #define CS_Pin 40 //40 #define CSX 40 #define RST_Pin 41 //41 #define RSTX 41 #define RD_Pin 42 //42 __- #define RDX 42 int i,j; byte byteLL; // вспомогательный , ибо основной используется byte byteL; void setup() { DDRA=0xFF; // кнопка для продолжения скетча, если где надо его остановить, чтоб замерить лог. уровни pinMode(A12, INPUT); // кнопку удобно воткнуть в 12й пин и в рядом GND digitalWrite(12, HIGH); // внутренний подтягив. резистор к + pinMode(13, OUTPUT); // и светодиод на плате чтоб мигал, когда можно нажать кнопку для продолжения Serial.begin(9600); digitalWrite(RST_Pin, 0); // удержание в сбросе дисплея digitalWrite(CS_Pin, 0); // активация шины данных дисплея (выбор кристалла ChipSelect) for (i=22; i<=42;i++) { pinMode(i, OUTPUT); } // конфиг всех пинов на выход + управляющие пины //i=22; i<=42;i++ Serial.println("start... " ); Serial.println(""); digitalWrite(RST_Pin, 1); // вывод дисплея из сброса delay(100); digitalWrite(RST_Pin, 0); // удержание в сбросе дисплея delay(100); digitalWrite(RST_Pin, 1);// вывод дисплея из сброса delay(500); rstx_u(); Serial.println(" "); Serial.println(" 1p 2p 3p 4p 5p 6p 7p 8parameter(byte)"); Serial.println(" "); byteL=0x00 ; // writeCommand_read6Parameter(); rstx_u(); Serial.println(" "); for (j=0; j<=255;j++) //255 0x4F { byteL=j ; // writeCommand_read6Parameter(); rstx_u(); } } // Г Л А В Н А Я П Р О Г Р А М М А void loop() { // put your main code here, to run repeatedly: } // П О Д П Р О Г Р А М М Ы , Ф У Н К Ц И И // RST вверх. Сброс дисплея int rstx_u() { digitalWrite(WRX, 0);digitalWrite(DCX, 0);digitalWrite(RDX, 1); digitalWrite(RSTX, 0); delay(10); digitalWrite(RSTX, 1); delay(10); } // дергаем WR вверх int wrx_u() { digitalWrite(WRX, 0); digitalWrite(WRX, 1); //digitalWrite(WRX, 0); delay(2); } // дергаем RD вниз и считываем данные int rdx_u() { //digitalWrite(RDX, 0); digitalWrite(RDX, 1); // digitalWrite(RDX, 0); digitalWrite(RDX, 1); digitalWrite(RDX, 0); // оставим в 0 , чтоб порт дисплея был на выход, // и преобразователи уровней на шилде (если они есть) тоже были на выход delay(2); PORTA=0x00; byteL=0; // PORTA считаем byteL=PINA; // считываем с выводов PORTA //knopel(); delay(2); } // конфигурация порта на вход int port_in() { DDRA=0x00; // конфиг всех пинов на вход PORTA=0x00; // выключение подтягивающих резисторов } // конфигурация портов на выход int port_out() { DDRA=0xFF;// конфиг всех пинов на выход PORTA=0x00; // выключение подтягивающих резисторов } int writeCommand_read6Parameter() { // передадим команду digitalWrite(RDX, 1); // сначала порт дисплея в режим приема port_out(); // конфим ардуинку на выход // 1-будем передавать команду digitalWrite(DCX, 0); // для передачи команды в дисплей, а не данных delay(2); // сначала передадим старший байт=00 (00 на порт уже установил port_out(); ) PORTA=0x00; wrx_u(); /////////////wrx_u(); /////////////////// // теперь передадим младший байт PORTA=byteL; wrx_u(); // дергаем WRITE вверх delay(2); Serial.print("register " ); pn(); Serial.print(byteL, HEX ); Serial.print(" " ); byteLL=byteL; // запомним для нужд // 2-будем принимать данные port_in(); // порт ардуины на вход delay(2); digitalWrite(DCX, 1); // работаем теперь с данными, а не с командой delay(2); // дергаем RD вниз и получаем данные \, к примеру прочесть до 8ми параметров , физически в памяти это просто последующие регистры, // просто для скорости не надо задавать адрес последующего снова - это сделано во многих LCD контроллерах. for (i=1; i<=8; i++) { rdx_u(); // дергаем RD вниз и получаем данные Serial.print(" " ); pn(); Serial.print(byteL, HEX); } if ( byteLL==0x00 || byteLL==0xEF || byteLL==0xBF || byteLL==0x04 || byteLL==0xD3 ) Serial.print(" ***" ); if ( byteLL==0xDA || byteLL==0xDB || byteLL==0xDC ) Serial.print(" ***" ); Serial.println(""); digitalWrite(RDX, 1); // считали, переводим дисплей обратно в режим приема инфы } int pn() // печать дополнительный 0 , если 0 , чтоб печаталось в итоге 00 { if (byteL<=0x0F) Serial.print("0"); } int knopel() // остановка программы чтоб замерить уровни где надо и ожидание нажатия кнопки, для продолжения программы { while (digitalRead(12)==1) { digitalWrite(13, 1); delay(100);digitalWrite(13, 0); delay(200) ;} delay(500); }Вот к примеру что она выдала для неизвестного 2.4" tft lcd shield arduino uno
1p 2p 3p 4p 5p 6p 7p 8parameter(byte) register 00 00 00 00 00 00 00 00 00 * register 00 00 00 00 00 00 00 00 00 * register 01 00 00 00 00 00 00 00 00 register 02 00 00 00 00 00 00 00 00 register 03 00 00 00 00 00 00 00 00 register 04 00 00 00 00 00 00 00 00 * register 05 00 00 00 00 00 00 00 00 register 06 00 00 00 00 00 00 00 00 register 07 00 00 00 00 00 00 00 00 register 08 00 00 00 00 00 00 00 00 register 09 00 00 61 00 00 00 00 00 register 0A 08 08 08 08 08 08 08 08 register 0B 00 00 00 00 00 00 00 00 register 0C 66 66 66 66 66 66 66 66 register 0D 00 00 00 00 00 00 00 00 register 0E 00 00 00 00 00 00 00 00 register 0F 00 00 00 00 00 00 00 00 register 10 00 00 00 00 00 00 00 00 register 11 00 00 00 00 00 00 00 00 register 12 00 00 00 00 00 00 00 00 register 13 00 00 00 00 00 00 00 00 register 14 00 00 00 00 00 00 00 00 register 15 00 00 00 00 00 00 00 00 register 16 00 00 00 00 00 00 00 00 register 17 00 00 00 00 00 00 00 00 register 18 00 00 00 00 00 00 00 00 register 19 00 00 00 00 00 00 00 00 register 1A 00 00 00 00 00 00 00 00 register 1B 00 00 00 00 00 00 00 00 register 1C 00 00 00 00 00 00 00 00 register 1D 00 00 00 00 00 00 00 00 register 1E 00 00 00 00 00 00 00 00 register 1F 00 00 00 00 00 00 00 00 register 20 00 00 00 00 00 00 00 00 register 21 00 00 00 00 00 00 00 00 register 22 00 00 00 00 00 00 00 00 register 23 00 00 00 00 00 00 00 00 register 24 00 00 00 00 00 00 00 00 register 25 00 00 00 00 00 00 00 00 register 26 00 00 00 00 00 00 00 00 register 27 00 00 00 00 00 00 00 00 register 28 00 00 00 00 00 00 00 00 register 29 00 00 00 00 00 00 00 00 register 2A 00 00 00 00 00 00 00 00 register 2B 00 00 00 00 00 00 00 00 register 2C 00 00 00 00 00 00 00 00 register 2D 00 00 00 00 00 00 00 00 register 2E FC 7C 6C 14 FC 58 DC 54 register 2F 00 00 00 00 00 00 00 00 register 30 00 00 00 00 00 00 00 00 register 31 00 00 00 00 00 00 00 00 register 32 00 00 00 00 00 00 00 00 register 33 00 00 00 00 00 00 00 00 register 34 00 00 00 00 00 00 00 00 register 35 00 00 00 00 00 00 00 00 register 36 00 00 00 00 00 00 00 00 register 37 00 00 00 00 00 00 00 00 register 38 00 00 00 00 00 00 00 00 register 39 00 00 00 00 00 00 00 00 register 3A 00 00 00 00 00 00 00 00 register 3B 00 00 00 00 00 00 00 00 register 3C 00 00 00 00 00 00 00 00 register 3D 00 00 00 00 00 00 00 00 register 3E FC 7C 6C 14 FC 58 DC 54 register 3F 00 00 00 00 00 00 00 00 register 40 00 00 00 00 00 00 00 00 register 41 00 00 00 00 00 00 00 00 register 42 00 00 00 00 00 00 00 00 register 43 00 00 00 00 00 00 00 00 register 44 00 00 00 00 00 00 00 00 register 45 00 00 00 00 00 00 00 00 register 46 00 00 00 00 00 00 00 00 register 47 00 00 00 00 00 00 00 00 register 48 00 00 00 00 00 00 00 00 register 49 00 00 00 00 00 00 00 00 register 4A 00 00 00 00 00 00 00 00 register 4B 00 00 00 00 00 00 00 00 register 4C 00 00 00 00 00 00 00 00 register 4D 00 00 00 00 00 00 00 00 register 4E 00 00 00 00 00 00 00 00 register 4F 00 00 00 00 00 00 00 00 register 50 00 00 00 00 00 00 00 00 register 51 00 00 00 00 00 00 00 00 register 52 00 00 00 00 00 00 00 00 register 53 00 00 00 00 00 00 00 00 register 54 00 00 00 00 00 00 00 00 register 55 00 00 00 00 00 00 00 00 register 56 00 00 00 00 00 00 00 00 register 57 00 00 00 00 00 00 00 00 register 58 00 00 00 00 00 00 00 00 register 59 00 00 00 00 00 00 00 00 register 5A 00 00 00 00 00 00 00 00 register 5B 00 00 00 00 00 00 00 00 register 5C 00 00 00 00 00 00 00 00 register 5D 00 00 00 00 00 00 00 00 register 5E 00 00 00 00 00 00 00 00 register 5F 00 00 00 00 00 00 00 00 register 60 00 00 00 00 00 00 00 00 register 61 00 00 00 00 00 00 00 00 register 62 00 00 00 00 00 00 00 00 register 63 00 00 00 00 00 00 00 00 register 64 00 00 00 00 00 00 00 00 register 65 00 00 00 00 00 00 00 00 register 66 00 00 00 00 00 00 00 00 register 67 00 00 00 00 00 00 00 00 register 68 00 00 00 00 00 00 00 00 register 69 00 00 00 00 00 00 00 00 register 6A 00 00 00 00 00 00 00 00 register 6B 00 00 00 00 00 00 00 00 register 6C 00 00 00 00 00 00 00 00 register 6D 00 00 00 00 00 00 00 00 register 6E 00 00 00 00 00 00 00 00 register 6F 00 00 00 00 00 00 00 00 register 70 00 00 00 00 00 00 00 00 register 71 00 00 00 00 00 00 00 00 register 72 00 00 00 00 00 00 00 00 register 73 00 00 00 00 00 00 00 00 register 74 00 00 00 00 00 00 00 00 register 75 00 00 00 00 00 00 00 00 register 76 00 00 00 00 00 00 00 00 register 77 00 00 00 00 00 00 00 00 register 78 00 00 00 00 00 00 00 00 register 79 00 00 00 00 00 00 00 00 register 7A 00 00 00 00 00 00 00 00 register 7B 00 00 00 00 00 00 00 00 register 7C 00 00 00 00 00 00 00 00 register 7D 00 00 00 00 00 00 00 00 register 7E 00 00 00 00 00 00 00 00 register 7F 00 00 00 00 00 00 00 00 register 80 00 00 00 00 00 00 00 00 register 81 00 00 00 00 00 00 00 00 register 82 00 00 00 00 00 00 00 00 register 83 00 00 00 00 00 00 00 00 register 84 00 00 00 00 00 00 00 00 register 85 00 00 00 00 00 00 00 00 register 86 00 00 00 00 00 00 00 00 register 87 00 00 00 00 00 00 00 00 register 88 00 00 00 00 00 00 00 00 register 89 00 00 00 00 00 00 00 00 register 8A 00 00 00 00 00 00 00 00 register 8B 00 00 00 00 00 00 00 00 register 8C 00 00 00 00 00 00 00 00 register 8D 00 00 00 00 00 00 00 00 register 8E 00 00 00 00 00 00 00 00 register 8F 00 00 00 00 00 00 00 00 register 90 00 00 00 00 00 00 00 00 register 91 00 00 00 00 00 00 00 00 register 92 00 00 00 00 00 00 00 00 register 93 00 00 00 00 00 00 00 00 register 94 00 00 00 00 00 00 00 00 register 95 00 00 00 00 00 00 00 00 register 96 00 00 00 00 00 00 00 00 register 97 00 00 00 00 00 00 00 00 register 98 00 00 00 00 00 00 00 00 register 99 00 00 00 00 00 00 00 00 register 9A 00 00 00 00 00 00 00 00 register 9B 00 00 00 00 00 00 00 00 register 9C 00 00 00 00 00 00 00 00 register 9D 00 00 00 00 00 00 00 00 register 9E 00 00 00 00 00 00 00 00 register 9F 00 00 00 00 00 00 00 00 register A0 00 00 00 00 00 00 00 00 register A1 00 00 00 00 00 FF 00 00 register A2 00 00 00 00 00 00 00 00 register A3 00 00 00 00 00 00 00 00 register A4 00 00 00 00 00 00 00 00 register A5 00 00 00 00 00 00 00 00 register A6 00 00 00 00 00 00 00 00 register A7 00 00 00 00 00 00 00 00 register A8 00 00 00 00 00 00 FF 00 register A9 00 00 00 00 00 00 00 00 register AA 00 00 00 00 00 00 00 00 register AB 00 00 00 00 00 00 00 00 register AC 00 00 00 00 00 00 00 00 register AD 00 00 00 00 00 00 00 00 register AE 00 00 00 00 00 00 00 00 register AF 00 00 00 00 00 00 00 00 register B0 00 00 00 00 00 00 00 00 register B1 00 00 00 00 00 00 00 00 register B2 00 00 00 00 00 00 00 00 register B3 00 00 00 00 00 00 00 00 register B4 00 00 00 00 00 00 00 00 register B5 00 00 00 00 00 00 00 00 register B6 00 00 00 00 00 00 00 00 register B7 00 00 00 00 00 00 00 00 register B8 00 00 00 00 00 00 00 00 register B9 00 00 00 00 00 00 00 00 register BA 00 00 00 00 00 00 00 00 register BB 00 00 00 00 00 00 00 00 register BC 00 00 00 00 00 00 00 00 register BD 00 00 00 00 00 00 00 00 register BE 00 00 00 00 00 00 00 00 register BF 00 00 00 00 00 00 00 00 * register C0 00 00 00 00 00 00 00 00 register C1 00 00 00 00 00 00 00 00 register C2 00 00 00 00 00 00 00 00 register C3 00 00 00 00 00 00 00 00 register C4 00 00 00 00 00 00 00 00 register C5 00 00 00 00 00 00 00 00 register C6 00 00 00 00 00 00 00 00 register C7 00 00 00 00 00 00 00 00 register C8 00 00 00 00 00 00 00 00 register C9 00 00 00 00 00 00 00 00 register CA 00 00 00 00 00 00 00 00 register CB 00 00 00 00 00 00 00 00 register CC 00 00 00 00 00 00 00 00 register CD 00 00 00 00 00 00 00 00 register CE 00 00 00 00 00 00 00 00 register CF 00 00 00 00 00 00 00 00 register D0 00 00 00 00 00 00 00 00 register D1 00 00 00 00 00 00 00 00 register D2 00 00 00 00 00 00 00 00 register D3 00 00 00 00 00 00 00 00 * register D4 00 00 00 00 00 00 00 00 register D5 00 00 00 00 00 00 00 00 register D6 00 00 00 00 00 00 00 00 register D7 00 00 00 00 00 00 00 00 register D8 00 00 00 00 00 00 00 00 register D9 00 00 00 00 00 00 00 00 register DA 00 00 00 00 00 00 00 00 register DB 00 00 00 00 00 00 00 00 register DC 00 00 00 00 00 00 00 00 register DD 00 00 00 00 00 00 00 00 register DE 00 00 00 00 00 00 00 00 register DF 00 00 00 00 00 00 00 00 register E0 00 00 00 00 00 00 00 00 register E1 00 00 00 00 00 00 00 00 register E2 00 00 00 00 00 00 00 00 register E3 00 00 00 00 00 00 00 00 register E4 00 00 00 00 00 00 00 00 register E5 00 00 00 00 00 00 00 00 register E6 00 00 00 00 00 00 00 00 register E7 00 00 00 00 00 00 00 00 register E8 00 00 00 00 00 00 00 00 register E9 00 00 00 00 00 00 00 00 register EA 00 00 00 00 00 00 00 00 register EB 00 00 00 00 00 00 00 00 register EC 00 00 00 00 00 00 00 00 register ED 00 00 00 00 00 00 00 00 register EE 00 00 00 00 00 00 00 00 register EF 00 00 00 00 00 00 00 00 * register F0 00 00 00 00 00 00 00 00 register F1 00 00 00 00 00 00 00 00 register F2 28 94 03 08 08 10 00 15 register F3 01 00 00 00 00 00 00 00 register F4 0B 00 00 00 21 4F 01 02 register F5 00 4D 66 00 00 12 00 00 register F6 01 01 03 00 02 0C 02 08 register F7 00 80 10 00 00 00 00 00 register F8 33 00 00 00 00 00 00 00 register F9 04 00 00 00 00 00 00 00 register FA 00 0C 01 0D 13 1C 15 3A register FB 00 00 00 00 00 00 00 00 register FC 00 00 00 00 00 00 00 00 register FD 00 00 10 14 12 01 04 48 register FE 04 20 53 00 00 00 00 00 register FF 00 00 00 00 00 00 00 00, который тоже запустился на адафруитской переделке от SPFD5408 (для запуска на UTFT, никто видимо не хочет попыхтеть для него, можно было сделать на базе UTFT_v2.77b2_uno_ili9327_8bit_turbo).
Как видно из лога, это вообще непонятный левый аналог. Согласно даташиту http://www.micro4you.com/files/lcd/SPFD5408A.pdf , для SPFD5408, ID должен лежать в 00h , и должно было считаться 54 08 .
По факту в дисплее стоит контроллер - аналог . Поэтому и применяют переделки, в частности от adafruita ,они не вычитывают какой id контроллера, чтобы скормить ему подходящий инит , а тупо дают ему определенный инит. Собственно как и делает UTFT, для неизвестных дисплеев в нем может не оказаться подходящего инита, да и подходящую битность там надо установить. К тому же в UTFT ,если дисплей переведен с 16ти на 8 бит, иногда приходиться немного попыхтеть. К примеру выставить все 16ть бит byte dtm[] = {16, 16 ... 16}, но физически использовать младшие 8мь бит, т.е. PORTC ( пин 30-37 соответственно подключать к дисплейным DB7-DB0 ) , так хоть можно увидеть какие нибудь корявые картинки теста. Т.о. перебирая иниты можно убедиться что дисплей жив и может что-то рисовать.
как конечное решение можно , подсмотреть на переделке UTFT UTFT_v2.77b2_uno_ili9327_8bit_turbo , на форуме она есть . Для меги, уновский шилд по умолчанию подключать проводочками на PORTC . Можно и напрямую , в соседней ветке про 3.5", выкладывал переделку на базе её, чтоб уновский адафруитский дисплей воткнутый в мегу работал.
по поводу подключения - я не вижу смысла подключать дисплей иначе как у него штырьки стоят, прям на плату втыкаешь и всё. зачем огород городить, если можно пины переназначить в программе. или это только для проверки ?
у меня дсиплей с вот такими пинами LCD_CS A3 LCD_CD A2 LCD_WR A1 LCD_RD A0. это фактическое подключение в соответствии с надписями на дисплее. переделка так работает
я пробовал для UTFT делать инит в соответствии с рабочей AdafruiSPFD5408, вроде всё верно, но всё равно белый экран
а почему именно белый экран горит? что это значит? почему не абракадабру выводит?
самое интересное что я пробовал в соответствии с инструкцией рабочей переделки исправить оргинал Adafrui, но всё равно белый экран, вот это и странно
а есть ли какаято статья обучающая про это всё про битность способы передачи регистры и тп, именно при работе с дисплеями такими а то ничего почти не понятно? вот этим было бы интерсно заняться, там бы исам разобрался
по поводу подключения - я не вижу смысла подключать дисплей иначе как у него штырьки стоят, прям на плату втыкаешь и всё. зачем огород городить, если можно пины переназначить в программе. или это только для проверки ?
так уновские дисплеи на проводках никто и не собирается использовать, невнимательно читали. Это подключение только для удобного считывания ID программе. и если что удобного и понятного управления. И как стандартное подключение меговских шилдов. Читалку специально для уновского дисплея напрямую воткнутого в мегу , нету надобности делать , ибо не всегда у них реально выведен RD, да и по некоторым адресам сама адафруитская либа умеет считывать и выводит в монитор порта.
Для использования же Уновских Адафруитских шилдов на меге и уно, подходят либы и адафруит и UTFT-подшаманенная. В теме про 3.5" явный пример использования UTFT для связки Уно+адафруитский уновский шилд к примеру на базе ili9327 - решение UTFT_v2.77b2_uno_ili9327_8bit_turbo. Для связки Мега+адафруитский уновский шилд - http://arduino.ru/forum/apparatnye-voprosy/tft-35-i-arduino?page=6#comment-90708 разбирался сам в работе библиотеки , и на форуме обсуждалось что и как, изучите внимательней. там же народ нашёл методы ещё ускорения работы UTFT.
// на адафруитском уновском шилде DB0 DB1 заведены на пины ардуиновские D8 D9 . Для UTFT в уновском шилде по умолчанию они должны быть физически на пинах D0 D1 (на которых находится сериал порт, адафруит их высвобождает) .
№11
3,0" 400x240 дисплей Fly E155, HX8352A tft lcd 37pin 4led SR7791493
картинки кликабельны:
распиновка:
по R00h вычитывается ID 0x52 что соответствует HX8352A . В UTFT он есть . вызов UTFT myGLCD(HX8352A,38,39,40,41); . Дисплейчик 16бит. Перевод в 8бит на шлейфе не предусмотрен (разве что чем нибудь острым перекоммутировать дорожки со стекла в шлейф).
Вот такой вот шилд получился. Габариты дисплея не загораживают верхний и нижний ряд выводов ардуино.
углы обзора вверх вниз вправо хорошие , влево не очень . Попробовал пины длинные long , поэтому можно под шилдом разместить обычную плату или шилд.
№12
3,2" 320x240 дисплей Fly IQ230, tft lcd 41pin 6led FPC-FRD32181A
картинки кликабельны:
распиновка:
по R00h вычитолась ID 6809h , изучение даташитов дало что это контроллер RM68090 , причём в старой версии rev01 этот контроллер имеет ID 6807h , в новой версии rev04 - ID 6809h .
/********************************************************* Controller: HX8347D Panel: CMO2.2 Reslution: VDD: 2.8v Interface: 8080--16bit/1-8 10-17 Dataport: P2 -->DB8-DB15 P0 -->DB0-DB7 *********************************************************/ #include"reg51.h" #include <absacc.h> #include <intrins.h> #define CtrPort P3 sbit P10 =P1^0; sbit P11 =P1^1; sbit P12 =P1^2; sbit P13 =P1^3; sbit P14 =P1^4; sbit P16 =P1^6; sbit P17 =P1^7; //sbit Ram_chip_select1 =P1^4; sbit Ram_chip_select2 =P1^5; //sbit Ram_chip_select3 =P1^3; //unsigned char code pic[]; const // /RESET /CS /RD /WR /RS cwrite =0xf4; // 1 0 1 0 0 cwrite_set =0xf6; // 1 0 1 1 0 dwrite =0xf5; // 1 0 1 0 1 dwrite_set =0xf7; // 1 0 1 1 1 /**********************************************************/ void delay(unsigned int para) { for(;para;para--); } void LCD_Index_Out(unsigned char Index) { CtrPort=cwrite_set; P2=0x00; P0=Index; CtrPort=cwrite; CtrPort=cwrite_set; } void LCD_Data_Out(unsigned char set_dbH,unsigned char set_dbL) { P2=set_dbH; P0=set_dbL; CtrPort=dwrite; CtrPort=dwrite_set; } void control_out(unsigned char x,unsigned char y) { unsigned char m,n; m=y>>8; n=y; LCD_Index_Out(x); LCD_Data_Out(m,n); } void LCD_Data_Out1(unsigned int y) { unsigned char m,n; m=y>>8; n=y; LCD_Data_Out(m,n); } void RESET(void) { CtrPort=0xff; delay(50); CtrPort=0xef; delay(300); CtrPort=0xff; delay(150); } void MainAddset() { LCD_Index_Out(0x20); LCD_Data_Out(0x00,0x00); LCD_Index_Out(0x21); LCD_Data_Out(0x00,0x00); LCD_Index_Out(0x22); } void Init_LCD(void) { RESET(); delay(150); // After Inter-MicroP Program (load OTP) control_out(0x00EA,0x0000); //PTBA[15:8] control_out(0x00EB,0x0020); //PTBA[7:0] control_out(0x00EC,0x000C); //STBA[15:8] control_out(0x00ED,0x00C4); //STBA[7:0] control_out(0x00E8,0x0040); //OPON[7:0] control_out(0x00E9,0x0038); //OPON1[7:0] control_out(0x00F1,0x0001); //OTPS1B control_out(0x00F2,0x0010); //GEN control_out(0x0027,0x00A3); // //Gamma 2.2 Setting control_out(0x0040,0x0000); // control_out(0x0041,0x0000); // control_out(0x0042,0x0001); // control_out(0x0043,0x0012); // control_out(0x0044,0x0010); // control_out(0x0045,0x0026); // control_out(0x0046,0x0008); // control_out(0x0047,0x0053); // control_out(0x0048,0x0002); // control_out(0x0049,0x0015); // control_out(0x004A,0x0019); // control_out(0x004B,0x0019); // control_out(0x004C,0x0016); // control_out(0x0050,0x0019); // control_out(0x0051,0x002F); // control_out(0x0052,0x002D); // control_out(0x0053,0x003E); // control_out(0x0054,0x003F); // control_out(0x0055,0x003F); // control_out(0x0056,0x002C); // control_out(0x0057,0x0077); // control_out(0x0058,0x0009); // control_out(0x0059,0x0006); // control_out(0x005A,0x0006); // control_out(0x005B,0x000A); // control_out(0x005C,0x001D); // control_out(0x005D,0x00CC); // //Power Voltage Setting control_out(0x001B,0x001B); //VRH=4.65V control_out(0x001A,0x0001); //BT (VGH~15V,VGL~-10V,DDVDH~5V) control_out(0x0024,0x002F); //VMH(VCOM High voltage ~3.2V) control_out(0x0025,0x0057); //VML(VCOM Low voltage -1.2V) //****VCOM offset**/// control_out(0x0023,0x0097); //for Flicker adjust //can reload from OTP //Power on Setting control_out(0x0018,0x0036); //I/P_RADJ,N/P_RADJ, Normal mode 75Hz control_out(0x0019,0x0001); //OSC_EN='1', start Osc control_out(0x0001,0x0000); //DP_STB='0', out deep sleep control_out(0x001F,0x0088);// GAS=1, VOMG=00, PON=0, DK=1, XDK=0, DVDH_TRI=0, STB=0 delay(5); control_out(0x001F,0x0080);// GAS=1, VOMG=00, PON=0, DK=0, XDK=0, DVDH_TRI=0, STB=0 delay(5); control_out(0x001F,0x0090);// GAS=1, VOMG=00, PON=1, DK=0, XDK=0, DVDH_TRI=0, STB=0 delay(5); control_out(0x001F,0x00D0);// GAS=1, VOMG=10, PON=1, DK=0, XDK=0, DDVDH_TRI=0, STB=0 delay(5); //262k/65k color selection control_out(0x0017,0x0005); //default 0x0006 262k color // 0x0005 65k color //SET PANEL control_out(0x0036,0x0000); //SS_P, GS_P,REV_P,BGR_P //Display ON Setting control_out(0x0028,0x0038); //GON=1, DTE=1, D=1000 delay(40); control_out(0x0028,0x003C); //GON=1, DTE=1, D=1100 //Set GRAM Area control_out(0x0002,0x0000); control_out(0x0003,0x0000); //Column Start control_out(0x0004,0x0000); control_out(0x0005,0x00EF); //Column End control_out(0x0006,0x0000); control_out(0x0007,0x0000); //Row Start control_out(0x0008,0x0001); control_out(0x0009,0x003F); //Row End //WR_8B_FORMAT(0x0022); //Start GRAM write // Power Off Setting control_out(0x0028,0x0038); //GON=ЎЇ1ЎЇ DTE=ЎЇ1ЎЇ D[1:0]=ЎЇ10ЎЇ delay(40); control_out(0x001F,0x0089); // GAS=1, VOMG=00, PON=0, DK=1, XDK=0, DVDH_TRI=0, STB=1 delay(40); control_out(0x0028,0x0004); //GON=ЎЇ0ЎЇ DTE=ЎЇ0ЎЇ D[1:0]=ЎЇ01ЎЇ delay(40); control_out(0x0019,0x0000); //OSC_EN=ЎЇ0ЎЇ delay(5); //M51_WR_REG(U05_LCD_POWER_ON, 0x0000); //VCI & IOVCC OFF //################################################################## // ENTER IDLE mode Setting control_out(0x0018,0x0034); //I/P_RADJ,N/P_RADJ, IDLE mode 55Hz control_out(0x002F,0x0011); //IDLE mode line inversion control_out(0x0001,0x0004); //IDLE='1' , enter IDLE mode // EXIT IDLE mode Setting control_out(0x0018,0x0036); //I/P_RADJ,N/P_RADJ, Normal mode 75Hz control_out(0x002F,0x0011); //Normal mode line inversion control_out(0x0001,0x0000); //IDLE='0', EXIT IDLE mode //################################################################## // ENTER Partial mode Setting 32line control_out(0x0018,0x0036); //I/P_RADJ,N/P_RADJ Partial mode 75Hz control_out(0x002F,0x0011); //Partial mode line inversion control_out(0x0001,0x0001); //PTL='1', Enter Partial mode control_out(0x000A,0x0000); //PSL[15:8]=0x0000 control_out(0x000B,0x0020); //PSL[7:0]=0x0020 control_out(0x000C,0x0000); //PEL[15:8]=0x0000 control_out(0x000D,0x0047); //PEL[7:0]=0x0047 control_out(0x0026,0x0001); //refresh cycle=5frame // EXIT Partial mode Setting control_out(0x0018,0x0036); //I/P_RADJ,N/P_RADJ, Normal mode 75Hz control_out(0x002F,0x0011); //Normal mode, line inversion control_out(0x0001,0x0000); //PTL='0', EXIT Partial mode // ENTER Partial + IDLE mode Setting 32line control_out(0x0018,0x0036); //I/P_RADJ,N/P_RADJ, Partial mode 55Hz control_out(0x002F,0x0011); // Partial + IDLE mode line inversion control_out(0x0001,0x0009); // PTL='1' IDLE=ЎЇ1ЎЇ, Enter Partial + IDLE mode control_out(0x000A,0x0000); //PSL[15:8]=0x0000 control_out(0x000B,0x0020); //PSL[7:0]=0x0020 control_out(0x000C,0x0000); //PEL[15:8]=0x0000 control_out(0x000D,0x0047); //PEL[7:0]=0x0047 control_out(0x0026,0x0001); //refresh cycle=5frame // EXIT Partial + IDLE mode Setting control_out(0x0018,0x0036); //I/P_RADJ,N/P_RADJ ,Normal mode 75Hz control_out(0x002F,0x0011); //Normal mode, line inversion control_out(0x0001,0x0000); // PTL='0' IDLE=ЎЇ0ЎЇ, EXIT Partial + IDLE mode //################################################################## // Enter Sleep mode Setting control_out(0x0028,0x00B8); //GON=ЎЇ1ЎЇ DTE=ЎЇ1ЎЇ D[1:0]=ЎЇ10ЎЇ delay(40); control_out(0x001F,0x0089); // GAS=1, VOMG=00, PON=0, DK=1, XDK=0, DVDH_TRI=0, STB=1 delay(40); control_out(0x0028,0x0004); //GON=ЎЇ0ЎЇ DTE=ЎЇ0ЎЇ D[1:0]=ЎЇ01ЎЇ delay(40); control_out(0x0019,0x0000); //OSC_EN=ЎЇ0ЎЇ delay(5); // Exit Sleep mode Setting control_out(0x0018,0x0036); //I/P_RADJ,N/P_RADJ, Normal mode 75Hz control_out(0x0019,0x0001); //OSC_EN='1', start Osc control_out(0x001F,0x0088);// GAS=1, VOMG=00, PON=0, DK=1, XDK=0, DVDH_TRI=0, STB=0 delay(5); control_out(0x001F,0x0080);// GAS=1, VOMG=00, PON=0, DK=0, XDK=0, DVDH_TRI=0, STB=0 delay(5); control_out(0x001F,0x0090);// GAS=1, VOMG=00, PON=1, DK=0, XDK=0, DVDH_TRI=0, STB=0 delay(5); control_out(0x001F,0x00D0);// GAS=1, VOMG=10, PON=1, DK=0, XDK=0, DDVDH_TRI=0, STB=0 delay(5); control_out(0x0028,0x0038); //GON=1, DTE=1, D=1000 delay(40); control_out(0x0028,0x003F); //GON=1, DTE=1, D=1100 // Enter Deep Sleep mode Setting control_out(0x0028,0x00B8); //GON=ЎЇ1ЎЇ DTE=ЎЇ1ЎЇ D[1:0]=ЎЇ10ЎЇ delay(40); control_out(0x001F,0x0089); // GAS=1, VOMG=00, PON=0, DK=1, XDK=0, DVDH_TRI=0, STB=1 delay(40); control_out(0x0028,0x0004); //GON=ЎЇ0ЎЇ DTE=ЎЇ0ЎЇ D[1:0]=ЎЇ01ЎЇ delay(40); control_out(0x0019,0x0000); //OSC_EN=ЎЇ0ЎЇ delay(5); control_out(0x0001,0x00C0); //DP_STB[1:0]=ЎЇ11ЎЇ // Exit Deep Sleep mode Setting control_out(0x0001,0x0000); //DP_STB='0', out deep sleep delay(10); control_out(0x0019,0x0001); //OSC_EN='1', start Osc control_out(0x001F,0x0088);// GAS=1, VOMG=00, PON=0, DK=1, XDK=0, DVDH_TRI=0, STB=0 delay(5); control_out(0x001F,0x0080);// GAS=1, VOMG=00, PON=0, DK=0, XDK=0, DVDH_TRI=0, STB=0 delay(5); control_out(0x001F,0x0090);// GAS=1, VOMG=00, PON=1, DK=0, XDK=0, DVDH_TRI=0, STB=0 delay(5); control_out(0x001F,0x00D0);// GAS=1, VOMG=10, PON=1, DK=0, XDK=0, DDVDH_TRI=0, STB=0 delay(5); control_out(0x0028,0x0038); //GON=1, DTE=1, D=1000 delay(40); control_out(0x0028,0x003F); //GON=1, DTE=1, D=1100 LCD_Index_Out(0x22); // Write Data Register } void show_rgb(unsigned int t,unsigned int b) { unsigned int i,j; LCD_Index_Out(0x22); for(i=0;i<1;i++) { for(j=0;j<240;j++) LCD_Data_Out1(t); } { for(i=0;i<318;i++) { for(j=0;j<1;j++) LCD_Data_Out1(t); for(j=0;j<238;j++) LCD_Data_Out1(b); for(j=0;j<1;j++) LCD_Data_Out1(t); } } for(i=0;i<1;i++) { for(j=0;j<240;j++) LCD_Data_Out1(t); } } void show_Gray_scale(void) { unsigned char Gray[]={ 0x08, 0x41, // level 0 black 0x18, 0xc3, // level 1 0x29, 0x65, // level 2 0x39, 0xe7, // level 3 0x4a, 0x69, // level 4 0x5a, 0xeb, // level 5 0x6b, 0x6d, // level 6 0x7b, 0xef, // level 7 0x8c, 0x71, // level 8 0x9c, 0xf3, // level 9 0xad, 0x75, // level 10 0xbd, 0xf7, // level 11 0xce, 0x79, // level 12 0xde, 0xfb, // level 13 0xef, 0x7d, // level 14 0Xff, 0Xff, // level 15 white }; int page = 0; int count = 0; int level = 0; LCD_Index_Out(0x22); for (page = 0; page < 320; page++) { //int i=0 ; for (level = 0; level < 16; level++) { for (count = 0; count < 15; count++) { LCD_Data_Out(Gray[level*2], Gray[level*2 + 1]); } } } } void Window(void) { unsigned int page,col; //-------------------------------------------------------- // First Line //-------------------------------------------------------- LCD_Index_Out(0x22); for(col = 0;col < 240;col++) { LCD_Data_Out(0xff,0xff); } //-------------------------------------------------------- LCD_Data_Out(0xff,0xff); for(col = 0;col < 238;col++) LCD_Data_Out(0x00,0x00); LCD_Data_Out(0xff,0xff); for(page = 0;page < 106;page++) { LCD_Data_Out(0xff,0xff); LCD_Data_Out(0x00,0x00); for(col = 0;col < 236;col++) LCD_Data_Out(0xff,0xff); LCD_Data_Out(0x00,0x00); LCD_Data_Out(0xff,0xff); } //-------------------------------------------------------- // windows //-------------------------------------------------------- for(page = 0;page < 104;page++) { LCD_Data_Out(0xff,0xff); LCD_Data_Out(0x00,0x00); for(col = 0;col < 78;col++) LCD_Data_Out(0xff,0xff); for(col = 0;col < 80;col++) LCD_Data_Out(0x00,0x00); for(col = 0;col < 78;col++) LCD_Data_Out(0xff,0xff); LCD_Data_Out(0x00,0x00); LCD_Data_Out(0xff,0xff); } //-------------------------------------------------------- // //-------------------------------------------------------- for(page = 0;page < 106;page++) { LCD_Data_Out(0xff,0xff); LCD_Data_Out(0x00,0x00); for(col = 0;col < 236;col++) LCD_Data_Out(0xff,0xff); LCD_Data_Out(0x00,0x00); LCD_Data_Out(0xff,0xff); } LCD_Data_Out(0xff,0xff); for(col = 0;col < 238;col++) LCD_Data_Out(0x00,0x00); LCD_Data_Out(0xff,0xff); for(col = 0;col < 240;col++) { LCD_Data_Out(0xff,0xff); } } /* void show_photo(void) { unsigned char j; unsigned int i; unsigned long s=0; LCD_Index_Out(0x22); for (i=0;i<90;i++) { for (j=0;j<240;j++) LCD_Data_Out(0XFF,0XFF); } for (i=0;i<130;i++) { for (j=0;j<240;j++) LCD_Data_Out(pic[s++],pic[s++]); } for (i=0;i<100;i++) { for (j=0;j<240;j++) LCD_Data_Out(0XFF,0XFF); } } */ void picc2() { int Row,Column,Addr=0X0000; int I=0; int RamData1,RamData2; MainAddset(); ////////////////////////////////////////// //BankSelect(Pic_number1); P10=0;P11=0;P12=0; for(Column=0;Column<320;Column++) { for(Row=0;Row<240;Row++) { Ram_chip_select2=0; RamData1=XBYTE[Addr++]; RamData2=XBYTE[Addr++]; Ram_chip_select2=1; LCD_Data_Out(RamData1,RamData2); if ((Column==136)&&(Row==126)) {P10=1;Addr=Addr-65536;} if ((Column==273)&&(Row==16)) { P10=0;P11=1;Addr=Addr-65536;} //if ((Column=136)&(Row=126)) // { P10=1;P11=1;P12=0;} }} //WaitKey(); /* for(Column=0;Column<320;Column++) { for(Row=0;Row<240;Row++) { Ram_chip_select2=0; RamData1=XBYTE[Addr++]; RamData2=XBYTE[Addr++]; Ram_chip_select2=1; LCD_Data_Out(RamData1,RamData2); if ((Column==89)&&(Row==144)) {P10=1;P11=1;P12=0;Addr=Addr-65536;} if ((Column==226)&&(Row==32)) { P10=0;P11=0;P12=1;Addr=Addr-65536;} // if ((Column=136)&(Row=126)) // { P10=1;P11=0;P12=1;} }} //WaitKey(); //Addr=0x1780; //P10=0;P11=0;P12=1; for(Column=0;Column<320;Column++) { for(Row=0;Row<240;Row++) { Ram_chip_select2=0; RamData1=XBYTE[Addr++]; RamData2=XBYTE[Addr++]; Ram_chip_select2=1; LCD_Data_Out(RamData1,RamData2); if ((Column==42)&&(Row==160)) {P10=1;P11=0;P12=1;Addr=Addr-65536;} if ((Column==179)&&(Row==48)) { P10=0;P11=1;P12=1;Addr=Addr-65536;} if ((Column==315)&&(Row==176)) { P10=1;P11=1;P12=1;Addr=Addr-65536;} }} //WaitKey(); */ Addr=0X0000; } void main(void) { Init_LCD(); LCD_Index_Out(0x22); while(1) { show_rgb(0x0000,0x0000); show_rgb(0xffff,0xffff); delay(800); show_rgb(0x07e0,0xf800); show_rgb(0x001f,0x07e0); show_rgb(0xf800,0x001f); show_Gray_scale(); Window(); // show_photo(); picc2(); } }setxy.h
1p 2p 3p 4p 5p 6p 7p 8parameter(byte) register 00 00 00 00 00 00 00 00 00 * register 00 00 00 00 00 00 00 00 00 * register 01 00 00 00 00 00 00 00 00 register 02 00 00 00 00 00 00 00 00 register 03 00 00 00 00 00 00 00 00 register 04 00 54 80 66 00 00 00 00 * register 05 00 00 00 00 00 00 00 00 register 06 00 00 00 00 00 00 00 00 register 07 00 00 00 00 00 00 00 00 register 08 00 00 00 00 00 00 00 00 register 09 00 00 61 00 00 00 00 00 register 0A 00 08 00 00 00 00 00 00 register 0B 00 00 00 00 00 00 00 00 register 0C 00 06 00 00 00 00 00 00 register 0D 00 00 00 00 00 00 00 00 register 0E 00 00 00 00 00 00 00 00 register 0F 00 00 00 00 00 00 00 00 register 10 00 00 00 00 00 00 00 00 register 11 00 00 00 00 00 00 00 00 register 12 00 00 00 00 00 00 00 00 register 13 00 00 00 00 00 00 00 00 register 14 00 00 00 00 00 00 00 00 register 15 00 00 00 00 00 00 00 00 register 16 00 00 00 00 00 00 00 00 register 17 00 00 00 00 00 00 00 00 register 18 00 00 00 00 00 00 00 00 register 19 00 00 00 00 00 00 00 00 register 1A 00 00 00 00 00 00 00 00 register 1B 00 00 00 00 00 00 00 00 register 1C 00 00 00 00 00 00 00 00 register 1D 00 00 00 00 00 00 00 00 register 1E 00 00 00 00 00 00 00 00 register 1F 00 00 00 00 00 00 00 00 register 20 00 00 00 00 00 00 00 00 register 21 00 00 00 00 00 00 00 00 register 22 00 00 00 00 00 00 00 00 register 23 00 00 00 00 00 00 00 00 register 24 00 00 00 00 00 00 00 00 register 25 00 00 00 00 00 00 00 00 register 26 00 00 00 00 00 00 00 00 register 27 00 00 00 00 00 00 00 00 register 28 00 00 00 00 00 00 00 00 register 29 00 00 00 00 00 00 00 00 register 2A 00 00 00 00 00 00 00 00 register 2B 00 00 00 00 00 00 00 00 register 2C 00 00 00 00 00 00 00 00 register 2D 00 00 00 00 00 00 00 00 register 2E 00 54 54 54 54 54 54 54 register 2F 00 00 00 00 00 00 00 00 register 30 00 00 00 00 00 00 00 00 register 31 00 00 00 00 00 00 00 00 register 32 00 00 00 00 00 00 00 00 register 33 00 00 00 00 00 00 00 00 register 34 00 00 00 00 00 00 00 00 register 35 00 00 00 00 00 00 00 00 register 36 00 00 00 00 00 00 00 00 register 37 00 00 00 00 00 00 00 00 register 38 00 00 00 00 00 00 00 00 register 39 00 00 00 00 00 00 00 00 register 3A 00 00 00 00 00 00 00 00 register 3B 00 00 00 00 00 00 00 00 register 3C 00 00 00 00 00 00 00 00 register 3D 00 00 00 00 00 00 00 00 register 3E 00 00 00 00 00 00 00 00 register 3F 00 00 00 00 00 00 00 00 register 40 00 00 00 00 00 00 00 00 register 41 00 00 00 00 00 00 00 00 register 42 00 00 00 00 00 00 00 00 register 43 00 00 00 00 00 00 00 00 register 44 00 00 00 00 00 00 00 00 register 45 00 00 00 00 00 00 00 00 register 46 00 00 00 00 00 00 00 00 register 47 00 00 00 00 00 00 00 00 register 48 00 00 00 00 00 00 00 00 register 49 00 00 00 00 00 00 00 00 register 4A 00 00 00 00 00 00 00 00 register 4B 00 00 00 00 00 00 00 00 register 4C 00 00 00 00 00 00 00 00 register 4D 00 00 00 00 00 00 00 00 register 4E 00 00 00 00 00 00 00 00 register 4F 00 00 00 00 00 00 00 00 register 50 00 00 00 00 00 00 00 00 register 51 00 00 00 00 00 00 00 00 register 52 00 00 00 00 00 00 00 00 register 53 00 00 00 00 00 00 00 00 register 54 00 00 00 00 00 00 00 00 register 55 00 00 00 00 00 00 00 00 register 56 00 00 00 00 00 00 00 00 register 57 00 00 00 00 00 00 00 00 register 58 00 00 00 00 00 00 00 00 register 59 00 00 00 00 00 00 00 00 register 5A 00 00 00 00 00 00 00 00 register 5B 00 00 00 00 00 00 00 00 register 5C 00 00 00 00 00 00 00 00 register 5D 00 00 00 00 00 00 00 00 register 5E 00 00 00 00 00 00 00 00 register 5F 00 00 00 00 00 00 00 00 register 60 00 00 00 00 00 00 00 00 register 61 00 00 00 00 00 00 00 00 register 62 00 00 00 00 00 00 00 00 register 63 00 00 00 00 00 00 00 00 register 64 00 00 00 00 00 00 00 00 register 65 00 00 00 00 00 00 00 00 register 66 00 00 00 00 00 00 00 00 register 67 00 00 00 00 00 00 00 00 register 68 00 00 00 00 00 00 00 00 register 69 00 00 00 00 00 00 00 00 register 6A 00 00 00 00 00 00 00 00 register 6B 00 00 00 00 00 00 00 00 register 6C 00 00 00 00 00 00 00 00 register 6D 00 00 00 00 00 00 00 00 register 6E 00 00 00 00 00 00 00 00 register 6F 00 00 00 00 00 00 00 00 register 70 00 00 00 00 00 00 00 00 register 71 00 00 00 00 00 00 00 00 register 72 00 00 00 00 00 00 00 00 register 73 00 00 00 00 00 00 00 00 register 74 00 00 00 00 00 00 00 00 register 75 00 00 00 00 00 00 00 00 register 76 00 00 00 00 00 00 00 00 register 77 00 00 00 00 00 00 00 00 register 78 00 00 00 00 00 00 00 00 register 79 00 00 00 00 00 00 00 00 register 7A 00 00 00 00 00 00 00 00 register 7B 00 00 00 00 00 00 00 00 register 7C 00 00 00 00 00 00 00 00 register 7D 00 00 00 00 00 00 00 00 register 7E 00 00 00 00 00 00 00 00 register 7F 00 00 00 00 00 00 00 00 register 80 00 00 00 00 00 00 00 00 register 81 00 00 00 00 00 00 00 00 register 82 00 00 00 00 00 00 00 00 register 83 00 00 00 00 00 00 00 00 register 84 00 00 00 00 00 00 00 00 register 85 00 00 00 00 00 00 00 00 register 86 00 00 00 00 00 00 00 00 register 87 00 00 00 00 00 00 00 00 register 88 00 00 00 00 00 00 00 00 register 89 00 00 00 00 00 00 00 00 register 8A 00 00 00 00 00 00 00 00 register 8B 00 00 00 00 00 00 00 00 register 8C 00 00 00 00 00 00 00 00 register 8D 00 00 00 00 00 00 00 00 register 8E 00 00 00 00 00 00 00 00 register 8F 00 00 00 00 00 00 00 00 register 90 00 00 00 00 00 00 00 00 register 91 00 00 00 00 00 00 00 00 register 92 00 00 00 00 00 00 00 00 register 93 00 00 00 00 00 00 00 00 register 94 00 00 00 00 00 00 00 00 register 95 00 00 00 00 00 00 00 00 register 96 00 00 00 00 00 00 00 00 register 97 00 00 00 00 00 00 00 00 register 98 00 00 00 00 00 00 00 00 register 99 00 00 00 00 00 00 00 00 register 9A 00 00 00 00 00 00 00 00 register 9B 00 00 00 00 00 00 00 00 register 9C 00 00 00 00 00 00 00 00 register 9D 00 00 00 00 00 00 00 00 register 9E 00 00 00 00 00 00 00 00 register 9F 00 00 00 00 00 00 00 00 register A0 00 00 00 00 00 00 00 00 register A1 00 00 00 00 00 00 00 00 register A2 00 00 00 00 00 00 00 00 register A3 00 00 00 00 00 00 00 00 register A4 00 00 00 00 00 00 00 00 register A5 00 00 00 00 00 00 00 00 register A6 00 00 00 00 00 00 00 00 register A7 00 00 00 00 00 00 00 00 register A8 00 00 00 00 00 00 00 00 register A9 00 00 00 00 00 00 00 00 register AA 00 00 00 00 00 00 00 00 register AB 00 00 00 00 00 00 00 00 register AC 00 00 00 00 00 00 00 00 register AD 00 00 00 00 00 00 00 00 register AE 00 00 00 00 00 00 00 00 register AF 00 00 00 00 00 00 00 00 register B0 00 00 00 00 00 00 00 00 register B1 00 00 10 10 10 10 10 10 register B2 00 00 10 10 10 10 10 10 register B3 00 00 10 10 10 10 10 10 register B4 00 02 00 00 00 00 00 00 register B5 00 02 02 0A 14 14 14 14 register B6 00 0A 02 27 27 27 27 27 register B7 00 06 06 06 06 06 06 06 register B8 00 89 11 7A 7A 7A 7A 7A register B9 00 2C 9A 7A 7A 7A 7A 7A register BA 00 00 00 00 00 00 00 00 register BB 00 00 00 00 00 00 00 00 register BC 00 00 00 00 00 00 00 00 register BD 00 00 00 00 00 00 00 00 register BE 00 00 00 00 00 00 00 00 register BF 00 00 00 00 00 00 00 00 * register C0 00 26 01 01 01 01 01 01 register C1 00 10 10 10 10 10 10 10 register C2 00 32 32 32 32 32 32 32 register C3 00 32 32 32 32 32 32 32 register C4 00 32 32 32 32 32 32 32 register C5 00 16 28 28 28 28 28 28 register C6 00 00 00 00 00 00 00 00 register C7 00 40 40 40 40 40 40 40 register C8 00 00 00 00 00 00 00 00 register C9 00 15 C0 02 70 70 70 70 register CA 00 03 00 00 00 00 00 00 register CB 00 01 A4 00 6A 6A 6A 6A register CC 00 39 0A 0A 0A 0A 0A 0A register CD 00 07 07 07 07 07 07 07 register CE 00 10 70 70 70 70 70 70 register CF 00 00 00 00 00 00 00 00 register D0 00 00 00 00 00 00 00 00 register D1 00 00 00 00 00 00 00 00 register D2 00 00 00 00 00 00 00 00 register D3 00 00 93 38 38 38 38 38 * register D4 00 00 00 00 00 00 00 00 register D5 00 00 00 00 00 00 00 00 register D6 00 00 00 00 00 00 00 00 register D7 00 00 00 00 00 00 00 00 register D8 00 00 00 00 00 00 00 00 register D9 00 00 00 00 00 00 00 00 register DA 00 54 00 00 00 00 00 00 register DB 00 80 00 00 00 00 00 00 register DC 00 66 00 00 00 00 00 00 register DD 00 00 00 00 00 00 00 00 register DE 00 04 04 04 04 04 04 04 register DF 00 FF 0F FF 0F FF 0F FF register E0 00 0F 22 1B 05 0C 03 49 register E1 00 00 23 26 05 10 04 39 register E2 00 00 00 00 00 00 00 00 register E3 00 00 00 00 00 00 00 00 register E4 00 00 00 00 00 00 00 00 register E5 00 00 00 00 00 00 00 00 register E6 00 00 00 00 00 00 00 00 register E7 00 00 00 00 00 00 00 00 register E8 00 00 00 00 00 00 00 00 register E9 00 00 00 00 00 00 00 00 register EA 00 00 00 00 00 00 00 00 register EB 00 00 00 00 00 00 00 00 register EC 00 00 00 00 00 00 00 00 register ED 00 00 00 00 00 00 00 00 register EE 00 00 00 00 00 00 00 00 register EF 00 00 00 00 00 00 00 00 * register F0 00 00 00 00 00 00 00 00 register F1 00 00 00 00 00 00 00 00 register F2 00 00 00 00 00 00 00 00 register F3 00 07 07 07 07 07 07 07 register F4 00 00 00 00 00 00 00 00 register F5 00 00 00 00 00 00 00 00 register F6 00 00 00 00 00 00 00 00 register F7 00 00 00 00 00 00 00 00 register F8 00 00 00 00 00 00 00 00 register F9 00 00 00 00 00 00 00 00 register FA 00 00 00 00 00 00 00 00 register FB 00 00 00 00 00 00 00 00 register FC 00 00 00 00 00 00 00 00 register FD 00 00 00 00 00 00 00 00 register FE 00 00 00 00 00 00 00 00 register FF 00 00 00 00 00 00 00 00здесь видим характерные для больших дисплеев 0x80
register 04 00 54 80 66 ( 0x54 0x80 0x66 ) и
инит и даташит толком небыло в инете
init code ili9338 ili9338b переписанный с PDF , уже переделал в формат UTFT, для файла initlcd.h
setxy.h
вот еще один инит:
но самый короткий инит получился:
LCD_Write_COM(0x11);// обязательно delay(100); //LCD_Write_COM(0x13); LCD_Write_COM(0x3A); // Pixel Format Set LCD_Write_DATA(0x05); //0x05-65k color565 LCD_Write_COM(0x36); // Memory Acces Control LCD_Write_DATA(0x48); //e8-orig , 48-ili9327 16bit! , LCD_Write_COM(0x29); // обязательно LCD_Write_COM(0x2C); // обязательноВот архив , где собрал datasheet ili9338 ( ili9338b ) , hx8347d , hx8347a hx8347b hx8347g ili9335 ili9340 ili9342 , подготовленные UTFT для 16 и 8 битного режимов.
https://yadi.sk/d/7eSf9jMXqsFuX
эти экраны, как и все остальные, ещё есть в магазинах в разных городах по смешным 50руб ценам.
на здоровье :) . благодарение принимается :)