Библиотека для LCD Nokia 1100

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

давно бы уже 1280 выпаяли да баловались уже

hugoboss317
Offline
Зарегистрирован: 21.03.2013

Уже не знаю в какую ветку лезть, ну вроде вопрос точно по теме:

Есть ещё одна биба, рабочая, но есть проблемка...только выводит слова.

не знаю какой вечер подряд пытаюсь добавить функцию "печатать точку в координатах ХУ" :))

функция lcd_gotoyx есть, но lcd_gotoyx(1, 1); печатает в (9, 6) т.е. задаёт строку и столбец как в символьном.

от столбцов избавится было просто, закоментировал множитель ширины символа:

void lcd_col(byte addr){
	//addr *= CHAR_WIDTH;
	lcd_write(FLAG_CMD,LCD_CHANGE_ROW_LSB | ( addr & 0x0F));
	lcd_write(FLAG_CMD,LCD_CHANGE_ROW_MSB | ( (addr >> 4) & 0x07 ));
       
}

а на строку фантазии закончились. Если не сложно, помогите...

вот данные:

void lcd_Pixel(unsigned char x,unsigned char y)  //пиксель
{

        lcd_gotoyx(x,y);
        lcd_write(FLAG_DATA,0x01);
}
#define lcd_gotoyx(ROW,COL)\
  lcd_row(ROW);\
  lcd_col(COL);
void lcd_row(byte addr){
	lcd_write(FLAG_CMD,LCD_CHANGE_COL | ( addr & 0x0F ));
}
#define LCD_CHANGE_ROW_LSB 0x00  //00
#define LCD_CHANGE_ROW_MSB 0x10  //10
#define LCD_CHANGE_COL 0xB0      //B0
#define FLAG_CMD LOW    
#define FLAG_DATA HIGH  

Думаю дело в вышеприведённом.

сверну тут и саму бибу. Вся в одном файлике

#define DEFAULT_PIN_CONIF /* use defined pin config */
#ifdef DEFAULT_PIN_CONIF
#define LCD_PIN_SCE 15    //PC1
#define LCD_PIN_SDIN 16   //PC2
#define LCD_PIN_RESET 14  //PC0
#define LCD_PIN_SCLK 17   //PC3
#else 
#error define pin-out attached to arduino. 
#endif

#define LCD_CONTRAST 0x0d //задаёт конирастность

#define SCREEN_HEIGHT 65 //разрешение по высоте
#define SCREEN_WIDTH 96  //разрешение по ширине

#define FLAG_CMD LOW    
#define FLAG_DATA HIGH  
/*
  some constants that will be ored with command to effect
    ON : turn on the command
    OFF : turn off the command
    DISPLAY: turn display on/of used with LCD_MODE only, (LCD_MODE|DISPLAY|ON/OFF)
    ALL : turn on all , only used with LCD_MODE , (LCD_MODE|ALL|ON/OFF) use off for normal display
    INVERT : invert pixels, only used with LCD_MODE , (LCD_MODE|INVERT|ON/OFF) , it bring lcd into normal form use off
  *note: you can use (LCD_MODE|ALL/INVERT|OFF)  to bring lcd into normal mode
*/
#define ON 0x01
#define OFF 0x00
#define ALL 0x04
#define INVERT 0x06
#define DISPLAY 0x0E

#define LCD_NOP 0xE3
#define LCD_MODE 0xA0
#define LCD_VOB_MSB 0x20
#define LCD_VOB_LSB 0x80
#define LCD_CHARGE_PUMP_ON 0x2F
#define LCD_RAM_ADDR_MODE 0xAA
#define LCD_CHANGE_ROW_LSB 0x00  //00
#define LCD_CHANGE_ROW_MSB 0x10  //10
#define LCD_CHANGE_COL 0xB0      //B0
#define LCD_MIRROR_Y 0xC0
#define LCD_MIRROR_X 0xA0
#define LCD_EXT_OSC 0x3A
#define LCD_SOFT_RESET 0xE2
/*-------------------------------------------------------------------------------------------------*/
#define LCD_X 96
#define LCD_Y 65
#define Cache_Size 96 * 9
byte LCDCache [Cache_Size];
static int xUpdateMin, yUpdateMin, xUpdateMax,yUpdateMax;
static int Cursor_X, Cursor_Y;

