LCD128x64 на ST7920, вывод точки на экран.

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Открыл глаза
Аватара пользователя
Сообщения: 72
Зарегистрирован: Вт июл 05, 2011 06:04:17
Откуда: барнаул

Сообщение 6Н23П »

Здраствуйте
Имеется этот дисплей и библиотека к нему под STM32, http://www.coocox.org/driver_comp/lcd12 ... mc=4&sc=24 Дак вот в ней все устраивает, но в ней нет графики. Можно ли какнибудь вывести точку?
Реклама
Опытный кот
Аватара пользователя
Сообщения: 725
Зарегистрирован: Вт апр 26, 2011 13:58:36
Откуда: Ростовская область

Сообщение amv2000 »

6Н23П писал(а): в ней нет графики.
А это разве не графика?

Код: Выделить всё

//*****************************************************************************
//
//! \brief Display a picture
//!
//! \param *pucPic is array of picture data
//!
//! \return None.
//
//*****************************************************************************
void ST7920DisplayPicture(unsigned char *pucPic) {
	unsigned char i, j;
	ST7920Write(ST7920_CMD, 0x34);
	ST7920Write(ST7920_CMD, 0x36);

	for (i = 0; i < 32; i++) {
		ST7920Write(ST7920_CMD, 0x80 + i);
		ST7920Write(ST7920_CMD, 0x80);
		for (j = 0; j < 16; j++) {
			ST7920Write(ST7920_DAT, *pucPic);
			pucPic++;
		}
	}
#ifdef LCM12864
	for (i = 0; i < 32; i++) {
		ST7920Write(ST7920_CMD, 0x80 + i);
		ST7920Write(ST7920_CMD, 0x88);
		for (j = 0; j < 16; j++) {
			ST7920Write(ST7920_DAT, *pucPic);
			pucPic++;
		}
	}
#endif
	ST7920Write(ST7920_CMD, 0x30);
}
Реклама
Опытный кот
Аватара пользователя
Сообщения: 838
Зарегистрирован: Вт апр 12, 2011 18:38:19
Откуда: с Земли

Сообщение coredumped »

Можно допилить. Почитайте даташит http://www.dfrobot.com/image/data/fit0021/st7920.pdf Каждой точке соответчтвует бит в памяти контроллера. Напишите функцию, которая будет вычислять адрес байта, в котором находится точка. Затем читаете байт с этого адреса - устанавливаете желаемый бит и записывете байт обратно. Работы на 15 минут.
Все будет только лучше, в крайнем случае - хуже.
Открыл глаза
Аватара пользователя
Сообщения: 72
Зарегистрирован: Вт июл 05, 2011 06:04:17
Откуда: барнаул

Сообщение 6Н23П »

amv2000, да это графика, но простейших элементов таких как точа , линия, квадрат, круг, прямоугольник нету.
coredumped, спасибо за наводку.

Есть ли какиенибудь книги или доки где расписаны алгоритмы или инструкции как работать с дисплеями? А то мягко говоря в даташите мало чего понятно . Просто непонятно как пишут эти самые библиотеки для контроолера дисплея. В гугле мало чего по этому есть.
Реклама
Эиком - электронные компоненты и радиодетали
Опытный кот
Аватара пользователя
Сообщения: 838
Зарегистрирован: Вт апр 12, 2011 18:38:19
Откуда: с Земли

Сообщение coredumped »

Для рисования линий -алгоритм Брезенхема
А ваще, возьмите любую либу, где есть интересующие Вас примитивы и портируйте. Но интереснее самому написать :)
Все будет только лучше, в крайнем случае - хуже.
Реклама
Открыл глаза
Аватара пользователя
Сообщения: 72
Зарегистрирован: Вт июл 05, 2011 06:04:17
Откуда: барнаул

Сообщение 6Н23П »

кароче не получается выводит мусор за место точки ......
код примерно такой
void LCD_point(void)
{


unsigned char x=5,y=10; //координаты
ST7920Write(ST7920_CMD, 0x34);
ST7920Write(ST7920_CMD, 0x36);


ST7920Write(ST7920_CMD, 0x80|x );
ST7920Write(ST7920_CMD, 0x80|y );

ST7920Write(ST7920_DAT, 0x01);




ST7920Write(ST7920_CMD, 0x30);

}

Кароче теперь я понимаю почему на этот дисплей нет вразумительной инфы...........
Реклама
Встал на лапы
Аватара пользователя
Сообщения: 142
Зарегистрирован: Сб май 25, 2013 21:14:11
Откуда: Москва

Сообщение 0867532 »

У меня тот же дисплей, и скажу вам- Он прекрасный.
Память в нём совершенно долбанутая, и я в памяти(SRAM) контроллера сделал 1024 байтный массив, и обратчик к нему.
По прерыванию экран обновляется.

Код: Выделить всё

#define DATAPORT PORTC
#define RS PORTA.0
#define RW PORTA.1
#define OE PORTA.2
#define PSB PORTA.3
#define RESET PORTA.4

#define SYSTEMVIDEOCLK OE=1;delay_us(1);OE=0;
. . .
unsigned char VideoDump[64][16];
. . . 
void VideoRender(void) {
for(cy=0; cy<32; cy++){
RS=0;
DATAPORT=(0x80|cy);
SYSTEMVIDEOCLK
DATAPORT=(0x80);
SYSTEMVIDEOCLK
RS=1;
for(cx=0; cx<16; cx++) {
DATAPORT=(VideoDump[cy][cx]);
SYSTEMVIDEOCLK
} }  
for(cy=0; cy<32; cy++){
RS=0;
DATAPORT=(0x80|cy);
SYSTEMVIDEOCLK
DATAPORT=(0x88);
SYSTEMVIDEOCLK
RS=1;
for(cx=16; cx<32; cx++) {
DATAPORT=(VideoDump[cy+32][cx-16]);
SYSTEMVIDEOCLK
} } }
Ну а дальше гораздо проще и быстрее обращаться к массиву контроллера.
Мой дисплей всегда работает в графическом режиме, и текст(6x8) выводит так же.
Если возникнут вопросы - посмотрите на мой аватар.
Контактная информация:
Опытный кот
Аватара пользователя
Сообщения: 882
Зарегистрирован: Ср фев 22, 2012 01:25:21

Сообщение shads »

0867532 писал(а):У меня тот же дисплей, и скажу вам- Он прекрасный.
Память в нём совершенно долбанутая
А в чем это выражается...
0867532 писал(а):я в памяти(SRAM) контроллера сделал 1024 байтный массив, и обратчик к нему.
Ух ты... и я так же хотел сделать http://forum.cxem.net/index.php?showtop ... try1787897
0867532 писал(а):По прерыванию экран обновляется.
Как я понял у вас программно выплевывается... а нельзя ли через DMA запилить... чтобы уж совсем присесть на преимущества STM-ки...
0867532 писал(а):Мой дисплей всегда работает в графическом режиме, и текст(6x8) выводит так же.
Ух ты... и я туда же... http://forum.cxem.net/index.php?showtop ... try1811878
Ответить

Вернуться в «ARM»