Бибилиотека LCD Nokia 1616 (SPFD54124B)
- Войдите на сайт для отправки комментариев
Пнд, 05/01/2015 - 17:44
Не могу добиться инициализации. Мусор есть, нормальной инициализации нет. Есть у кого библиотека?
Не могу добиться инициализации. Мусор есть, нормальной инициализации нет. Есть у кого библиотека?
Дописал библиотеку. Новая проблема. Подключаю к Arduino Nano V3, дисплей пересвечен, тянучки за цветными пикселями, странные полосы в пересвете. Библиотека написана на основе статей в интернете и библиотеки HX8340B. Всё вроде стандартно. Думал уровни высокие 5В, все шины кроме CS на ограничительный резистор ни как не реагируют. Как только по линии CS фронт сигнала падает ниже 4,5В - изо пропадает, но ближе к этому напряжению пересвет почти порпадает, появляется нормальный чёрный.
В чём я ошибся? Напряжение питания дисплея 3,3В. Перебрал 3 дисплея всё то же.
там и питание и сигналы все 3.3В. может попалил уже контроллер дисплея
http://yadi.sk/d/CXjuENmaEEwun
в папке дисплеи смотри. софтварный и хардваный spi для 1616
Легко мог спалить, эти дисплеи не живут долго если на них подавать больше 3.3в
Хардверный? Наверно все таки комбинированный потому как у атмеги нет 9ти битного Spi в железе
ну да комбинированный. первый бит софтварно. но остальное хардварно, поэтому гораздо быстрее
Вряд ли попалил. Инициализация есть, графику символы выводит, на команды реагирует. Пробовал новый дисплей запускать сразу через согласователь уровней, который сделал на 74LVC08- инициализации нет. Если линию CS пустить без согласования, то инициализация естьЮ но с такой вот какой. Ну соответвенно изо становится нормальным при снижении уровня сигнала CS.
Может дисплей на другом контроллере, либо с напряжениями при инициализации поиграть нужно?
JXD-SYXB006
WD-F1216XZ-6FLWd 4850266
S3159060003A0015S005
кстати я reset не использовал. ну вообще. вроде к 3.3В подключен. все управление по 3 пинам
Так же не использую reset
я проверил свой код на 2 дисплеях. не работает сам голову ломай
Возьмите мой код с радиокота в статьях. Чтобы исключить проблему согласования уровней запитайтн МК от 3.3в
Возьмите мой код с радиокота в статьях. Чтобы исключить проблему согласования уровней запитайтн МК от 3.3в
глядя на ваш код и дописывал библиотеку под графику Adafruit
питать от 3,3в пробовал в первую очередь, нет инициализации, данные бегут, проверял осцилографом
я проверил свой код на 2 дисплеях. не работает сам голову ломай
ваш код смотрел с ним работает так же как и с моим
значит пожгли немного контроллер дисплея. надо было сначала в интернете посмотреть что нужно согласовывать уровни
да то что согласовывать нужно я и так знаю, уже не один дисплей пробовал, начиная со второго через ограничительные резисторы 4,7Ком
3 дисплей сразу включал через логику И (что под рукой было), тоже нет инициализации. странная ерунда с этой линией CS, поеду за 4 дисплеем
ограничительные резисторы 4,7Ком
нужны не ограничительные резисторы, а резистивные делители
ограничительные резисторы это шаманство которое применили в ряде конструкций. но вот не факт, что именно 1616 выживет с ограничительным резистором
когда вы ставите ограничительный резистор вместо делителя, то по сути у вас возникает делитель между вашим резистором и внутренним входным сопротивлением контроллера. Откуда вы знаете какое там сопротивление? А если оно много больше 4.7ком и в результате на вход контроллера попадет напряжение выше нормы?
в тестах о которых я пишу в статье я применял резистивные делители, они там есть на схеме. А в устройстве которое я сделал МК питается от 3.3В. Так что могу утверждать что должно работать и так и так
1616 прекрасно у меня выжил просто с 4.7к. или 5.1к не помню)
1616 прекрасно у меня выжил просто с 4.7к. или 5.1к не помню)
ну хорошо) все равно шаманство)
знаю. просто трассировка с делителями неудобная)))
трассировка вообще не удобна)) мечтаю о большой толстой микросхеме в которой все соединения можно внутри запрограмировать, а не разводить
ПЛИС это уже большой шаг в эту сторону, но не совсем то
включил от 3,3В - нет инициализации
купил ещё один дисплей, включил сразу через 74LVC08 - нет инициализации
постепенно начал поднимать напряжение питание и дёргал резет на контроллере, включение с согласованием - нет инициализации
постепенно начал поднимать напряжение питание и дёргал резет на контроллере, включение без согласования - инициализация примерно на 4,3В, ближе к нормальной, но в пересвет в углах сохраняется и полосы
какой вывод?)))
что ж творится то)
порядок инициализации
0x01
0x11
0x13
0x3A 0xC5
0x29
как рерализовать чтение по SPI 9 bit 3 pin? хочется посмотреть может контроллер другой
В моей статье в конце есть ссылка на универсальную плату для дисплея нокия. В ней есть библиотека с чтением ID контроллера. Попробуйте прочитать. Еще рекомендую свою проблему описать здесь http://radiokot.ru/forum/viewtopic.php?f=61&t=78889&sid=bd6f4e0a31b3de5cc3a78866aa3be72b
NokiaSuperbreakout использует 4 pin spi как я понял :(
мало того, для этого контроллера параллельный интерфейс описан
странная инициализация. у меня такая.
const int init_lcd1616ph[] = { 0xBA, 0x107, 0x115, // Data Order 0x25, 0x13F, // Contrast 0x11, // Sleep Out 0x13, // Display Normal mode 0x37,0x100, // VSCROLL ADDR 0x3A,0x105, // COLMOD pixel format 4=12,5=16,6=18 0x29, // DISPON 0x20, // INVOFF 0x13 // NORON };параметры по умолчанию прописывать не обязательно
переустановил ардуино софт, снова переписал библиотеку, ещё раз 20 перешил и вдруг появилась нормальная инициализация - загадка
и ещё одна загадка следом, один раз из 10 смещение гаммы, в инициализации прописывать пробовал, не влияет
Здравствуйте. Подскажите, что за библиотеку вы используете?
Я кусок на чистом си нашёл, попробовал через STK500 управлять - тоже мусор. Пишут что можно по цвету шлейфа посмотреть какой контроллер стоит. У меня - зелёный шлейф.
Подскажите, как посмотреть начало темы, а то у меня только последние ответы отображаются.
Всем доброго времени суток. Пытаюсь запустить LCD nokia 1616 при помощи Arduino но всё тщетно инициализация не проходит, шума ни какого нет дисп молчит. На Bascom всё работает а под ардуиной нет. В качестве примера беру софтовый вариант по ссылке из этого сообщения.
там и питание и сигналы все 3.3В. может попалил уже контроллер дисплея
http://yadi.sk/d/CXjuENmaEEwun
в папке дисплеи смотри. софтварный и хардваный spi для 1616
Дисп цепляю на PORTB (ATMEGA16)
предполагаю что возможно ардуино криво компилит так как в ней нет готового варианта для ATMEGA16.
Но в тоже время примитив с миганием светодиода работает. Прошу направить нужное русло.
"На Bascom всё работает а под ардуиной нет" это один и тот же дисплей? точно пины не перепутал?
Всё один к одному.
Сейчас переткнул на хардовый SPI
Рабочий конфиг Bascom
Конфиг Arduino
Причём Ардуино в хард версии выдёт ошибку lvalue required as left operand of assignment
Вот в этот кусок
lcd_write_cmd(0x36); // Ориентация дисплея if (mode == 0){ lcd_write_dat(0xC0); // 0 градусов DISP_W = 128; DISP_H = 160; } if (mode == 1){ lcd_write_dat(0xA0); // 90 градусов DISP_W = 160; DISP_H = 128; } if (mode == 2){ lcd_write_dat(0x00); // 180 градусов DISP_W = 128; DISP_H = 160; } if (mode == 3){ lcd_write_dat(0x60); // 270 градусов DISP_W = 160; DISP_H = 128; }Попробовал поставить == в DISP_H = 128 и т д
компиляция проходит, в хард версии происходит сброс диспа, чего не происходит в софт версии.
Хотя оно и понятно на хард висит программатор
#include <avr/pgmspace.h> static const byte FONT8x15[97][15] PROGMEM ={ {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, {0x00,0x00,0x18,0x3C,0x3C,0x3C,0x18,0x18,0x18,0x00,0x18,0x18,0x00,0x00,0x00}, // ! {0x00,0x63,0x63,0x63,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // " {0x00,0x00,0x00,0x36,0x36,0x7F,0x36,0x36,0x36,0x7F,0x36,0x36,0x00,0x00,0x00}, // # {0x0C,0x0C,0x3E,0x63,0x61,0x60,0x3E,0x03,0x03,0x43,0x63,0x3E,0x0C,0x0C,0x00}, // $ {0x00,0x00,0x00,0x00,0x00,0x61,0x63,0x06,0x0C,0x18,0x33,0x63,0x00,0x00,0x00}, // % {0x00,0x00,0x00,0x1C,0x36,0x36,0x1C,0x3B,0x6E,0x66,0x66,0x3B,0x00,0x00,0x00}, // & {0x00,0x30,0x30,0x30,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // ' {0x00,0x00,0x0C,0x18,0x18,0x30,0x30,0x30,0x30,0x18,0x18,0x0C,0x00,0x00,0x00}, // ( {0x00,0x00,0x18,0x0C,0x0C,0x06,0x06,0x06,0x06,0x0C,0x0C,0x18,0x00,0x00,0x00}, // ) {0x00,0x00,0x00,0x00,0x42,0x66,0x3C,0xFF,0x3C,0x66,0x42,0x00,0x00,0x00,0x00}, // * {0x00,0x00,0x00,0x00,0x18,0x18,0x18,0xFF,0x18,0x18,0x18,0x00,0x00,0x00,0x00}, // + {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x18,0x30,0x00}, // , {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // - {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00}, // . {0x00,0x00,0x01,0x03,0x07,0x0E,0x1C,0x38,0x70,0xE0,0xC0,0x80,0x00,0x00,0x00}, // / (forward slash) {0x00,0x00,0x3E,0x63,0x63,0x63,0x67,0x6B,0x73,0x63,0x63,0x3E,0x00,0x00,0x00}, // 0 0x30 {0x00,0x00,0x0C,0x1C,0x3C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x3F,0x00,0x00,0x00}, // 1 {0x00,0x00,0x3E,0x63,0x03,0x06,0x0C,0x18,0x30,0x61,0x63,0x7F,0x00,0x00,0x00}, // 2 {0x00,0x00,0x3E,0x63,0x03,0x03,0x1E,0x03,0x03,0x03,0x63,0x3E,0x00,0x00,0x00}, // 3 {0x00,0x00,0x06,0x0E,0x1E,0x36,0x66,0x66,0x7F,0x06,0x06,0x0F,0x00,0x00,0x00}, // 4 {0x00,0x00,0x7F,0x60,0x60,0x60,0x7E,0x03,0x03,0x63,0x73,0x3E,0x00,0x00,0x00}, // 5 {0x00,0x00,0x1C,0x30,0x60,0x60,0x7E,0x63,0x63,0x63,0x63,0x3E,0x00,0x00,0x00}, // 6 {0x00,0x00,0x7F,0x63,0x03,0x06,0x06,0x0C,0x0C,0x18,0x18,0x18,0x00,0x00,0x00}, // 7 {0x00,0x00,0x3E,0x63,0x63,0x63,0x3E,0x63,0x63,0x63,0x63,0x3E,0x00,0x00,0x00}, // 8 {0x00,0x00,0x3E,0x63,0x63,0x63,0x63,0x3F,0x03,0x03,0x06,0x3C,0x00,0x00,0x00}, // 9 {0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00}, // : {0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x18,0x18,0x18,0x30,0x00}, // ; {0x00,0x00,0x00,0x06,0x0C,0x18,0x30,0x60,0x30,0x18,0x0C,0x06,0x00,0x00,0x00}, // < {0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x00,0x7E,0x00,0x00,0x00,0x00,0x00}, // = {0x00,0x00,0x00,0x60,0x30,0x18,0x0C,0x06,0x0C,0x18,0x30,0x60,0x00,0x00,0x00}, // > {0x00,0x00,0x3E,0x63,0x63,0x06,0x0C,0x0C,0x0C,0x00,0x0C,0x0C,0x00,0x00,0x00}, // ? {0x00,0x00,0x3E,0x63,0x63,0x6F,0x6B,0x6B,0x6E,0x60,0x60,0x3E,0x00,0x00,0x00}, // @ 0x40 {0x00,0x00,0x08,0x1C,0x36,0x63,0x63,0x63,0x7F,0x63,0x63,0x63,0x00,0x00,0x00}, // A {0x00,0x00,0x7E,0x33,0x33,0x33,0x3E,0x33,0x33,0x33,0x33,0x7E,0x00,0x00,0x00}, // B {0x00,0x00,0x1E,0x33,0x61,0x60,0x60,0x60,0x60,0x61,0x33,0x1E,0x00,0x00,0x00}, // C {0x00,0x00,0x7C,0x36,0x33,0x33,0x33,0x33,0x33,0x33,0x36,0x7C,0x00,0x00,0x00}, // D {0x00,0x00,0x7F,0x33,0x31,0x34,0x3C,0x34,0x30,0x31,0x33,0x7F,0x00,0x00,0x00}, // E {0x00,0x00,0x7F,0x33,0x31,0x34,0x3C,0x34,0x30,0x30,0x30,0x78,0x00,0x00,0x00}, // F {0x00,0x00,0x1E,0x33,0x61,0x60,0x60,0x6F,0x63,0x63,0x37,0x1D,0x00,0x00,0x00}, // G {0x00,0x00,0x63,0x63,0x63,0x63,0x7F,0x63,0x63,0x63,0x63,0x63,0x00,0x00,0x00}, // H {0x00,0x00,0x3C,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00}, // I {0x00,0x00,0x0F,0x06,0x06,0x06,0x06,0x06,0x06,0x66,0x66,0x3C,0x00,0x00,0x00}, // J {0x00,0x00,0x73,0x33,0x36,0x36,0x3C,0x36,0x36,0x33,0x33,0x73,0x00,0x00,0x00}, // K {0x00,0x00,0x78,0x30,0x30,0x30,0x30,0x30,0x30,0x31,0x33,0x7F,0x00,0x00,0x00}, // L {0x00,0x00,0x63,0x77,0x7F,0x6B,0x63,0x63,0x63,0x63,0x63,0x63,0x00,0x00,0x00}, // M {0x00,0x00,0x63,0x63,0x73,0x7B,0x7F,0x6F,0x67,0x63,0x63,0x63,0x00,0x00,0x00}, // N {0x00,0x00,0x1C,0x36,0x63,0x63,0x63,0x63,0x63,0x63,0x36,0x1C,0x00,0x00,0x00}, // O {0x00,0x00,0x7E,0x33,0x33,0x33,0x3E,0x30,0x30,0x30,0x30,0x78,0x00,0x00,0x00}, // P 0x50 {0x00,0x00,0x3E,0x63,0x63,0x63,0x63,0x63,0x63,0x6B,0x6F,0x3E,0x06,0x07,0x00}, // Q {0x00,0x00,0x7E,0x33,0x33,0x33,0x3E,0x36,0x36,0x33,0x33,0x73,0x00,0x00,0x00}, // R {0x00,0x00,0x3E,0x63,0x63,0x30,0x1C,0x06,0x03,0x63,0x63,0x3E,0x00,0x00,0x00}, // S {0x00,0x00,0xFF,0xDB,0x99,0x18,0x18,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00}, // T {0x00,0x00,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x3E,0x00,0x00,0x00}, // U {0x00,0x00,0x63,0x63,0x63,0x63,0x63,0x63,0x63,0x36,0x1C,0x08,0x00,0x00,0x00}, // V {0x00,0x00,0x63,0x63,0x63,0x63,0x63,0x6B,0x6B,0x7F,0x36,0x36,0x00,0x00,0x00}, // W {0x00,0x00,0xC3,0xC3,0x66,0x3C,0x18,0x18,0x3C,0x66,0xC3,0xC3,0x00,0x00,0x00}, // X {0x00,0x00,0xC3,0xC3,0xC3,0x66,0x3C,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00}, // Y {0x00,0x00,0x7F,0x63,0x43,0x06,0x0C,0x18,0x30,0x61,0x63,0x7F,0x00,0x00,0x00}, // Z {0x00,0x00,0x3C,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x3C,0x00,0x00,0x00}, // [ {0x00,0x00,0x80,0xC0,0xE0,0x70,0x38,0x1C,0x0E,0x07,0x03,0x01,0x00,0x00,0x00}, // \ (back slash) {0x00,0x00,0x3C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x3C,0x00,0x00,0x00}, // ] {0x08,0x1C,0x36,0x63,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // ^ {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00}, // _ {0x18,0x18,0x0C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // ` 0x60 {0x00,0x00,0x00,0x00,0x00,0x3C,0x46,0x06,0x3E,0x66,0x66,0x3B,0x00,0x00,0x00}, // a {0x00,0x00,0x70,0x30,0x30,0x3C,0x36,0x33,0x33,0x33,0x33,0x6E,0x00,0x00,0x00}, // b {0x00,0x00,0x00,0x00,0x00,0x3E,0x63,0x60,0x60,0x60,0x63,0x3E,0x00,0x00,0x00}, // c {0x00,0x00,0x0E,0x06,0x06,0x1E,0x36,0x66,0x66,0x66,0x66,0x3B,0x00,0x00,0x00}, // d {0x00,0x00,0x00,0x00,0x00,0x3E,0x63,0x63,0x7E,0x60,0x63,0x3E,0x00,0x00,0x00}, // e {0x00,0x00,0x1C,0x36,0x32,0x30,0x7C,0x30,0x30,0x30,0x30,0x78,0x00,0x00,0x00}, // f {0x00,0x00,0x00,0x00,0x00,0x3B,0x66,0x66,0x66,0x66,0x3E,0x06,0x66,0x3C,0x00}, // g {0x00,0x00,0x70,0x30,0x30,0x36,0x3B,0x33,0x33,0x33,0x33,0x73,0x00,0x00,0x00}, // h {0x00,0x00,0x0C,0x0C,0x00,0x1C,0x0C,0x0C,0x0C,0x0C,0x0C,0x1E,0x00,0x00,0x00}, // i {0x00,0x00,0x06,0x06,0x00,0x0E,0x06,0x06,0x06,0x06,0x06,0x66,0x66,0x3C,0x00}, // j {0x00,0x00,0x70,0x30,0x30,0x33,0x33,0x36,0x3C,0x36,0x33,0x73,0x00,0x00,0x00}, // k {0x00,0x00,0x1C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x1E,0x00,0x00,0x00}, // l {0x00,0x00,0x00,0x00,0x00,0x6E,0x7F,0x6B,0x6B,0x6B,0x6B,0x6B,0x00,0x00,0x00}, // m {0x00,0x00,0x00,0x00,0x00,0x6E,0x33,0x33,0x33,0x33,0x33,0x33,0x00,0x00,0x00}, // n {0x00,0x00,0x00,0x00,0x00,0x3E,0x63,0x63,0x63,0x63,0x63,0x3E,0x00,0x00,0x00}, // o {0x00,0x00,0x00,0x00,0x00,0x6E,0x33,0x33,0x33,0x33,0x3E,0x30,0x30,0x78,0x00}, // p 0x70 {0x00,0x00,0x00,0x00,0x00,0x3B,0x66,0x66,0x66,0x66,0x3E,0x06,0x06,0x0F,0x00}, // q {0x00,0x00,0x00,0x00,0x00,0x6E,0x3B,0x33,0x30,0x30,0x30,0x78,0x00,0x00,0x00}, // r {0x00,0x00,0x00,0x00,0x00,0x3E,0x63,0x38,0x0E,0x03,0x63,0x3E,0x00,0x00,0x00}, // s {0x00,0x00,0x08,0x18,0x18,0x7E,0x18,0x18,0x18,0x18,0x1B,0x0E,0x00,0x00,0x00}, // t {0x00,0x00,0x00,0x00,0x00,0x66,0x66,0x66,0x66,0x66,0x66,0x3B,0x00,0x00,0x00}, // u {0x00,0x00,0x00,0x00,0x00,0x63,0x63,0x36,0x36,0x1C,0x1C,0x08,0x00,0x00,0x00}, // v {0x00,0x00,0x00,0x00,0x00,0x63,0x63,0x63,0x6B,0x6B,0x7F,0x36,0x00,0x00,0x00}, // w {0x00,0x00,0x00,0x00,0x00,0x63,0x36,0x1C,0x1C,0x1C,0x36,0x63,0x00,0x00,0x00}, // x {0x00,0x00,0x00,0x00,0x00,0x63,0x63,0x63,0x63,0x63,0x3F,0x03,0x06,0x3C,0x00}, // y {0x00,0x00,0x00,0x00,0x00,0x7F,0x66,0x0C,0x18,0x30,0x63,0x7F,0x00,0x00,0x00}, // z {0x00,0x00,0x0E,0x18,0x18,0x18,0x70,0x18,0x18,0x18,0x18,0x0E,0x00,0x00,0x00}, // { {0x00,0x00,0x18,0x18,0x18,0x18,0x18,0x00,0x18,0x18,0x18,0x18,0x18,0x00,0x00}, // | {0x00,0x00,0x70,0x18,0x18,0x18,0x0E,0x18,0x18,0x18,0x18,0x70,0x00,0x00,0x00}, // } {0x00,0x00,0x3B,0x6E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // ~ {0x00,0x70,0xD8,0xD8,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00} };#define CS 10 #define DAT 11 #define CLK 13 #define SPI_OFF SPCR = 0; #define SPI_ON SPCR = _BV(MSTR) | _BV(SPE); #define SPI_WAIT while (!(SPSR & _BV(SPIF))); // определение основных цветов 16bit #define BLACK 0x0000 #define WHITE 0xffff #define RED 0xF800 #define GREEN 0x07E0 #define BLUE 0x001F #define YELLOW 0xFFE0 //Желтый #define CYAN 0x07FF //Голубой #define MAGENTA 0xDEE0 //Фиолетовый byte DISP_W=128; byte DISP_H=160; #define CHAR_W 8 #define CHAR_H 15 #define CS_On PORTB = 1<<2 // CS PB2 #define CS_Off PORTB = 0<<2 #define DAT_On PORTB = 1<<3 // Data PB3 #define DAT_Off PORTB = 0<<3 #define CLK_On PORTB = 1<<5 // Clock PB5 #define CLK_Off PORTB = 0<<5 unsigned int bgcolor=GREEN; //=============================Вывод на дисплей 8 бит комманд=================================== void lcd_write_cmd(byte c){ SPI_WAIT; SPI_OFF; DAT_Off; CLK_On; CLK_Off; SPI_ON; SPDR = c; } //=============================Вывод на дисплей 8 бит данных==================================== void lcd_write_dat(byte c){ SPI_WAIT; SPI_OFF; DAT_On; CLK_On; CLK_Off; SPI_ON; SPDR = c; } //============================Вывод на дисплей 16 бит данных==================================== void lcd_write16(unsigned int dat){ lcd_write_dat(dat>>8); lcd_write_dat(dat); } //================================Инициализация дисплея========================================= void lcd_init_rgb(byte mode){ SPSR |= 8; // 2x clock SPI_ON; SPDR = 0x00; CS_Off; delay(10); CS_On; lcd_write_cmd(0x01); delay(50); //reset CS_Off; lcd_write_cmd(0xBA); // Порядок отсылки данных lcd_write_dat(0x07); lcd_write_dat(0x15); lcd_write_cmd(0x25); // Контраст lcd_write_dat(0x3F); lcd_write_cmd(0x11); // Выход из режима sleep, (0x10) sleep lcd_write_cmd(0x14); lcd_write_cmd(0x37); // Дополнительные настройки lcd_write_dat(0x00); lcd_write_cmd(0x3A); lcd_write_dat(0x05); lcd_write_cmd(0x29); // Включить дисплей, (0x28) выключить lcd_write_cmd(0x20); // Нормальный режим, (0x21) инвертированный lcd_write_cmd(0x36); // Ориентация дисплея if (mode == 0){ lcd_write_dat(0xC0); // 0 градусов DISP_W = 128; DISP_H = 160; } if (mode == 1){ lcd_write_dat(0xA0); // 90 градусов DISP_W = 160; DISP_H = 128; } if (mode == 2){ lcd_write_dat(0x00); // 180 градусов DISP_W = 128; DISP_H = 160; } if (mode == 3){ lcd_write_dat(0x60); // 270 градусов DISP_W = 160; DISP_H = 128; } lcd_write_cmd(0x13); CS_Off; } //===================================Заливка дисплея============================================ void LCD_Fill_all(unsigned int color){ LCD_Window(0, 0, DISP_W, DISP_H); byte i=DISP_H; byte j; while(i--){ j=DISP_W; while(j--){ lcd_write16((color)); } } } //================================Переход в координаты XY======================================= void LCD_XY(byte x, byte y){ lcd_write_cmd(0x2A); //x-координата lcd_write16(x+2); lcd_write_cmd(0x2B);//Y-координата lcd_write16(y+1); } //============================Создание области для рисования==================================== void LCD_Window(byte x, byte y, byte w, byte h){ lcd_write_cmd(0x2A); //x-координата lcd_write16(x+2); lcd_write16(x+w+1); lcd_write_cmd(0x2B);//Y-координата lcd_write16(y+1); lcd_write16(y+h+1); lcd_write_cmd(0x2C); } //====================================Рисуем пиксель============================================ void LCD_Pixel(byte x, byte y, int color){ LCD_XY(x,y); lcd_write_cmd(0x2C);// WR_MEM lcd_write16(color); } //===========================Вывод символа в XY заданного цвета================================= void LCD_Char(byte x, byte y, unsigned char c, unsigned int color){ byte ch; byte mask = 0x80; LCD_Window(x, y, CHAR_W, CHAR_H); for (byte h=0; h<CHAR_H; h++){ // every column of the character ch=pgm_read_byte(&(FONT8x15[c-32][h])); mask = 0x80; for (byte p=0; p<CHAR_W; p++){ // write the pixels (ch & mask)? lcd_write16(color) : lcd_write16(bgcolor); mask >>= 1; } } } //===========================Вывод текста в XY заданного цвета================================== void put_string(byte x, byte y, char *str, unsigned int color){ unsigned char j; j=0; while (j<strlen(str)){ LCD_Char((x+j*CHAR_W),y,str[j], color); j++; } }//===================================Линия======================================= void LCD_Line(byte x0, byte y0, byte x1, byte y1, unsigned int color){ int dy = y1 - y0; int dx = x1 - x0; int stepx, stepy; if (dy < 0){ dy = -dy; stepy = -1; } else stepy = 1; if (dx < 0){ dx = -dx; stepx = -1; } else stepx = 1; dy <<= 1; // dy is now 2*dy dx <<= 1; // dx is now 2*dx LCD_Pixel(x0, y0, color); if (dx > dy) { int fraction = dy - (dx >> 1); // same as 2*dy - dx while (x0 != x1){ if (fraction >= 0) { y0 += stepy; fraction -= dx; // same as fraction -= 2*dx } x0 += stepx; fraction += dy; // same as fraction -= 2*dy LCD_Pixel(x0, y0, color); } } else{ int fraction = dx - (dy >> 1); while (y0 != y1){ if (fraction >= 0){ x0 += stepx; fraction -= dy; } y0 += stepy; fraction += dx; LCD_Pixel(x0, y0, color); } } } //==========================================Круг=============================================== void LCD_Circle(byte x0, byte y0, byte r, unsigned int color) { int16_t f = 1 - r; int16_t ddF_x = 1; int16_t ddF_y = -2 * r; int16_t x = 0; int16_t y = r; LCD_Pixel(x0 , y0+r, color); LCD_Pixel(x0 , y0-r, color); LCD_Pixel(x0+r, y0 , color); LCD_Pixel(x0-r, y0 , color); while (x<y) { if (f >= 0) { y--; ddF_y += 2; f += ddF_y; } x++; ddF_x += 2; f += ddF_x; LCD_Pixel(x0 + x, y0 + y, color); LCD_Pixel(x0 - x, y0 + y, color); LCD_Pixel(x0 + x, y0 - y, color); LCD_Pixel(x0 - x, y0 - y, color); LCD_Pixel(x0 + y, y0 + x, color); LCD_Pixel(x0 - y, y0 + x, color); LCD_Pixel(x0 + y, y0 - x, color); LCD_Pixel(x0 - y, y0 - x, color); } } void LCD_VLine(byte x, byte y, byte h, unsigned int color) { LCD_Line(x, y, x, y+h-1, color); } void LCD_HLine(byte x, byte y, byte w, unsigned int color) { LCD_Line(x, y, x+w-1, y, color); } void LCD_Rect(byte x, byte y, byte w, byte h, unsigned int color) { LCD_HLine(x, y, w, color); LCD_HLine(x, y+h-1, w, color); LCD_VLine(x, y, h, color); LCD_VLine(x+w-1, y, h, color); } void LCD_drawBitmap(byte x, byte y, const byte *bitmap, byte w, byte h, unsigned int color){ byte i, j, byteWidth = (w + 7) / 8; for(j=0; j<h; j++) { for(i=0; i<w; i++ ) { if(pgm_read_byte(bitmap + j * byteWidth + i / 8) & (128 >> (i & 7))) { LCD_Pixel(x+i, y+j, color); } } } }//LCD_XY(x, y); //LCD_Pixel(x, y, color); //LCD_Char(x, y, char, color); //put_string(x, y, char *str, color); //LCD_Circle(x0, y0, r, color); //LCD_Line(x0, y0, x1, y1, color); //LCD_Rect(x, y, w, h, color); unsigned long time; unsigned long time2; unsigned int led1 = 0xF800; unsigned int led2 = 0x001F; void setup(){ Serial.begin(9600); pinMode(CS, OUTPUT); pinMode(DAT, OUTPUT); pinMode(CLK, OUTPUT); SPSR |= 1; // 2x clock lcd_init_rgb(0); LCD_Fill_all(bgcolor); //put_string(20, 20, "privet", RED); } void loop(){ //LCD_Circle(30, 30, 30, RED); LCD_Fill_all(GREEN); LCD_Fill_all(BLUE); LCD_Fill_all(RED); }попробуй еще раз
Ошибка ушла, но дисп так и не завёлся. Вечерком попробую на atmega328.
Вот видео прошивки из Bascom и Arduino https://youtu.be/y5DQX5haNDA
на 16 меге может там пины другие, или pinmode не те пины на выход настраивает, я не проверял, не использую мегу16. если так то по даташиту посмотри где spi. и проверь наверно для начала 328 меге
Ситуация с мегой328 (arduino pro mini) аналогична. В Баскоме всё работает, а в ардуине нет :(
Сброс дисплея на хардовой версии происходит (светится белым).
дисплей подключил к arduino pro mini
Дисп 100% подключен верно так как в bascom аналогичный конфиг работает
вот что на выходе у баском по SPI
Это на выходе у Ардуины по SPI
странно. ни софтварный ни хардварный у тебя не работают. а ресет дисплея на +3.3В посадил?
да на 3,3. А если не сложно скомпилить и хекс сюда кинуть под aрдуино про мини 328 16mhz
в компиляторе выбираю атмега328 5в 16mhz может это проблема, согласующих резсторов нет, и ардуину запитал от 3,3в но в другой то среде всё работает. Мистика какая то.
https://yadi.sk/d/YpJEqiH4kC6yx
Прошивка не пошла :)
Но получил мусор на LCD оставив в коде только инициализацию.
А дальше при любых действиях получаю белый экранчик.
ну хз. у себя еще првоерить не могу. не помню куда дел дисплей
Здравствуйте. Тоже озадачился подключением дисплея от Nokia1616.
Имею: дисплей от Nokia, рабочий. Кит AVR STK500, AVR Mega16, много других МК от атмела. Также Аrduino 2009 + pro mini + 2560 + discovery. Макетка
Пробовал начать с Bascov-Avr. Но у него оф версия до 4-х кБ. ПОставил кряк, оказалось что вирус.
Поэтому сразу вопрос - подскажите где взять нормальный Bascom-Avr? Файл $lbx - это текстовая библиотека или что это? Как оттуда достать код для Си?
Есть также библиотека NokiaSuperbreakout но там надо чтобы на дисплее MISO был, а на моём нет. Поправил но не заработало.
Кому интересно, киидайте хексы или код буду компилить пробовать зашить. Или ошибки посмотрю если найду.
Посмотрел насчёт:
Function.ino:107:12: error: lvalue required as left operand of assignment
Правильно. Ведь в начале файла:
В файле function.ino надо:
Да и этот кусок:
у кого имеется лог анализатор или осциллограф проверьте как быстрее ногодрыг, так как работает и та и другая конструкция
"так как работает и та и другая конструкция"
Киньте пожалуйста код, чтобы проверить. Есть и ардуины и STK50 для меги16.
Куда какие разъёмы цеплять?
Осциллограф есть. Хороший.
STK500 т.е.
Смотрю код который ARDUINO_SOFT. Несоответствие:
на нормально там все. тестил же. просто на выход настраивал не черзе ddrb а через pinMode. мудрено выгядит, но как говорится я художник, я так вижу)))
хорошо 11 пин. прошу отвечать также вариант - частота
1 вариант:
#define PIN 11 #define PIN_On PORTB = 1<<3 #define PIN_Off PORTB = 0<<3 void setup(){ pinMode(PIN, OUTPUT); } void loop(){ PIN_On; PIN_Off; }2 вариант
#define PIN 11 #define PIN_On PORTB |= 1<<3; #define PIN_Off PORTB &= ~(1<<3); void setup(){ pinMode(PIN, OUTPUT); } void loop(){ PIN_On; PIN_Off; }3 вариант заодно
#define PIN 11 #define PIN_On PORTB |= 1<<3; #define PIN_Off PORTB &= ~(1<<3); void setup(){ pinMode(PIN, OUTPUT); } void loop(){ digitalWrite(PIN, HIGH); digitalWrite(PIN, LOW); }4 вариант (урезанная digitalWrite)
#define PIN 11 #define PIN_On PORTB |= 1<<3; #define PIN_Off PORTB &= ~(1<<3); void setup(){ pinMode(PIN, OUTPUT); } void loop(){ dWrite(PIN, HIGH); dWrite(PIN, LOW); } void dWrite(byte pin, byte val){ byte bit = digitalPinToBitMask(pin); volatile byte *out; out = portOutputRegister(digitalPinToPort(pin)); (val)? *out |= bit : *out &=~bit; }5 вариант. максимальная частота spi. смотреть 11 и 13 пины
#define DAT 11 #define CLK 13 #define SPI_OFF SPCR = 0; #define SPI_ON SPCR = _BV(MSTR) | _BV(SPE); #define SPI_WAIT while (!(SPSR & _BV(SPIF))); void setup(){ pinMode(DAT, OUTPUT); pinMode(CLK, OUTPUT); SPSR |= 1; } void loop(){ SPI_ON; SPDR = 0b10101010; SPI_WAIT; SPI_OFF; }пока хватит
Как я понимаю, речь идёт об SOFT версии?
Попрбобую на ардуино2560, там есть переключение на 3.3 В.
Какие разъёмы куда цеплять? Если можно в терминах ардуино или для PORTB.
нет. обычная уно например. и без дисплея. просто осциллографом посмотреть
так в самом начале написал 11 пин ардуины. в последнем коде еще 13