/*----------------------------------------------------------------------------------------------*/
#define CHAR_WIDTH 6
//#define CHAR_HEIGHT 8
static const byte ASCII[][CHAR_WIDTH] ={
   {0x00, 0x00, 0x00, 0x00, 0x00, 0x00} // 20
  ,{0x00, 0x00, 0x00, 0x5f, 0x00, 0x00} // 21 !
  ,{0x00, 0x00, 0x07, 0x00, 0x07, 0x00} // 22 "
  ,{0x00, 0x14, 0x7f, 0x14, 0x7f, 0x14} // 23 #
  ,{0x00, 0x24, 0x2a, 0x7f, 0x2a, 0x12} // 24 $
  ,{0x00, 0x23, 0x13, 0x08, 0x64, 0x62} // 25 %
  ,{0x00, 0x36, 0x49, 0x55, 0x22, 0x50} // 26 &
  ,{0x00, 0x00, 0x05, 0x03, 0x00, 0x00} // 27 '
  ,{0x00, 0x00, 0x1c, 0x22, 0x41, 0x00} // 28 (
  ,{0x00, 0x00, 0x41, 0x22, 0x1c, 0x00} // 29 )
  ,{0x00, 0x14, 0x08, 0x3e, 0x08, 0x14} // 2a *
  ,{0x00, 0x08, 0x08, 0x3e, 0x08, 0x08} // 2b +
  ,{0x00, 0x00, 0x50, 0x30, 0x00, 0x00} // 2c ,
  ,{0x00, 0x08, 0x08, 0x08, 0x08, 0x08} // 2d -
  ,{0x00, 0x00, 0x60, 0x60, 0x00, 0x00} // 2e .
  ,{0x00, 0x20, 0x10, 0x08, 0x04, 0x02} // 2f /
  ,{0x00, 0x3e, 0x51, 0x49, 0x45, 0x3e} // 30 0
  ,{0x00, 0x00, 0x42, 0x7f, 0x40, 0x00} // 31 1
  ,{0x00, 0x42, 0x61, 0x51, 0x49, 0x46} // 32 2
  ,{0x00, 0x21, 0x41, 0x45, 0x4b, 0x31} // 33 3
  ,{0x00, 0x18, 0x14, 0x12, 0x7f, 0x10} // 34 4
  ,{0x00, 0x27, 0x45, 0x45, 0x45, 0x39} // 35 5
  ,{0x00, 0x3c, 0x4a, 0x49, 0x49, 0x30} // 36 6
  ,{0x00, 0x01, 0x71, 0x09, 0x05, 0x03} // 37 7
  ,{0x00, 0x36, 0x49, 0x49, 0x49, 0x36} // 38 8
  ,{0x00, 0x06, 0x49, 0x49, 0x29, 0x1e} // 39 9
  ,{0x00, 0x00, 0x36, 0x36, 0x00, 0x00} // 3a :
  ,{0x00, 0x00, 0x56, 0x36, 0x00, 0x00} // 3b ;
  ,{0x00, 0x08, 0x14, 0x22, 0x41, 0x00} // 3c <
  ,{0x00, 0x14, 0x14, 0x14, 0x14, 0x14} // 3d =
  ,{0x00, 0x00, 0x41, 0x22, 0x14, 0x08} // 3e >
  ,{0x00, 0x02, 0x01, 0x51, 0x09, 0x06} // 3f ?
  ,{0x00, 0x32, 0x49, 0x79, 0x41, 0x3e} // 40 @
  ,{0x00, 0x7e, 0x11, 0x11, 0x11, 0x7e} // 41 A
  ,{0x00, 0x7f, 0x49, 0x49, 0x49, 0x36} // 42 B
  ,{0x00, 0x3e, 0x41, 0x41, 0x41, 0x22} // 43 C
  ,{0x00, 0x7f, 0x41, 0x41, 0x22, 0x1c} // 44 D
  ,{0x00, 0x7f, 0x49, 0x49, 0x49, 0x41} // 45 E
  ,{0x00, 0x7f, 0x09, 0x09, 0x09, 0x01} // 46 F
  ,{0x00, 0x3e, 0x41, 0x49, 0x49, 0x7a} // 47 G
  ,{0x00, 0x7f, 0x08, 0x08, 0x08, 0x7f} // 48 H
  ,{0x00, 0x00, 0x41, 0x7f, 0x41, 0x00} // 49 I
  ,{0x00, 0x20, 0x40, 0x41, 0x3f, 0x01} // 4a J
  ,{0x00, 0x7f, 0x08, 0x14, 0x22, 0x41} // 4b K
  ,{0x00, 0x7f, 0x40, 0x40, 0x40, 0x40} // 4c L
  ,{0x00, 0x7f, 0x02, 0x0c, 0x02, 0x7f} // 4d M
  ,{0x00, 0x7f, 0x04, 0x08, 0x10, 0x7f} // 4e N
  ,{0x00, 0x3e, 0x41, 0x41, 0x41, 0x3e} // 4f O
  ,{0x00, 0x7f, 0x09, 0x09, 0x09, 0x06} // 50 P
  ,{0x00, 0x3e, 0x41, 0x51, 0x21, 0x5e} // 51 Q
  ,{0x00, 0x7f, 0x09, 0x19, 0x29, 0x46} // 52 R
  ,{0x00, 0x46, 0x49, 0x49, 0x49, 0x31} // 53 S
  ,{0x00, 0x01, 0x01, 0x7f, 0x01, 0x01} // 54 T
  ,{0x00, 0x3f, 0x40, 0x40, 0x40, 0x3f} // 55 U
  ,{0x00, 0x1f, 0x20, 0x40, 0x20, 0x1f} // 56 V
  ,{0x00, 0x3f, 0x40, 0x38, 0x40, 0x3f} // 57 W
  ,{0x00, 0x63, 0x14, 0x08, 0x14, 0x63} // 58 X
  ,{0x00, 0x07, 0x08, 0x70, 0x08, 0x07} // 59 Y
  ,{0x00, 0x61, 0x51, 0x49, 0x45, 0x43} // 5a Z
  ,{0x00, 0x00, 0x7f, 0x41, 0x41, 0x00} // 5b [
  ,{0x00, 0x02, 0x04, 0x08, 0x10, 0x20} // 5c ¥
  ,{0x00, 0x00, 0x41, 0x41, 0x7f, 0x00} // 5d ]
  ,{0x00, 0x04, 0x02, 0x01, 0x02, 0x04} // 5e ^
  ,{0x00, 0x40, 0x40, 0x40, 0x40, 0x40} // 5f _
  ,{0x00, 0x00, 0x01, 0x02, 0x04, 0x00} // 60 `
  ,{0x00, 0x20, 0x54, 0x54, 0x54, 0x78} // 61 a
  ,{0x00, 0x7f, 0x48, 0x44, 0x44, 0x38} // 62 b
  ,{0x00, 0x38, 0x44, 0x44, 0x44, 0x20} // 63 c
  ,{0x00, 0x38, 0x44, 0x44, 0x48, 0x7f} // 64 d
  ,{0x00, 0x38, 0x54, 0x54, 0x54, 0x18} // 65 e
  ,{0x00, 0x08, 0x7e, 0x09, 0x01, 0x02} // 66 f
  ,{0x00, 0x0c, 0x52, 0x52, 0x52, 0x3e} // 67 g
  ,{0x00, 0x7f, 0x08, 0x04, 0x04, 0x78} // 68 h
  ,{0x00, 0x00, 0x44, 0x7d, 0x40, 0x00} // 69 i
  ,{0x00, 0x20, 0x40, 0x44, 0x3d, 0x00} // 6a j
  ,{0x00, 0x7f, 0x10, 0x28, 0x44, 0x00} // 6b k
  ,{0x00, 0x00, 0x41, 0x7f, 0x40, 0x00} // 6c l
  ,{0x00, 0x7c, 0x04, 0x18, 0x04, 0x78} // 6d m
  ,{0x00, 0x7c, 0x08, 0x04, 0x04, 0x78} // 6e n
  ,{0x00, 0x38, 0x44, 0x44, 0x44, 0x38} // 6f o
  ,{0x00, 0x7c, 0x14, 0x14, 0x14, 0x08} // 70 p
  ,{0x00, 0x08, 0x14, 0x14, 0x18, 0x7c} // 71 q
  ,{0x00, 0x7c, 0x08, 0x04, 0x04, 0x08} // 72 r
  ,{0x00, 0x48, 0x54, 0x54, 0x54, 0x20} // 73 s
  ,{0x00, 0x04, 0x3f, 0x44, 0x40, 0x20} // 74 t
  ,{0x00, 0x3c, 0x40, 0x40, 0x20, 0x7c} // 75 u
  ,{0x00, 0x1c, 0x20, 0x40, 0x20, 0x1c} // 76 v
  ,{0x00, 0x3c, 0x40, 0x30, 0x40, 0x3c} // 77 w
  ,{0x00, 0x44, 0x28, 0x10, 0x28, 0x44} // 78 x
  ,{0x00, 0x0c, 0x50, 0x50, 0x50, 0x3c} // 79 y
  ,{0x00, 0x44, 0x64, 0x54, 0x4c, 0x44} // 7a z
  ,{0x00, 0x00, 0x08, 0x36, 0x41, 0x00} // 7b {
  ,{0x00, 0x00, 0x00, 0x7f, 0x00, 0x00} // 7c |
  ,{0x00, 0x00, 0x41, 0x36, 0x08, 0x00} // 7d }
  ,{0x00, 0x10, 0x08, 0x08, 0x10, 0x08} // 7e ->
  ,{0x00, 0x78, 0x46, 0x41, 0x46, 0x78} // 7f <- 
};
	
