LCD

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
sun
Первый раз сказал Мяу!
Сообщения: 32
Зарегистрирован: Ср окт 07, 2009 10:07:02
Откуда: Минск
Контактная информация:

Сообщение sun »

Если следющее значение будет не 0х00, то цикл пойдёт дельше, что приведёт к зависанию.

А по поводу кодировки я и говорю посмотри через itoa(). Я б сам посмотрел, но у меня всё слетело, я терабайт инфы форматнул (точнее полностью похоронил), так что CV у меня нету. И на CV не пишу. А в WinAVR из интереса посмотрю :).
Аватара пользователя
GRAF
Мудрый кот
Сообщения: 1867
Зарегистрирован: Ср янв 23, 2008 22:11:54
Откуда: Калининград

Сообщение GRAF »

Хорошо, напишу, спасибо :)

А по поводу кодировки я и говорю посмотри через itoa().

Может atoi() или atol()? Они обе нуль выводят.

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

char szInput []="Д";
long int li;

li = atol (szInput);
itoa(li,buffer);
lcd_PutStr(buffer);
sun
Первый раз сказал Мяу!
Сообщения: 32
Зарегистрирован: Ср окт 07, 2009 10:07:02
Откуда: Минск
Контактная информация:

Сообщение sun »

atoi() - ASCII to Int
itoa() - Int to ASCII

Вот описание из stdlib (WinAvr):
/**
\brief Convert an integer to a string.

The function itoa() converts the integer value from \c val into an
ASCII representation that will be stored under \c s. The caller
is responsible for providing sufficient storage in \c s.

\note The minimal size of the buffer \c s depends on the choice of
radix. For example, if the radix is 2 (binary), you need to supply a buffer
with a minimal length of 8 * sizeof (int) + 1 characters, i.e. one
character for each bit plus one for the string terminator. Using a larger
radix will require a smaller minimal buffer size.

\warning If the buffer is too small, you risk a buffer overflow.

Conversion is done using the \c radix as base, which may be a
number between 2 (binary conversion) and up to 36. If \c radix
is greater than 10, the next digit after \c '9' will be the letter
\c 'a'.

If radix is 10 and val is negative, a minus sign will be prepended.

The itoa() function returns the pointer passed as \c s.
*/
extern char *itoa(int __val, char *__s, int __radix);

-----
тоесть твой код должен быть вроде этого:

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

char Input []="Д"; 
char buffer[9];

atoi(Input, buffer, 10);
lcd_PutStr(buffer);
Аватара пользователя
BCluster
Собутыльник Кота
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев
Контактная информация:

Сообщение BCluster »

кодвижн наверное древний у вас. У меня в все нормально с русскими буквами.
Аватара пользователя
GRAF
Мудрый кот
Сообщения: 1867
Зарегистрирован: Ср янв 23, 2008 22:11:54
Откуда: Калининград

Сообщение GRAF »

sun писал(а):atoi() - ASCII to Int
itoa() - Int to ASCII

тоесть твой код должен быть вроде этого:

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

char Input []="Д"; 
char buffer[9];

atoi(Input, buffer, 10);
lcd_PutStr(buffer);


atoi ( const char * str );

Она строку преобразует в число и сохраняет его в int переменной.
Вызывается таким образом:

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

i = atoi (Input);


Потом это число нужно опять в строку загнать, пишем:

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

itoa(i, buffer);


Затем выводим эту строку на дисплей:

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

lcd_PutStr(buffer);


На дисплее 0 и при atol(), и при atoi().


BCluster
, 2.04.4a
Аватара пользователя
BCluster
Собутыльник Кота
Сообщения: 2512
Зарегистрирован: Пн апр 06, 2009 19:33:29
Откуда: Молдова, Кишинев
Контактная информация:

Сообщение BCluster »

#pragma rl+
//вывод руцких букф
#pragma rl-

Если так?
Аватара пользователя
GRAF
Мудрый кот
Сообщения: 1867
Зарегистрирован: Ср янв 23, 2008 22:11:54
Откуда: Калининград

