Дисплей на ST7565 управляемый Arduino Due
- Войдите на сайт для отправки комментариев
Всем бобра! А так же с праздниками! :)
Короче, ХЕЛП!!!! :)
Есть у меня этот тудыть его в душу дисплей на контроллере ST7565 (а точнее на 2х таких контроллерах, т.к. дисплей 240х64), и ардуино Due. Соеденены по 8ми битному подключению 6800. Младший байт порта D - шина данных (правда я когда плату разводил умудрился старший бит на младший кинуть, и т.д., но это исправлено программно). Заставил дисплей работать на вывод информации. Но потом вычитал, что есть режим read/modify/wright - где МК сначала читает байт из графической памяти дисплея, потом можно его модифицировать, а потом вписать обратно, в ту же ячейку памяти. Это удобно когда объекты наползают один на другой - можно не заводить буфер в МК, а пользоваться памятью дисплея. И вот я уже второй день бьюсь - не работает функция вычитывания, возвращает все время ноль, как я понимаю, т.к. объект который выводится вторым своими нулевыми пикселями затирает объект , который вывелся на дисплей ранее.
по идее работать должно так: в функцию вывода на дисплей "верхнего" объекта передаются координаты х,у,ширина и высота обекта, и указатель на сам битпам. Фун-ция вывода:
void modify(uint8_t x, uint8_t y , uint8_t w, uint8_t h, const uint8_t * p) {
uint16_t i = 0; bool right = false; bool cross = false; bool event = false;
uint8_t data = 0;
if (x > 119)right = true;
else if ((x + w) > 119)cross = true;
for (uint8_t page = 0; page < h / 8; page++) {
writeCommand(0xB0 + y + page);//установка номера page (горизонтальная полоса в 8 пискселей)
if (cross)event = false;
writeCommand(0x10 + ((x - 120 * right) >> 4));//установка номера вертикального столбца
writeCommand(0x00 + ((x - 120 * right) & 0x0F));//установка номера вертикального столбца
writeCommand(0xE0);//установка режима read/modify/write
for (uint8_t column = x; column < x + w; column++, i++) {//сбрасывается номер столбца при переходе границы
if (column > 119) {
if (cross && (!event)) {
writeCommand(0xEE);
writeCommand(0x10);
writeCommand(0x00);
event = true;
writeCommand(0xE0);
}
readData2();//первое вычитывание не считается, согласно мануалу
data = readData2();//вычитывание байта из памяти 2го контроллера дисплея
data |= pgm_read_byte_near((uint32_t)(p + i));//сложение с вычитанным байтом битмапа объекта
writeData2(data);//запись байта во второй контроллер
}
else {
readData1(); //первое вычитывание не считается, согласно мануалу
data = readData1();//вычитывание байта из памяти 1го контроллера дисплея
data |= pgm_read_byte_near((uint32_t)(p + i));//сложение с вычитанным байтом битмапа объекта
writeData1(data);//запись байта в первый контроллер дисплея
}
}
writeCommand(0xEE);//завершение режима read/modify/write
}
}
и получается, собака, что readData1() и readData2() всегда возвращают нули. Собсно ф-ция чтения:
uint8_t readData1() {
REG_PIOD_ODR |= 0xFF;//устанавливаем 0-8 биты на вход
REG_PIOD_ODSR |= RW;//устанавливаем RW HIGH - #define RW (1<<9)//9bit port D
REG_PIOA_ODSR &= ~ CS1;//устанавливаем CS1 LOW - CS1 #define (1<<5)//5bit port A
delayMicroseconds(4);
REG_PIOD_ODSR |= E;// устанавливаем E high - #define E (1<<8)//8bit port D
delayMicroseconds(4);
uint8_t data = (uint8_t)(REG_PIOD_PDSR & 0xFF);// читаем младший байт
REG_PIOD_ODSR &= ~E;// устанавливаем E low
REG_PIOA_ODSR |= CS1;//устанавливаем CS1 HIGH
REG_PIOD_ODSR &= ~RW;//устанавливаем RW LOW
REG_PIOD_OER |= 0xFF;//устанавливаем 0-8 биты на выход
uint8_t res = reverseBits(data);//инвертируем биты в байте
return res;
}
фу-ция reverseBits() тут ни при чем, она , когда идет вывод без вычитывания, работает правильно.
Может кто чего увидит незамыленным глазом, или кто с подобным сталкивался?
Глум без полезного смысла не приветствуется! ;)
Я так понимаю, задача слишком спицефическая? ;)