#define lcd_gotoyx(ROW,COL)\
  lcd_row(ROW);\
  lcd_col(COL);



#define lcd_on() lcd_normal();
/*-----------------------*/
void lcd_string(char *);
void lcd_character(char);
void lcd_row(byte);
void lcd_col(byte);
void lcd_clear();
void lcd_refresh();
void lcd_init();
void lcd_write(byte,byte);
void lcd_all();
void lcd_invert();
void lcd_normal();
void lcd_off_partial();
void lcd_off();
void lcd_contrast(byte value); 
/*----------------------------------------------------------------------------------------------*/

void lcd_write(byte dc,byte data){
	digitalWrite(LCD_PIN_SDIN, dc);
	digitalWrite(LCD_PIN_SCE, LOW);
	digitalWrite(LCD_PIN_SCLK, HIGH);
	digitalWrite(LCD_PIN_SCLK, LOW);
	shiftOut(LCD_PIN_SDIN, LCD_PIN_SCLK, MSBFIRST, data);
	digitalWrite(LCD_PIN_SCE, HIGH);
}

void lcd_init(){
	pinMode(LCD_PIN_SCE, OUTPUT);
	pinMode(LCD_PIN_RESET, OUTPUT);
	pinMode(LCD_PIN_SDIN, OUTPUT);
	pinMode(LCD_PIN_SCLK, OUTPUT);
	digitalWrite(LCD_PIN_RESET, LOW);
	digitalWrite(LCD_PIN_SCE, HIGH);
	digitalWrite(LCD_PIN_SCLK, LOW);
	lcd_refresh();
	delay(200);
	lcd_clear();
}
/*
	LCD_REFRESH()
		note:
			* you can or a 5 bit binary number with LCD_VOB_LSB to set contrast [see datasheet for more]
				0x00 : lowest contrast
				0x01 : heigher than 0x00
				0x02 : heigher than 0x01
				.
				.
				.
				0x1F : heighest contrast
			* charge pump inbuild
				i didnt understood it use here but in prevous code is was there so didnt want to mess
			*we have to reset the deivce beacuse it is required for initalisation [see datasheet]
*/
void lcd_refresh(){
	digitalWrite(LCD_PIN_RESET, LOW);
	digitalWrite(LCD_PIN_RESET, HIGH);
	lcd_write(FLAG_CMD,LCD_CHARGE_PUMP_ON);
	lcd_contrast(LCD_CONTRAST);
	lcd_on();
}
/*
	LCD_CLEAR()
		note:
			every pixel is cleared by sending 0x00 for 864 times
			864 times because the their is a single pixel line at the last (65 pixel height)
*/
void lcd_clear(){

	lcd_gotoyx(0,0);
	int index;
	for(index=0; index < 864; index++)
        lcd_write(FLAG_DATA,0x00);
	delay(200);
}

void lcd_col(byte addr){
	//addr *= CHAR_WIDTH;
	lcd_write(FLAG_CMD,LCD_CHANGE_ROW_LSB | ( addr & 0x0F));
	lcd_write(FLAG_CMD,LCD_CHANGE_ROW_MSB | ( (addr >> 4) & 0x07 ));
       
}
						
void lcd_row(byte addr){
	lcd_write(FLAG_CMD,LCD_CHANGE_COL | ( addr & 0x0F ));
}

void lcd_string(char *string){
	while(*string)
	lcd_character(*string++);
}

void lcd_character(char ch){
	byte index;
	for(index=0; index < CHAR_WIDTH; index++)\
	lcd_write(FLAG_DATA,ASCII[ ch -0x20 ][index]);
}

void lcd_off(){  //выключает дисплей
	lcd_write(FLAG_CMD,LCD_MODE|DISPLAY|OFF);
	lcd_write(FLAG_CMD,LCD_MODE|ALL|ON);
}

void lcd_off_partial(){
	lcd_write(FLAG_CMD,LCD_MODE|DISPLAY|OFF);
	lcd_write(FLAG_CMD,LCD_MODE|ALL|OFF);
}

void lcd_normal(){   //включает дисплей
	lcd_write(FLAG_CMD,LCD_MODE|DISPLAY|ON);
	lcd_write(FLAG_CMD,LCD_MODE|ALL|OFF);
	lcd_write(FLAG_CMD,LCD_MODE|INVERT|OFF);
}

void lcd_invert(){ //инвертирует пиксели
	lcd_write(FLAG_CMD,LCD_MODE|DISPLAY|ON);
	lcd_write(FLAG_CMD,LCD_MODE|ALL|OFF);
	lcd_write(FLAG_CMD,LCD_MODE|INVERT|ON);
}

void lcd_all(){
	lcd_write(FLAG_CMD,LCD_MODE|DISPLAY|ON);
	lcd_write(FLAG_CMD,LCD_MODE|ALL|ON);
}

void lcd_contrast(byte value){
	lcd_write(FLAG_CMD,LCD_VOB_MSB|0x04);
	lcd_write(FLAG_CMD,LCD_VOB_LSB|(value & 0x1F));
}

///////////////////////////////////////////////////////////////////
void lcd_Pixel(unsigned char x,unsigned char y)
{
        lcd_gotoyx(x,y);
        lcd_write(FLAG_DATA,0x01);
}
//////////

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

Похоже нашел в чем проблема вывода графики на меге8 (таже проблема на меге 168)

количество оперативки тупо не хватает обработать такой объем данных

http://robocraft.ru/blog/arduino/531.html

тут подробно описано hugoboss317 почитай

надо оптимизировать код а точнее библиотеку

hugoboss317
Offline
Зарегистрирован: 21.03.2013

Полезная информация. Но даже не знаю... Перегрузить RAM библиотекой для 96х65. Другие работают но они более ужатые конечно... Не знаю..

Разве что на днях должен прийти 328 в дипе. Попробую с него.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

попробуйте вот что. на меге8 заработало.

как я тестировал:

1. текст - ОК

2. 1 вертикальная "быстрая" линия - ОК

3. 50 вертикальных "быстрых" линий увеличивающихся в размере - ОК

4. 5 скругленных прямоугольников - нарисовал но с глюками, все память закончилась

так же попробуйте и сами увидите

hugoboss317
Offline
Зарегистрирован: 21.03.2013

Я давненько приметил в этой библиотеке достаточно любопытное сходство одной вещицы.

Функция 









Display.Update();

Если может сталкивались с библиотекой U8glib, там выводится на экран изображение вот такой командой:









