STM32 :)

Здесь рассматриваются вопросы относящиеся к работе библиотеки AXLIB
kosmas
Сообщения: 19
Зарегистрирован: 13 авг 2016, 17:43

STM32 :)

Сообщение kosmas » 22 сен 2016, 14:03

Начал опыты с stm32, для чего мне понадобился вывод на дисплей. 1602 - наше все. А поскольку программист я "так себе", ищу куски кода, переделываю под свои нужды. В тырнете полно примеров под стандартную периферию, но в STM перешли на HAL. Приходится осваивать в процессе.. Кароче. Библиотека для LCD1602 вроде как переписана (без кириллицы), но возник вопрос с пользовательским символом. Как его делать? В ардуино это деталось просто -

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

  byte ant[8] = {
    0b10101,
    0b10101,
    0b01110,
    0b00100,
    0b00100,
    0b00100,
    0b00100,
    0b00000
  };

 lcd.createChar(0, ant);

 lcd.write((byte)0);
А тут как делать?

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

lcd_simbol(0, ant);
не работает. Да вроде как и не должно... :)
Вложения
lcd1602.rar
мои опыты.
(1.88 КБ) 237 скачиваний

Аватара пользователя
gurvinok
Сообщения: 1539
Зарегистрирован: 02 мар 2013, 09:18
Откуда: Москва

Re: STM32 :)

Сообщение gurvinok » 22 сен 2016, 14:36

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

kosmas
Сообщения: 19
Зарегистрирован: 13 авг 2016, 17:43

Re: STM32 :)

Сообщение kosmas » 22 сен 2016, 14:46

gurvinok писал(а):Если функция переписана правильно, то должно работать. Первый аргумент это адрес ячейки, а второй как раз указатель на массив.
А объявлять-то символ как?

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

  char ant[8] = {
    0b10101,
    0b10101,
    0b01110,
    0b00100,
    0b00100,
    0b00100,
    0b00100,
    0b00000
  };

  lcd_gotoxy(15,1);
  lcd_simbol(0, ant);
Не работает. Про тип данных byte Eclips не знает.. :(

Аватара пользователя
gurvinok
Сообщения: 1539
Зарегистрирован: 02 мар 2013, 09:18
Откуда: Москва

Re: STM32 :)

Сообщение gurvinok » 22 сен 2016, 14:59

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

char ant[8] = {
    0b00010101,
    0b00010101,
    0b00001110,
    0b00000100,
    0b00000100,
    0b00000100,
    0b00000100,
    0b00000000
  };

  lcd_gotoxy(15,1);
  lcd_simbol(0, ant);
Нолики забыл))) Это жу 8 битный массив.
Если долго мучиться, может быть получится.

kosmas
Сообщения: 19
Зарегистрирован: 13 авг 2016, 17:43

Re: STM32 :)

Сообщение kosmas » 22 сен 2016, 17:14

Все. Запутался. Прошу помощь зала, звонок другу, и прочие подсказки:
1. lcd.c

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

void lcd_simbol(char addr_simbol, char *str)
{
	addr_simbol = (8 * addr_simbol) | 0x40;

	lcd_com(addr_simbol >> 4);
	lcd_com(addr_simbol & 0x0F);

	for(char i = 0; i <= 7; i++)
	{
		lcd_char_out(*str);
		str++;
	}
	lcd_gotoxy(0,0);
}



//-------------------------------------------------------------------------
//	Исчо функция создания и записи в память своего символа
//	Передаваемые аргументы:
//		uint8_t simbol - Адрес в CGRAM от 0 до 15
//		uint8_t *str - Указатель на начало массива с байтами символа
//-------------------------------------------------------------------------
void lcd_user_char(uint8_t char_num, uint8_t *char_data)
{
	lcd_com((char_num * 8) | 0x40);
//	lcd_char_out((1<<6) |(char_num * 8));
	for (uint8_t i=0;i<=7;i++)
	{
		lcd_char_out(char_data[i]);
	}
	lcd_com(0x80);
}

Две функции, занимающиеся одним и тем же.

2. Файл main.c

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

  /* USER CODE BEGIN 2 */
  char ant1[8] = {
    0b00010101,
    0b00010101,
    0b00001110,
    0b00000100,
    0b00000100,
    0b00000100,
    0b00000100,
    0b00000000
  };

  uint8_t ant2[8] = {
    0b00010101,
    0b00010101,
    0b00001110,
    0b00000100,
    0b00000100,
    0b00000100,
    0b00000100,
    0b00000000
  };

  lcd_init(0);
  lcd_clear();
//lcd_str_out("TEST"); // для проверки. работает
  lcd_gotoxy(0,0);
  lcd_simbol(0, ant1);
  lcd_gotoxy(0,1);
  lcd_user_char(1, ant2);
  /* USER CODE END 2 */
В итоге получаем картинку
111.jpg
Если убрать

lcd_gotoxy(0,0);
lcd_simbol(0, ant1);
то картинка не меняется.

Если убрать

lcd_gotoxy(0,1);
lcd_user_char(1, ant2);
то экран пустой.

Куда смотреть?

kosmas
Сообщения: 19
Зарегистрирован: 13 авг 2016, 17:43

Re: STM32 :)

Сообщение kosmas » 22 сен 2016, 17:38

Шьёрт знает, что такое...

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

void lcd_user_char(uint8_t char_num, uint8_t *char_data)
{
	lcd_com((char_num * 8) | 0x40);
	lcd_char_out(char_data[0]);
	lcd_com(0x80);
}

  uint8_t ant2[8] = {
    0b00010101,
    0b00010101,
    0b00001110,
    0b00000100,
    0b00000100,
    0b00000100,
    0b00000100,
    0b00000000
  };

  lcd_init(0);
  lcd_clear();
  lcd_gotoxy(0,0);
  lcd_str_out("TEST");
  lcd_gotoxy(8,0);
  lcd_user_char(1, ant2);
Почему-то работает... Не подскажете, почему???? :o :lol:

Аватара пользователя
gurvinok
Сообщения: 1539
Зарегистрирован: 02 мар 2013, 09:18
Откуда: Москва

Re: STM32 :)

Сообщение gurvinok » 22 сен 2016, 19:03

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

uint8_t ant1[8] = {
    0b00010101,
    0b00010101,
    0b00001110,
    0b00000100,
    0b00000100,
    0b00000100,
    0b00000100,
    0b00000000
  };

  lcd_init(0);
  lcd_clear();
  lcd_gotoxy(0,0);
  lcd_str_out("TEST");
  lcd_user_char(1, ant1); // Записываем символ в память
  lcd_gotoxy(8,0);
  lcd_char_out(1); // Выводим символ по Этому адресу.
Если долго мучиться, может быть получится.

kosmas
Сообщения: 19
Зарегистрирован: 13 авг 2016, 17:43

Re: STM32 :)

Сообщение kosmas » 22 сен 2016, 22:03


Аватара пользователя
gurvinok
Сообщения: 1539
Зарегистрирован: 02 мар 2013, 09:18
Откуда: Москва

Re: STM32 :)

Сообщение gurvinok » 22 сен 2016, 22:07

:shock: :lol: :shock: :lol: :shock: :lol:
Если долго мучиться, может быть получится.

Аватара пользователя
gurvinok
Сообщения: 1539
Зарегистрирован: 02 мар 2013, 09:18
Откуда: Москва

Re: STM32 :)

Сообщение gurvinok » 22 сен 2016, 22:09

Может проще цветной взять по SPI 160х128?
Если долго мучиться, может быть получится.

Ответить