|
|
  |
Запутался с указателями и строками в CodeVision |
|
|
|
Feb 1 2008, 12:19
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(Kuzmi4 @ Feb 1 2008, 15:09)  2 defunct - стоп: 1) "...Если variable - массив, тогда что variable и &variable равны...." 2) "...Даже без студии - один из вариантов компилиться не будет. Еслим будет - компилятор на свалку. ..." Всмысле - как это понимать ? Вроде одно противоречит другому..... тип будет разным, а значение одинаковое. i.e.: (char *)p1 = (char *)0x100; (void *)p2 =(void *)0x100; (unsigned)p1 == (unsigned)p2 Цитата(Зверюга @ Feb 1 2008, 09:20)  Господа, вывод на LCD работает. СТроки из flash выводятся без проблем. Тогда сделать так: 1. Увеличить размер стека - сделать его ~256 - 512 байт (лучше больше) и чем больше тем лучше. 2. временные буферы типа вашего buffer ложить в стеке (внутри функций которые будут печатать) и делать их разумного размера не 4 байта, а напр 64 или 128: Код void test(int var) { U8 buffer[128];
sprintf( buffer, "Var = %d\r\n", var); lcd_str_ram( ..., ..., buffer, ..., ...); }
.... test( 555 ); Память занятая таким буфером будет освобождаться автоматически, на выходе из функции.
|
|
|
|
|
Feb 1 2008, 12:47
|

кекс
     
Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326

|
Цитата(Kuzmi4 @ Feb 1 2008, 15:36)  Просто я считаю что замена &variable при конструкции кода
void func (unsigned char*p2data) { unsigned char i; for (i=0;i<10;i++) put_char(*p2data++);
} на variable - не есть правильно, даже наоборот... Теперь уже я вас не понял  там же ж в оригинале передается массив, а массив - это указатель на первый элемент. это будет правильный вариант: Код char buffer [4]; func( buffer ); но, можно еще и так Код func( (char *)&buffer ); и func( &buffer[0] ); что даст одинаковый результат, так вот я говорю что такой вариант: func( (char *)&buffer ); --- самый неудачный, и так лучше никогда не делать!!
|
|
|
|
|
Feb 1 2008, 19:00
|
Участник

Группа: Участник
Сообщений: 26
Регистрация: 8-12-06
Пользователь №: 23 269

|
2 зверюга ты вариант от bzx пробовал? у меня вроде такой метод вывода чисел из ram работал, давно писал, уже не помню, пока всё это закинул P.S. я не профи в написании кода, так что возможны некоторые косячки и недоработки,но вывод переменной из ram точно работал
|
|
|
|
|
Feb 2 2008, 06:15
|
Местный
  
Группа: Свой
Сообщений: 413
Регистрация: 15-12-06
Пользователь №: 23 563

|
BelTech Цитата давно писал, уже не помню, пока всё это закинул А собственно вашу библиотеку и мучаю. Уважаемый! Вы автор! Вы человек, у которого вроде все работало! А ну-ка, фигурально выражаясь, отвечайте за базар ))) В отличие от многих вы по крайней мере можете откопать проекти проверить. P.S. кстати, в вашей библиотеке в начале есть назначение пинов микроконтроллера. Видимо для того, чтобы использовать различные контроллеры при необходимости. А вот в теле asm-функций у вас CS и RS указаны явно - к ним обращение идет через sbi 0x18,0 и sbi 0x18,7. Я из-за этого полгода назад забросил эту библиотеку - так и не смог запустить. Исправили бы, а то народ качает вашу библиотеку.
|
|
|
|
|
Feb 2 2008, 16:09
|
Местный
  
Группа: Свой
Сообщений: 413
Регистрация: 15-12-06
Пользователь №: 23 563

|
Короче, вот это работает: Цитата char flash *str; ----------
str="yohany babai"; sprintf(s,"%p",str ); ram_to_lcd(65,75,s,f8x14,0,black); И вот это работает: Цитата variable=200; sprintf(s,"%i",variable ); ram_to_lcd(65,75,s,f8x14,0,black); ; Мне только непонятно, зачем нужна функция Lcd_str_ram? По идее, то что я написал во втором работающем варианте и есть функция lcd_str_ram, но, может я и ошибаюсь она коряво написана. А ram_to_lcd работает нормально.
|
|
|
|
|
Feb 2 2008, 16:50
|
Участник

Группа: Участник
Сообщений: 26
Регистрация: 8-12-06
Пользователь №: 23 269

|
зачем нужна функция Lcd_str_ram Я хотел её запихнкуть в функцию ram_to_lcd, но тоже запутался в указателях , и решил пока оставить как есть. Если додумаешься как сделать лучше, то я и сам заменю в своём коде, но я же говорил, что я начинающий, а не профи, так что могут быть косячки. Так если вывод переменной и текста на lcd у тебя работает, то что ещё надо?
Насчёт пинов , asm ,как я помню, только в функции lcd_clr? для быстрой очистки дисплея, но её можно переписать на си, а можно просто использовать закрашенный прямоугольник,т.е. lcd_fillrect с белым цветом.
только что посмотрел вместо очистки можно использовать следующее void fill_screen(ui16 color) { ui16 i=0; lcd_wrcmd16(0xEF90); lcd_wrcmd16(0x0500); lcd_wrcmd16(0x0600); lcd_wrcmd16(0x0700); for (i=0; i<DISP_W*DISP_H; i++)lcd_wrdat16(color);
|
|
|
|
|
Feb 2 2008, 17:18
|
Участник

Группа: Участник
Сообщений: 26
Регистрация: 8-12-06
Пользователь №: 23 269

|
да, закрашенный прямоугольник на глаз долго рисуется, а когда на экране на белом фоне цифры, а затем очищаете экран, и выводишь новые , вроде не так заметно, можно сказать не заметно совсем. А как измерить fps? А на счёт spi2x пока не знаю, сейчас ради интереса достану плату, перепрошью и посмотрю.
|
|
|
|
|
Feb 2 2008, 17:49
|
Участник

Группа: Участник
Сообщений: 26
Регистрация: 8-12-06
Пользователь №: 23 269

|
только что, убирал spi2x , странно, скорость отрисовки не меняется, даже сам не знаю в чём дело, lcd_clr на asme работает быстрее, чем lcd_fillrect на си. В сторону шрифтов я не копал особо(хватает иуже имеющихся), а вот ф-ия вывода картинки гле-то у меня есть.Точно знаю что иконки выводятся. У тебя какая библиотека, там рисование иконок есть или нет? Если хочешь дам последнии рукотворения.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|