u8g.firstPage();  
  do {
    draw();   // тут выводимое на экран
  } while( u8g.nextPage() );

смысл в том что данные не сразу печатаются а формируются и выводятся целиком т.е. к примеру печатаем линию, ждём секунду, печатаем ещё одну (в др.месте) ждём ещё и т.д. обычно так и выполняется но в U8glib выведится только когда собируться все линии и паузы и напечатается одновременно. Теперь к этой бибе и почему сходсво.

Следуя важей рекомендации по загрузке РАМа напечатал слово, напечатал рамку (на весь экран) и внутри линию толькео не сразу а попиксельно и с небольшой задержкой между пикселями и вот чё:

Так выводит линию толдько сразу целиком спустя delay (10) * 91 (пауза на кол-во циклов for) 









  x = 2;
  for(int i=0; i<91; i++){
  Display.drawPixel(x,20,1);
  x++;
  delay(10);
    }
Display.Update();  // за пределами for

а так попиксельно и печатает:









  x = 2;
  for(int i=0; i<91; i++){
  Display.drawPixel(x,20,1);
  x++;
  delay(10);
  Display.Update();  // внутри оператора for 
  }

Так что команда "печатать на экран" это не "___.print" , не" ___.rawRoundRect" и т.д. , а как раз"___.Update();"

Ну и вот подобное формирование изображения может происходить в оперативке, что и может её перегружать. Как вариант решения просто чаще печатать на экран при написании.

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

Насчет Update(); я в курсе. 

А насчет большого массива верно. в библиотеке формируется массив 96х9 байт а это 864 байта. при оперативке 1к тут даже делать нечего на меге8 или 168

надо принцип работы библиотеки менять.  выводить каждый раз. у контроллера в дисплее есть свой видеобуфер насколько помню. и проблем каждый раз выдавать нет. но моих знаний как это сделать не хватает. я уже часов 6 пытаюсь переделать. пока безрезультатно

если получится отпишусь

чтобы немного отвлечься сделал анализатор спектра на библиотеке FFT

инвертировано по вертикали, не стал заморачиваться. просто проверил библиотеку. Сигнал никакой не подавал (под рукой ничего нет, сижу на работе) просто пальцем несколько раз дотронулся до аналогового входа

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

Кстати в той статье что давал ссылку был скетч для тестирования загруженности оперативной памяти

Если загрузить скетч с выводом как на картинке, только больших цифр 3, а сверху милисекунд нет, получилось следующее на нано:

свободный объем ОЗУ 937 байт из 2к байт

размер занимаемый размер флеш 7294байт

так как скетч оптравляет данные загрузки по UART, на самом деле занимается немного меньше.

122 байта (если не ошибаюсь) резервирует под буфер функция вывода по UART

получаем:

всего 2048 байт-937=1111 байт занимает вывод картинки плюс вывод по UART

отнимаем 122 получается сама картинка занимает где-то 989 байт плюс минус

из которых 864 байта занимает кэш по дисплей

в меге8 или 168 всего 1024 байт оперативки. получаем:

1024-989=35байт.  на 35 байтах далеко не уедешь. надо переделывать библиотеку))

hugoboss317
Offline
Зарегистрирован: 21.03.2013

Если не жалко, сверни сюда полный скетч с последнего фото. Мне под проэкт надо трёхзначное значение с аналоговго порта выводить, твои художества подойдут. я просто немного подкоректирую.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

в 47 посте уже выкладывал. пользуйся

hugoboss317
Offline
Зарегистрирован: 21.03.2013

Ладно, на головоломку много времени уйдёт.

растяни в два раза верхние показания, интересней будет.

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

нехочется. все становится похожим на minecraft.

hugoboss317
Offline
Зарегистрирован: 21.03.2013

Даже не могу вывести просто значение переменной. Не буду на ней останавливаться. Как бы привлеч Асов к 56-му посту.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

просто значение без графики выводится или минимальнйо графикой

а если те большие цифры то только 1 цифру и ту с глюками

hugoboss317
Offline
Зарегистрирован: 21.03.2013

Да, подтверждаю.  На 328 -ой меге аж бегом работает. Но как бы не вариант, ну как аварийный, скажем. Я даташит изучал и вот чё наизучал. Основной гемор в том что из визиопамяти нельзя прочитать, т.е. сначало формируем выводимое там, где можем прочитать, а потом весь этот "хлам" загружаем в кэш дисплейчика, поэтому много РАМ-ы и занимает, но нада же ещё обработать другие  данные по мимо экрана... Ну как то геморно всё получается.. 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

большие цифры выводили даже на тиньке 13

http://vrtp.ru/index.php?showtopic=20096&st=210#

http://vrtp.ru/index.php?act=Attach&type=post&id=497756

но не графикой скорее всего а делали шрифт в виде массива. у тиньки 13 RAM всего 64 байта

а те библиотеки которые графику именно выводят требуют большой видеобуфер

http://digitalchip.ru/rabotaem-s-displeem-ot-nokia-1100-v-graficheskom-rezhime

Ну вот, собственно, и все. Какую версию библиотеки использовать — решать вам. Если вы работаете только с текстом (меню там всякие, сообщения и т.д.), то целесообразно применять версию 1. Она занимает меньше места, компактная и не использует ОЗУ для хранения буферов. Самое то для ограниченных в ресурсах микроконтроллеров.

Ну а если в вашем проекте используется графика, то тут только вторая версия. Но она более требовательна к ресурсам. И программной памяти больше занимает, и в оперативной памяти нехилый такой видеобуфер хранит.

так что с большими цифрами нужно уже использовать шрифт

тестировал вывод графикой на меге 8 для хронометра, кроме 3 больших цифр ничего не влезает. чуть больше и все глюки начинаются. пока наверно так и оставлю

hugoboss317
Offline
Зарегистрирован: 21.03.2013

По первой ссылке там всё на Ассамблере, мне дебрей и без него хватает.  По третей там в конце форум и некий Андрей пишет что в IDE среде не работает и ему обьясняют что биба написана не для IDE. Хоть там и советовали мне обьявить переменные за пределами оператора, как только я всё это сделал, IDE вобще потеряла файлы библиотеки, и что интересно как только её (бибу) подпортить сразу видит и говорит что там ошибка...

Я весь гугл обшарил, вижу что крупный шрифт выводят, даже 16*24, но мозга не приклею как это получается. 

 

Есть :))...10х16 печатаю. Наколхозил конечно но печатаю. Растяну по ширене вдвое и достаточно. Займусь граффикой.

Iwan73
Offline
Зарегистрирован: 02.11.2013

Уважаемые форумчане пытаюсь переделать существующую бибу(кстати на PIC она работает,проверял в железе),но поскольку с Arduino только начал знакомиться не могу понять почему не определяет класс LCD. //******************************************************************************** // File........: nokia1100_lcd_lib.h

