Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
Добавлено: Чт ноя 11, 2010 01:17:01
всё работает 
Здесь можно немножко помяукать :)
https://radiokot.ru/forum/
А можно уточнить. Просто число в каком-то регистре?Как преобразовать число (unsigned int)
Ну, во-первых, int занимает 2 байта. Во-вторых, оно лежит где-то в ОЗУ.Roman Venom писал(а): А можно уточнить. Просто число в каком-то регистре? П.С. Изучение С пока только в планах
а стандартная libc - это тоже "чья-то" библиотека? ее можно использовать? а то функция itoa() простаивает напрасно...Gudd-Head писал(а):Как преобразовать число (unsigned int) для его вывода на дисплей, т.е. получить пять цифр: единицы, десятки, сотни и т.д. кроме функции BCD? Или кто как выводит числа, не используя чьи-то библиотеки(?) типа lcd.h?
У меня в стандартной библиотеке есть только atoi()ARV писал(а):а стандартная libc - это тоже "чья-то" библиотека? ее можно использовать? а то функция itoa() простаивает напрасно...
sprintf есть в стандартной библиотеке ввода-выводаARV писал(а):sptrintf() тоже нет в стандратной библиотеке?
Код: Выделить всё
char* i2a(unsigned int num){
static char str[6];
char *ptr;
for(ptr = &str[4]; ; ptr--){
*ptr = num % 10 + '0';
num /= 10;
if(!num) return ptr;
}
}Спасибо! Теперь подобные вопросы я буду задавать тут: http://radiokot.ru/forum/viewtopic.php?f=20&t=37190 (Вопросы по С/С++ (СИ)), где надеюсь увидеть ВасARV писал(а):я на всякий случай накропал вам функцию-аналог itoa() для unsigned int.... по аналогии можете сделать и для более крупных, если надо...
Да. Соберите, да посмотрите.aam писал(а):Неужели я задал такой тупой вопрос???
Почему все так зациклились на всяких там смуляторах-шпротеусах? Почему сразу "не будет работать" и "выкидывать"??? В даташите всё четко прописано как инициализировать дисплей. Тупо сделать всё по даташиту, и будет вам счастье! В чём проблема? Не заработает - будем думать все вместеaam писал(а):Чтобы собрать, нужно купить детали. Вот куплю я этот индикатор, а потом окажется, что он не пашет - я что его выкидывать буду? А так может я куплю не 8х2, а 12х2 (если найду конечно).
Ой-ой-ой. Кто-хороший не написал библиотеку... Какой плохой! А ведь выставить команду/данные на вход дисплея и дёрнуть ногой "Е" это так сложно! Проще разбираться в чьих-то каракулях.aam писал(а):В библиотеке LCD.H в списке поддерживаемых индикаторов нет индикатора 2х8.
Да, есть такая темаaam писал(а):а 2х8 есть и стоит всего 150 руб.
Есть:http://icdarom.ru/show_cat3.php?catid=2 ... eg=2405130aam писал(а):2x12 в протеусе тоже нет, там 2х16 и симулировать можно и на нем, но тема в другом. В библиотеке LCD.H в списке поддерживаемых индикаторов нет индикатора 2х8.
И вообще, я даже больше склонялся к 2х12, т. к. можно больше информации вывести, а размеры у него (имеется ввиду плата) такие же как у 2х8, но вот 2х12 нигде в продаже не видел, а 2х8 есть и стоит всего 150 руб. Делаю я зарядник на 4 пальчиковых аккума. Впринципе 2х8 для зарядки вполне хватило бы (вывод состояния по каждому каналу или меню задания тока и емкости), но с индикатором 2х12 можно было бы еще отображать прошедшее время и установленный ток.
А нафига мне доставка? Там что самому нельзя забрать?olegators68 писал(а):Только курьеру, два индикатора придется отдать
Код: Выделить всё
/* Ожидаем готовности LCd
LCD_DDRDATA &= 0x0F; (LCD_PORTCTRL |= LCD_wire_RW) // чтение из ЖКИ
(LCD_PORTCTRL |= LCD_wire_RS) // на шине данные
LCD_BUSY_FLAG=7
while(0 != (LCD_BUSY_FLAG & LCD_Bus_Read()))
{
}
Код: Выделить всё
// Установка цикла обмена по шине данных
#define LCD_STARTSTB() (LCD_PORTCTRL |= LCD_wire_E) // начало строба обмена данными
#define LCD_ENDSTB() (LCD_PORTCTRL &= ~LCD_wire_E) // окончание строба обмена данными
/******************************************************************************
Цикл чтения из ЖКИ
Перед циклом должны быть произведены установки линий:
LCD_wire_RS(команда/данные)
LCD_wire_RW(запись/чение) = 1
ПРЕДУПРЕЖДЕНИЕ!!! Во избежание порчи данных в неиспользуемых линиях порта данных
ЖКИ в 4-х битном режиме, желательно запрещать прерывания, код которых
взаимодействует со свободными линиями порта, либо в прерывании запоминать
состояние регистров порта, перед внесением изменений, и восстанавливать данные
по завершению прерывания
*******************************************************************************/
UCHAR LCD_Bus_Read(void)
{
UCHAR data;
LCD_STARTSTB(); // начало строба
NOP(); // необходимо для установки состояния на линии LCD_wire_E
data = LCD_PINDATA; // читаем данные
LCD_ENDSTB(); // конец строба
#ifdef LCD_4BIT_BUS_REQURED
UCHAR temp = data; // запоминаем старшую тетраду
LCD_STARTSTB(); // начало строба
NOP(); // необходимо для установки состояния на линии LCD_wire_E
data = LCD_PINDATA; // читаем младшую тетраду
LCD_ENDSTB(); // конец строба
SWAP(data); // младшую тетраду на свое место
data &= 0x0f; // очищаем старшую тетраду в data
temp &= 0xf0; // очищаем младшую тетраду в temp
data |= temp; // совмещаем тетрады
#endif//LCD_4BIT_BUS_REQURED
return data;
}