Сообщение GRAF »

Нет, я это пробовал уже.
Аватара пользователя
urry
Сверлит текстолит когтями
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница
Контактная информация:

Сообщение urry »

#pragma rl+
работает в версии не выше 1.2.8
Не ?
Аватара пользователя
GRAF
Мудрый кот
Сообщения: 1867
Зарегистрирован: Ср янв 23, 2008 22:11:54
Откуда: Калининград

Сообщение GRAF »

Наверное так, моя версия эту директиву даже не распознает.
sun
Первый раз сказал Мяу!
Сообщения: 32
Зарегистрирован: Ср окт 07, 2009 10:07:02
Откуда: Минск
Контактная информация:

Сообщение sun »

сорри, напутал

char Input []="Д"; // буква
char buffer[9]; // буффер
// тут я перепутал функции
itoa(Input, buffer, 10); // преобразуем КОД БУКВЫ в строку
lcd_PutStr(buffer); // выводим на экран
Аватара пользователя
GRAF
Мудрый кот
Сообщения: 1867
Зарегистрирован: Ср янв 23, 2008 22:11:54
Откуда: Калининград

Сообщение GRAF »

Этот код не будет работать, itoa в качестве источника не воспринимает символьную переменную, только целочисленную.

Можно вот так попробовать:

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

char szInput []="Д";
int li;
int le;

li = atoi (szInput);
le=li-10;
itoa(le,buffer);
lcd_PutStr(buffer);


UPD

Попробовал ещё так:

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

li = atoi ("Д");
le=li-10;
itoa(le,buffer);
lcd_PutStr(buffer);