// Author(s)...: Chiper

// URL(s)......: http://digitalchip.ru/

// Description.: Драйвер LCD-контроллера от Nokia1100

// Data........: 21.02.12 // Version.....: 1.0 //***************************************************************************

#ifndef nokia1110_lcd_lib.h

#define nokia1110_lcd_lib.h

//******************************************************************************

// Настройка библиотеки

// Номера выводов порта, к которым подключены выводы LCD-контроллера

#define CS_LCD_PIN 3

#define SDA_LCD_PIN 4

#define RST_LCD_PIN 5

#define SCLK_LCD_PIN 6 

#define 0 LOW 

#define 1 HIGH //******************************************************************************

// Макросы и определения

#define SCLK_LCD_SET digitalWrite(SCLK_LCD_PIN, HIGH);

#define SDA_LCD_SET digitalWrite(SDA_LCD_PIN , HIGH);

#define CS_LCD_SET digitalWrite(CS_LCD_PIN , HIGH);

#define RST_LCD_SET digitalWrite(RST_LCD_PIN, HIGH);

#define SCLK_LCD_RESET digitalWrite(SCLK_LCD_PIN, LOW);

#define SDA_LCD_RESET digitalWrite(SDA_LCD_PIN , LOW);

#define CS_LCD_RESET digitalWrite(CS_LCD_PIN , LOW);

#define RST_LCD_RESET digitalWrite(RST_LCD_PIN , LOW);

#define CMD_LCD_MODE LOW

#define DATA_LCD_MODE HIGH

#define INV_MODE_ON LOW

#define INV_MODE_OFF HIGH //******************************************************************************

class LCD :

{ public:

void nlcd_Init(void);

void nlcd_Clear(void);

void nlcd_SendByte(char mode,unsigned char c);

void nlcd_Putc(unsigned char c);

void nlcd_Print(char * message);

void nlcd_PrintF(unsigned char * message);

void nlcd_GotoXY(char x,char y);

void nlcd_Inverse(unsigned char mode);

void nlcd_Putz(signed int c);

};

#endif

//*******************************************************************

прошу прощения,но код так и не смог прилепить код по другому,на кнопку ОК никакой реакции вообще.

#include

#include

#define CS_LCD_PIN 3

#define SDA_LCD_PIN 4

#define RST_LCD_PIN 5

#define SCLK_LCD_PIN 6

LCD displ;

void setup(void){

pinMode(CS_LCD_PIN , OUTPUT);

pinMode(RST_LCD_PIN, OUTPUT);

pinMode(SDA_LCD_PIN, OUTPUT);

pinMode(SCLK_LCD_PIN , OUTPUT);

displ.nlcd_Init();

displ.nlcd_Clear();

}

void loop(void)

{

displ.nlcd_GotoXY(0,0);

displ.nlcd_Putc(g);

}

'LCD' does not name a type

Где тут загвоздка? Все файлы в бибы и скетча в одной папке.

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

хугобосс можешь сделать библиотеку вывода символов 1*8 пикселей с указанием места в котором печатать. минимальную только. то есть без необходимости не объявлять переменные с присвоенными значениями, а писать сразу значения чтобы экономить оперативку. хочу попробовать запустить на тиньке дисплей

igorok107
igorok107 аватар
Offline
Зарегистрирован: 03.11.2013

Либу  с сайта http://digitalchip.ru/ переделал под ардуинку. Можно забрать здесь.

Iwan73
Offline
Зарегистрирован: 02.11.2013

Спасибо большое,сейчас буду посмотреть.

все отлично работает

hugoboss317
Offline
Зарегистрирован: 21.03.2013

jeka_tm пишет:

хугобосс можешь сделать библиотеку вывода символов 1*8 пикселей с указанием места в котором печатать. минимальную только. то есть без необходимости не объявлять переменные с присвоенными значениями, а писать сразу значения чтобы экономить оперативку. хочу попробовать запустить на тиньке дисплей

Пока об этом не думал. В таком случаи, это будет не библиотека а нобор функций, скорей всего при каждом выводе надо будет инициализировать дисплей и при каждом обновлении изображение будет мигать. При всём этом, по собранной информации, занружать код нужно будет не через среду дуины, "код вижин" как минимум. Исходник меньше места займёт и может влезит. Попробовать конечно можно, но я всё ещё не успокоился работой от килобайтной оперативки. Читаю "умные" книги. Идеи есть, но мне всёж кажется что вряд ли получится. Как не крути, в видеопамять нужно посылать байт, и никак, без его чтения (видеопамяти контроллера) бит регистра(один) не поменяешь.

 

igorok107
igorok107 аватар
Offline
Зарегистрирован: 03.11.2013

Прикрутил к библиотеке аппаратный SPI. Мой диссплей 1110i легко запустился на 6МГц SPI. Вывод картинки размером 96х84 проиходит за 8,92 микросекунды, что примерно составляет 112 FPS.  Вот только буфер графики съедает практически всё ОЗУ ~816byte, даже для Serial не хватает :(. В программный код, меги8, влезло всего 6 картинок.

Вывод: надо думать о внешнем буфере на SRAM.

PS: Баблиотека на github. Там же есть облегчённая версия без графики.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

igorok107 пишет:

Прикрутил к библиотеке аппаратный SPI. Мой диссплей 1110i легко запустился на 6МГц SPI. Вывод картинки размером 96х84 проиходит за 8,92 микросекунды, что примерно составляет 112 FPS.  Вот только буфер графики съедает практически всё ОЗУ ~816byte, даже для Serial не хватает :(. В программный код, меги8, влезло всего 6 картинок.

Вывод: надо думать о внешнем буфере на SRAM.

PS: Баблиотека на github. Там же есть облегчённая версия без графики.

картинки с тем что может приложите пожалуйста

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

hugoboss317 пишет:

jeka_tm пишет:

хугобосс можешь сделать библиотеку вывода символов 1*8 пикселей с указанием места в котором печатать. минимальную только. то есть без необходимости не объявлять переменные с присвоенными значениями, а писать сразу значения чтобы экономить оперативку. хочу попробовать запустить на тиньке дисплей

Пока об этом не думал. В таком случаи, это будет не библиотека а нобор функций, скорей всего при каждом выводе надо будет инициализировать дисплей и при каждом обновлении изображение будет мигать. При всём этом, по собранной информации, занружать код нужно будет не через среду дуины, "код вижин" как минимум. Исходник меньше места займёт и может влезит. Попробовать конечно можно, но я всё ещё не успокоился работой от килобайтной оперативки. Читаю "умные" книги. Идеи есть, но мне всёж кажется что вряд ли получится. Как не крути, в видеопамять нужно посылать байт, и никак, без его чтения (видеопамяти контроллера) бит регистра(один) не поменяешь.

 

тут способ только один. и зависит все от количества графика. вывод короче как символы через массив. заранее рисуешь символы и выводишь на дисплей в нужном месте. если графики много и находит одна на другую вот тут проблемы

Iwan73
Offline
Зарегистрирован: 02.11.2013

igorok107 

вашу бибу с SPI  пример Demo mode посмотрел,жалуется при компиляции на  PB2,PB3,PB5, что не задекларированы. Где копать? DrawPictures и Hello_World работает.

извините, все заработало,но с 5 попытки скомпилировать . Глюк компилятора?

переделал свою прожку c этой бибой и снова те же грабли, загружаю проверенную 10 минут назад DrawPictures  и опять компиляция не идет уже в них  ,та же жалоба на незадекларированные PB.

hugoboss317
Offline
Зарегистрирован: 21.03.2013

Т.е. увас всё работало только компилятор ошибки выдавал? Если так, то можно не обращять внимания.

>>извините, все заработало,но с 5 попытки скомпилировать . Глюк компилятора?

Ничего не делали, просто пытались компилировать и с пятого раза получилось?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

у меня так и не заработало, правда тестировал в протеусе

кстати уже есть библиотеки для протеуса ардуин уно и мега. выглядят как реальные платы, не нужно по даташитам и картинкам узнавать чему соовтетствует например 7 вывод

Iwan73
Offline
Зарегистрирован: 02.11.2013

переделал свою прожку c этой бибой и снова те же грабли, загружаю проверенную 10 минут назад DrawPictures  и опять компиляция не идет уже в них  ,та же жалоба на незадекларированные PB.

 

	#define SPI_CLOCK_DIV	0x01 // Делитель SPI, определяет скорость. Значения [0-6] = Fosc/[4,16,64,128,2,8,32]
	#define SCLK_LCD_SET	PORTB |= _BV(PB5)
	#define SDA_LCD_SET 	PORTB |= _BV(PB3)
	#define CS_LCD_SET		PORTB |= _BV(PB2)
	#define SCLK_LCD_RESET	PORTB &= ~_BV(PB5)
	#define SDA_LCD_RESET	PORTB &= ~_BV(PB3)
	#define CS_LCD_RESET	PORTB &= ~_BV(PB2)

тут думаю надо искать.

 

Iwan73
Offline
Зарегистрирован: 02.11.2013

jeka_tm пишет:

у меня так и не заработало, правда тестировал в протеусе

кстати уже есть библиотеки для протеуса ардуин уно и мега. выглядят как реальные платы, не нужно по даташитам и картинкам узнавать чему соовтетствует например 7 вывод

А где такую бибу найти?  постоянно заливать  не охота,часть программы можно было бы и на работе в симуляторе отследить,что бы не таскаться с железом туда сюда а потом перепроверять соединения,а вдруг где покоцал.

С пиками занимался,после протеуса в 99% в железе работало. С АVR  еще только разбираться начал,туго идет еще пока. Тем более большинство писателей не уделяют внимания коментариям и сложновато разбираться в коде. 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

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

мне вот эта понравилась

http://blogembarcado.blogspot.ru/2012/02/simulino-simulando-arduino.html

качать можно отсюда

http://yadi.sk/d/ee7hLWsaCMeTV

Iwan73
Offline
Зарегистрирован: 02.11.2013

Большое спасибо,сейчас буду посмотреть,у нас просто вечные понты с инетом,и скорость как у черепахи торчилы,много чего не поищешь. Тьмутараканьс..

igorok107
igorok107 аватар
Offline
Зарегистрирован: 03.11.2013

Iwan73 пишет:

вашу бибу с SPI  пример Demo mode посмотрел,жалуется при компиляции на  PB2,PB3,PB5, что не задекларированы. Где копать? DrawPictures и Hello_World работает.

извините, все заработало,но с 5 попытки скомпилировать . Глюк компилятора?

переделал свою прожку c этой бибой и снова те же грабли, загружаю проверенную 10 минут назад DrawPictures  и опять компиляция не идет уже в них  ,та же жалоба на незадекларированные PB.

Попробуйте в файле PCF8814.h заменить PB2 на 2 и соответственно для PB3 и PB5.

#define SCLK_LCD_SET	PORTB |= _BV(5)
#define SDA_LCD_SET 	PORTB |= _BV(3)
#define CS_LCD_SET		PORTB |= _BV(2)
#define SCLK_LCD_RESET	PORTB &= ~_BV(5)
#define SDA_LCD_RESET	PORTB &= ~_BV(3)
#define CS_LCD_RESET	PORTB &= ~_BV(2)

 

igorok107
igorok107 аватар
Offline
Зарегистрирован: 03.11.2013

jeka_tm пишет:

у меня так и не заработало, правда тестировал в протеусе

кстати уже есть библиотеки для протеуса ардуин уно и мега. выглядят как реальные платы, не нужно по даташитам и картинкам узнавать чему соовтетствует например 7 вывод

А какая версия дуинки у вас?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

1.0.4

igorok107
igorok107 аватар
Offline
Зарегистрирован: 03.11.2013

jeka_tm пишет:

1.0.4

В смсле плата Arduino какая. На каком камне?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

в железе говорил же еще не проверял. проверю отпишусь. а в симуляторе плата уно, то есть Atmega328

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

проверил на нано

выдает ошибку

C:\YandexDisk\arduino-1.0.4\libraries\PCF8814\PCF8814.cpp: In constructor 'PCF8814::PCF8814(uint8_t, uint8_t, uint8_t, uint8_t)':
C:\YandexDisk\arduino-1.0.4\libraries\PCF8814\PCF8814.cpp:45: error: 'PB2' was not declared in this scope
C:\YandexDisk\arduino-1.0.4\libraries\PCF8814\PCF8814.cpp: In member function 'void PCF8814::SendByte(char, unsigned char)':
C:\YandexDisk\arduino-1.0.4\libraries\PCF8814\PCF8814.cpp:63: error: 'PB2' was not declared in this scope
C:\YandexDisk\arduino-1.0.4\libraries\PCF8814\PCF8814.cpp:74: error: 'PB3' was not declared in this scope
C:\YandexDisk\arduino-1.0.4\libraries\PCF8814\PCF8814.cpp:76: error: 'PB3' was not declared in this scope
C:\YandexDisk\arduino-1.0.4\libraries\PCF8814\PCF8814.cpp:77: error: 'PB5' was not declared in this scope
C:\YandexDisk\arduino-1.0.4\libraries\PCF8814\PCF8814.cpp:98: error: 'PB3' was not declared in this scope
C:\YandexDisk\arduino-1.0.4\libraries\PCF8814\PCF8814.cpp: In member function 'void PCF8814::Init()':
C:\YandexDisk\arduino-1.0.4\libraries\PCF8814\PCF8814.cpp:105: error: 'PB5' was not declared in this scope
C:\YandexDisk\arduino-1.0.4\libraries\PCF8814\PCF8814.cpp:106: error: 'PB3' was not declared in this scope
C:\YandexDisk\arduino-1.0.4\libraries\PCF8814\PCF8814.cpp:107: error: 'PB2' was not declared in this scope

 

igorok107
igorok107 аватар
Offline
Зарегистрирован: 03.11.2013

Обновил библиотеку. Впаял ардуиновскую функцию digitalPinToBitMask(), для автоопределения номера пина. Проверил в протеусе, работает со всеми камнями, даже для меги скомпилировалось без проблем. Леонардо только не проверял, нет модели atmega32u4.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

igorok107 пишет:

Обновил библиотеку. Впаял ардуиновскую функцию digitalPinToBitMask(), для автоопределения номера пина. Проверил в протеусе, работает со всеми камнями, даже для меги скомпилировалось без проблем. Леонардо только не проверял, нет модели atmega32u4.

оперативно. хорошая работа. теперь работает

а облегченную версию будете править или самим?

igorok107
igorok107 аватар
Offline
Зарегистрирован: 03.11.2013

Уже. Параллельно обновил.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

igorok107 пишет:

Уже. Параллельно обновил.

посторяюсь. оперативно. спасибо. не подумайте плохо. но я проверяю то что мне говорят если планирую в дальнейшем использовать. подтверждаю: обе библиотеки рабочие

скажите а не могли бы вы сделать версию библиотеки еще более облегченную чем licht. без лишних объявлений переменных для удобства понимания работы. большинство все равно не заморочится с переделкой. например передача комманды или данных можно сразу писать. насколько помню (возможно ошибаюсь) если не объявлять а сразу отправлять данные то занимаемый объем будет меньше, не только во флеш памяти, но и в рам (если нужно будет постараюсь найти стратью о влиянии на используюмею оперативную память лишний раз объявленные переменные вместо прямого использования, даже название переменной влияет, хотя казалось бы этого не должно быть. компилятор должен был присвоить например значению 123 1 байт памяти и его адрес (адрес заранее резервирует компилято) и название не должно влиять, но почему влияет не пойму. если на асме писать присваиваешь регистру значение и работаешь с ним независимо от названия (может путаю давно с асмом не работал, да и работал мало) ну да ладно) 

и тут когда например вместо ардуины используешь в устройстве уже просто микроконтролер (я лично использую мегу8 обычно, теперь при необходимости и для личного удовлетворения не использования пушки против воробьев тинька 13). и тут уже возникала проблема забитости оперативной памяти от видобуфера.

честно сказать если влезть думаю смогу и сам переделать, но думаю у вас гораздо быстрее получится. 

длинно получилось, но надеюсь понятно

p.s. лешак видно уже перестал ходить на форум, у меня бы было к нему пару вопросов как гуру местному

igorok107
igorok107 аватар
Offline
Зарегистрирован: 03.11.2013

Сомневаюсь что получится вместить библиотеку на тиньку13. Программной памяти в ней 1к, а код  одной только урезанной инициализации, без стирания дисплея занимает 1 096 байт. А библиотека PCF8814_light.h с кодом инициализации и стирания экрана занимает  1 478 байт. Так что в среде ардуино уменьшить вряд ли получиться, нужно писать на чистом GCC или ещё лучше ASM.

#define LCD_SCK 13
#define LCD_SDA 11
#define LCD_CS 10
#define RESET 6

#define SCK_LCD_SET    digitalWrite(LCD_SCK,HIGH)
#define SDA_LCD_SET     digitalWrite(LCD_SDA,HIGH)
#define CS_LCD_SET      digitalWrite(LCD_CS,HIGH)
#define SCK_LCD_RESET  digitalWrite(LCD_SCK,LOW)
#define SDA_LCD_RESET   digitalWrite(LCD_SDA,LOW)
#define CS_LCD_RESET    digitalWrite(LCD_CS,LOW)

void SendByte(unsigned char mode, unsigned char c)
{
  CS_LCD_RESET;
  (mode)? SDA_LCD_SET : SDA_LCD_RESET;
  SCK_LCD_SET;
  SCK_LCD_RESET;

  byte i;
  for(i=0;i<8;i++)
  {
    SCK_LCD_RESET;
    if (c & 0x80) SDA_LCD_SET;
    else	 SDA_LCD_RESET;
    SCK_LCD_SET;
    c <<= 1;
  }

  SCK_LCD_RESET;
  CS_LCD_SET;
  SDA_LCD_RESET;
}

void setup() { 
  pinMode(LCD_SCK,OUTPUT);
  pinMode(LCD_SDA,OUTPUT);
  pinMode(LCD_CS,OUTPUT);
  pinMode(RESET,OUTPUT);
  //Init
  SCK_LCD_RESET;
  SDA_LCD_RESET;
  CS_LCD_RESET;
  digitalWrite(RESET,LOW);
  delay(10);            // выжидем не менее 5мс для установки генератора(менее 5 мс может неработать)
  digitalWrite(RESET,HIGH);
  CS_LCD_SET;

//  SendByte(0,0x20); // Запись в регистр Vop
//  SendByte(0,0x85); // Определяет контрастность
  SendByte(0,0x2F); // Power control set(charge pump on/off)
  SendByte(0,0xA4);

  //SendByte(CMD_LCD_MODE,0xC8); // mirror Y axis (about X axis)
  SendByte(0,0xA1); // Инвертировать экран по горизонтали

  SendByte(0,0xAF); // экран вкл/выкл
  SendByte(1,0xFF);
}

void loop() {
}

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

pin mode можно написать на сишном языке. много памяти жрет. управлять также. 

вы на каком микроконтроллере тестировали сколько занимает программа во флеше?

igorok107
igorok107 аватар
Offline
Зарегистрирован: 03.11.2013

jeka_tm пишет:

pin mode можно написать на сишном языке. много памяти жрет. управлять также. 

Ну да,намного меньше стало: "Размер скетча в двоичном коде: 434 байт".

Но это уже не дуина - это практически голый С.

jeka_tm пишет:

вы на каком микроконтроллере тестировали сколько занимает программа во флеше?

 

ATmega8

// SCK = 13; SDA = 11; CS = 10; LED = 9; RESET = 8
#define SCK_LCD_SET	PORTB |= 0x20
#define SDA_LCD_SET 	PORTB |= 0x08
#define CS_LCD_SET	PORTB |= 0x04
#define SCK_LCD_RESET	PORTB &= ~0x20
#define SDA_LCD_RESET	PORTB &= ~0x08
#define CS_LCD_RESET	PORTB &= ~0x04

void SendByte(unsigned char mode, unsigned char c)
{
  CS_LCD_RESET;
  (mode)? SDA_LCD_SET : SDA_LCD_RESET;
  SCK_LCD_SET;
  SCK_LCD_RESET;

  byte i;
  for(i=0;i<8;i++)
  {
    SCK_LCD_RESET;
    if (c & 0x80) SDA_LCD_SET;
    else	 SDA_LCD_RESET;
    SCK_LCD_SET;
    c <<= 1;
  }

  SCK_LCD_RESET;
  CS_LCD_SET;
  SDA_LCD_RESET;
}

void setup() { 
  DDRB |= 0x2F;
  PORTB |= 0x02; // Включаем подсветку
  PORTB |= 0x01;
  //Init
  SCK_LCD_RESET;
  SDA_LCD_RESET;
  CS_LCD_RESET;
  PORTB &= ~0x01;
  PORTB |= 0x01;
  CS_LCD_SET;

  //  SendByte(0,0x20); // Запись в регистр Vop
  //  SendByte(0,0x85); // Определяет контрастность
  SendByte(0,0x2F); // Power control set(charge pump on/off)
  SendByte(0,0xA4);

  //SendByte(CMD_LCD_MODE,0xC8); // mirror Y axis (about X axis)
  SendByte(0,0xA1); // Инвертировать экран по горизонтали

  SendByte(0,0xAF); // экран вкл/выкл
}

void loop() {
}

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

вот уже прогресс. с этим можно работать и даже графику выводить при правильном/сложном подходе, не использую оперативку сильно. проверю завтра если не будет сильной запарки с ремонтом на меге и на тиньке. с текстом и графикой

а насчет голого си ну что ж поделаешь. приходится. даже компилирую код для шим в кодевижн и ардуино для тиньки 13 разница 100 байт приблизительно. порой приходится и к си приходить чтобы сократить

за код спасибо буду работать

hugoboss317
Offline
Зарегистрирован: 21.03.2013

igorok107 пишет:

 





















// SCK = 13; SDA = 11; CS = 10; LED = 9; RESET = 8
#define SCK_LCD_SET     PORTB |= 0x20
#define SDA_LCD_SET 	PORTB |= 0x08
#define CS_LCD_SET      PORTB |= 0x04
#define SCK_LCD_RESET	PORTB &= ~0x20
#define SDA_LCD_RESET	PORTB &= ~0x08
#define CS_LCD_RESET	PORTB &= ~0x04  

А не лучше писать чтоб было более наглядно какой именно бит регистра устанавливается или сбрасывается? например так:



















#define SCK_LCD_SET	    PORTB |= 1<<5
#define SDA_LCD_SET 	PORTB |= 1<<3
#define CS_LCD_SET	    PORTB |= 1<<2
#define SCK_LCD_RESET	PORTB &= ~(1<<5)
#define SDA_LCD_RESET	PORTB &= ~(1<<3)
#define CS_LCD_RESET	PORTB &= ~(2<<2)

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

hugoboss317 пишет:

igorok107 пишет:

 




















// SCK = 13; SDA = 11; CS = 10; LED = 9; RESET = 8
#define SCK_LCD_SET     PORTB |= 0x20
#define SDA_LCD_SET 	PORTB |= 0x08
#define CS_LCD_SET      PORTB |= 0x04
#define SCK_LCD_RESET	PORTB &= ~0x20
#define SDA_LCD_RESET	PORTB &= ~0x08
#define CS_LCD_RESET	PORTB &= ~0x04  

А не лучше писать чтоб было более наглядно какой именно бит регистра устанавливается или сбрасывается? например так:



















#define SCK_LCD_SET	    PORTB |= 1<<5
#define SDA_LCD_SET 	PORTB |= 1<<3
#define CS_LCD_SET	    PORTB |= 1<<2
#define SCK_LCD_RESET	PORTB &= ~(1<<5)
#define SDA_LCD_RESET	PORTB &= ~(1<<3)
#define CS_LCD_RESET	PORTB &= ~(2<<2)

 

объясните попродробнее про сдвиги

каким образом это работает

#define SCK_LCD_SET	    PORTB |= 1<<5
#define SDA_LCD_SET 	    PORTB |= 1<<3
#define CS_LCD_SET	    PORTB |= 1<<2
#define SCK_LCD_RESET	    PORTB &= ~(1<<5)
#define SDA_LCD_RESET	    PORTB &= ~(1<<3)
#define CS_LCD_RESET	    PORTB &= ~(2<<2)

со сдвигами все никак не научусь пользоваться поэтому что не совсем понимаю как это работает

igorok107
igorok107 аватар
Offline
Зарегистрирован: 03.11.2013

hugoboss317 пишет:

А не лучше писать чтоб было более наглядно какой именно бит регистра устанавливается или сбрасывается? например так:

#define SCK_LCD_SET	    PORTB |= 1<<5
#define SDA_LCD_SET 	PORTB |= 1<<3
#define CS_LCD_SET	    PORTB |= 1<<2
#define SCK_LCD_RESET	PORTB &= ~(1<<5)
#define SDA_LCD_RESET	PORTB &= ~(1<<3)
#define CS_LCD_RESET	PORTB &= ~(2<<2)

Не годится. Команда сдвига добавляет 20 байт, а задача стояла выжать всё что можно.

jeka_tm пишет:

каким образом это работает

операция побитового сдвига влево (<<) сдвигает биты влево на n разрядов дополняя 0 справа. Сдвиг право (>>) работает аналогично.

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

igorok107 пишет:

hugoboss317 пишет:

А не лучше писать чтоб было более наглядно какой именно бит регистра устанавливается или сбрасывается? например так:

#define SCK_LCD_SET	    PORTB |= 1<<5
#define SDA_LCD_SET 	PORTB |= 1<<3
#define CS_LCD_SET	    PORTB |= 1<<2
#define SCK_LCD_RESET	PORTB &= ~(1<<5)
#define SDA_LCD_RESET	PORTB &= ~(1<<3)
#define CS_LCD_RESET	PORTB &= ~(2<<2)

Не годится. Команда сдвига добавляет 20 байт, а задача стояла выжать всё что можно.

jeka_tm пишет:

каким образом это работает

операция побитового сдвига влево (<<) сдвигает биты влево на n разрядов дополняя 0 справа. Сдвиг право (>>) работает аналогично.

 

как сдвиг работает я знаю. мы сдвигаем байт чтобы получить достпум к нужному биту. а как мы изменяем нужный бит вот это не понял. наверно изначально вопрос некорректно задал

а насчет 20бит думаю это мы переживем, но действительно понятнее настройка если будем использовать  другие пины.

проверил вашу основу на тиньке 13. жк дисплей запустился, но что выдал я не понял. не сплошной шум на дисплее как при неправильной инициализации, а что то более осмысленное, но все равно белеберда. не подскажите как пользоваться поподробнее:

например :

SendByte(1,0xFF);

мы отправили FF то есть должна получится вертикальная линия высотой 8 пикселей. но где она должна появится? и еще вопрос как в таком случае задавать координаты вывода?