В обоих случаях выводит -10 на дисплей. Выходит, что atoi() не может получить код символа :(
sun
Первый раз сказал Мяу!
Сообщения: 32
Зарегистрирован: Ср окт 07, 2009 10:07:02
Откуда: Минск
Контактная информация:

Сообщение sun »

В С char - это не символ. если CV так не нравится, то:
itoa(((int)Input[0]) & 0xff, buffer, 10);
sun
Первый раз сказал Мяу!
Сообщения: 32
Зарегистрирован: Ср окт 07, 2009 10:07:02
Откуда: Минск
Контактная информация:

Сообщение sun »

Вот заливаю, с русским. У меня пошло нормально.

для CV теперь функции lcd_PutChar и lcd_PutInverseChar придётся чуть переделать на прямую работу с массивом.

Сорри, нету фотика, а телефон снимает криво, так что буквы не разобрать - выкладывать это не буду.


Вот этот кусок кода отработал на ура (+ полностью щрифт выводил на экран):

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

   char buffer[20];
   sprintf(buffer, "Uпитания:%d.%03uV     ", (EVcc / 1000), (EVcc - ((EVcc / 1000) * 1000)));
   lcd_GoToXY(0, 2);
   lcd_PutStr(buffer);
   sprintf(buffer, "Uаккумулятора:%d.%03uV     ", (AVcc / 1000), (AVcc - ((AVcc / 1000) * 1000)));
   lcd_GoToXY(0, 3);
   lcd_PutStr(buffer);
   if (EVcc != AVcc)
   {
      sprintf(buffer, "Ток заряда:%dma     ", Ia);
      lcd_GoToXY(0, 4);
      lcd_PutStr(buffer);
   }
   else
   {
      lcd_GoToXY(0, 4);
      for (char i = 0; i < 19; i++)
          buffer[i] = 0x20;
      buffer[19] = (char)0x00;
      lcd_PutStr(buffer);
   }
   if (((AVcc < 3950) && (!(PORTB & 0x02))) ||  ((AVcc < 4200) && (PORTB & 0x02)))
   {
      lcd_GoToXY(0, 5);
      if (EVcc != AVcc)
          sprintf(buffer, "Заряд...");
      else sprintf(buffer, "Собственное питание");
      lcd_PutStr(buffer);
        PORTB |= 0x02;
   }
   else
   {
      lcd_GoToXY(0, 5);
      for (char i = 0; i < 19; i++)
          buffer[i] = 0x20;
      buffer[19] = (char)0x00;
      lcd_PutStr(buffer);
      PORTB &= ~0x02;
   }
Вложения
c55_lcd.c
(3.12 КБ) 507 скачиваний
c55_lcd.h
(7.8 КБ) 522 скачивания
Аватара пользователя
GRAF
Мудрый кот
Сообщения: 1867
Зарегистрирован: Ср янв 23, 2008 22:11:54
Откуда: Калининград

Сообщение GRAF »

Выяснил через счетчик, когда он станет равен 'Д'. Счетчик остановился на числе 196.
Короче, русская заглавная А там под номером 192 (0xC0), это Windows-1251.
sun
Первый раз сказал Мяу!
Сообщения: 32
Зарегистрирован: Ср окт 07, 2009 10:07:02
Откуда: Минск
Контактная информация:

Сообщение sun »

Там внутри кодов есть смещения, скачай новый вариант, они там учтены.
Аватара пользователя
GRAF
Мудрый кот
Сообщения: 1867
Зарегистрирован: Ср янв 23, 2008 22:11:54
Откуда: Калининград

Сообщение GRAF »

Да я разобрался уже.

Вот эти же оба файла, только для CVAVR.
Вложения
c55_lcd.h
(6.93 КБ) 355 скачиваний
doz.c
(7.46 КБ) 533 скачивания
t@nki$t
Грызет канифоль
Сообщения: 289
Зарегистрирован: Ср дек 01, 2010 23:24:16

Re: LCD

Сообщение t@nki$t »

Здравствуйте! Есть дисплей от Siemens C75.У кого есть распиновка этого дисплея? А и ещё:как подключить этот дисплей вместо WH1601 и возможно ли такое подключение? Заранее спасибо.
Аватара пользователя
SubDia
Держит паяльник хвостом
Сообщения: 995
Зарегистрирован: Сб апр 02, 2011 17:59:22
Откуда: Город-герой Севастополь

Re: LCD

Сообщение SubDia »

Прошу сюда и сюда.
Юзайте поиск, в общем.
Вместо WH1601 подключить можно. Только софт переписать придется полностью. =))
pavel_cydenov: Вобще я праAVRославный человек. Но и про ислARM слышал много хорошего )
MrYuran: Самые ортодоксальные — это PICудеи )
Katz: Не, 51-ники. )
Изображение
t@nki$t
Грызет канифоль
Сообщения: 289
Зарегистрирован: Ср дек 01, 2010 23:24:16

Re: LCD

Сообщение t@nki$t »

Понятно :cry: .
Спасибо SubDia
Будем искать WH1601.
Racer[RUS]
Первый раз сказал Мяу!
Сообщения: 22
Зарегистрирован: Пт апр 15, 2011 21:18:24
Откуда: Тула

Re: LCD

Сообщение Racer[RUS] »

Здравствуйте! Дисплей siemens a52. Либа написана c использованием информации с этого ресурса http://hobby.zigbee.ru/ra/ind/SiemensC55. Имеется следующая проблема: тестовая прога на меге16 выводит на экран надпись - экран пустой, инициализация как на указанном сайте. Если после команд инициализации прописать еще одну команду: вкл. дисплея с расширенным набором команда( 0x21 ), то дисплей становится "черным", надпись выводится "белая" (пиксели погашены), затем "черные" пиксели медленно "растворяются" и дисплей становится "белым". При расширенном наборе команд команды из стандартного набора, а именно установка адреса по х и у, являются другими командами, одна из них установка контрастности по моему. Я тогда в инициализации, подумав, что дело может быть в контрастности, согласно дш на контроллер в дисплее, сделал максимальную контрастность - дисплей "белый". В чем может быть проблема? Испорченный дисплей? Дисплей новый в рамке с кнопками. При необходимости могу выложить код инициализации на си.
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»