реклама на сайте
подробности

 
 
> Помогите разобраться с символьным ЖКИ, HD44780
Pavel V.
сообщение Feb 20 2007, 10:49
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 211
Регистрация: 3-06-06
Пользователь №: 17 742



Уже второй день пытаюсь оживить символьный ЖКИ под IAR. До этого момента использовал CodeVision и встроенную в него библиотеку, которая всегда работала как часы.

С IAR пришлось разбираться второпях, до этого с ним дела не имел.

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

Она даже заработала и стала выводить на дисплей данные. Но радость моя была недолгая - программа работает крайне нестабильно. То все нормально, то выводится куча левых символов без какой-либо закономерности.

С железом это никак не может быть связано - с CodeVision все работало хорошо.

Много игрался с задержками, думал из-за них, но они как будто не влияют на этот глюк.

К сообщению прицепляю код, помогите, пожалуйста, разобраться! Или, быть может, у кого-то есть готовая библиотека для работы с этими ЖКИ?

Контроллер - ATmega48, частота 1 МГц.

Сообщение отредактировал Pavel V. - Feb 20 2007, 10:52
Прикрепленные файлы
Прикрепленный файл  main.txt ( 303 байт ) Кол-во скачиваний: 105
Прикрепленный файл  lcd.txt ( 4.59 килобайт ) Кол-во скачиваний: 162
 


--------------------
Good News Everyone!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
vashurin
сообщение Apr 9 2008, 10:57
Сообщение #2





Группа: Новичок
Сообщений: 9
Регистрация: 8-04-08
Пользователь №: 36 568



Привет всем.

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

я сталкнулся с той-же проблемой что и автор форума.
раньше писал на CVAR и там все было без проблем.

интересно автор решил эту проблему ???
Go to the top of the page
 
+Quote Post
artemm
сообщение Jun 4 2008, 07:39
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 80
Регистрация: 23-07-07
Из: Украина, г. Сумы
Пользователь №: 29 306



не помню где содрал, но у меня работает в иаре
Файл LCD.h
------------------------------------------------------------------------------------------------------------------------------
#include "delay.h"

// LCD pins
#define DB7 0x80
#define DB6 0x40
#define DB5 0x20
#define DB4 0x10
#define ENABLE 0x04
#define RS1 0x01

// Port
#define LCDDDR DDRA
#define LCDPORT PORTA
#define LCDPIN PINA
// General defines
#define DATA 0x01
#define CTRL 0x00

//#define LCDPORT PORTD //для AVR PORTB4 .. PORTB7-ШД
#define E PORTA_Bit2 //вывод ОМЭВМ для подкл. E
#define RS PORTA_Bit0 //---||--- RS

//#define LCDDDR DDRD
//#define LCDPIN PIND



//**************************************************
//запись старшей тетрады числа

void LcdWriteNibble (unsigned char a)
{
//E=0;
delay_us(30);
LCDPORT&=0x0f;
LCDPORT|=(a&0xf0);
delay_us(50);
E=1;
delay_us(50);
E=0;
//delay_us(2);
}
//**************************************************
//ожидание сброса флага ожидания
void WaitBusy (void)
{
delay_us(70);
}
//**************************************************
//запись команды
void LcdWriteCommand (unsigned char a)
{
E=0;
RS=0;
LcdWriteNibble(a);
LcdWriteNibble(a<<4);
WaitBusy();
}
//**************************************************
// инициализация модуля HD44780
//a=1 - однострочный дисплей
//a!=1 - двустрочный
//курсор выключен,автоинкремент адреса,нет сдвига
//экрана
void LcdInit (unsigned char a)
{
DDRA = (1<<DDA2);
PORTA_Bit2 = 0;
delay_ms(50);
LCDDDR = 0xFF; //3F
LCDPORT = 0x00;
E=0;
RS=0;
delay_ms(100);
delay_ms(100);
delay_ms(100);
delay_ms(100);
LcdWriteNibble(0x30);
delay_ms(100);
delay_ms(100);
delay_ms(100);
LcdWriteNibble(0x30);
delay_ms(100);
delay_ms(100);
delay_ms(100);
LcdWriteNibble(0x30);
WaitBusy();
delay_us(100);
delay_us(100);
delay_us(100);
LcdWriteNibble(0x20);
WaitBusy();
if (a==1) LcdWriteCommand(0x20);
else LcdWriteCommand(0x28);
LcdWriteCommand(0x08);
LcdWriteCommand(0x01);
delay_ms(2);
LcdWriteCommand(0x06);
LcdWriteCommand(0x0c);
//delay_ms(30);
}

//**************************************************
//запись символа

void LcdWriteData (unsigned char a)
{
E=0;
RS=1;
delay_us(20);
LcdWriteNibble(a);
LcdWriteNibble(a<<4);
WaitBusy();
}

/***********************************************************************
Write a control or data byte to the display. Control: 1=Ctrl, 0=Data
If data (control=0) set position with lcd_goto first.
Since the LCD is driven in 4-bit modus, we write the MSB nibble first
and the the LSB nibble.
***********************************************************************/
void tlcd_write_byte(unsigned char control, unsigned char byte)
{
if ((byte & 0x80) == 0x80) LCDPORT |= DB7; else LCDPORT &= ~DB7;
if ((byte & 0x40) == 0x40) LCDPORT |= DB6; else LCDPORT &= ~DB6;
if ((byte & 0x20) == 0x20) LCDPORT |= DB5; else LCDPORT &= ~DB5;
if ((byte & 0x10) == 0x10) LCDPORT |= DB4; else LCDPORT &= ~DB4;
if (control == 1) LCDPORT |= RS1; else LCDPORT &= ~RS1;
LCDPORT |= ENABLE;
LCDPORT &= ~ENABLE;
if ((byte & 0x08) == 0x08) LCDPORT |= DB7; else LCDPORT &= ~DB7;
if ((byte & 0x04) == 0x04) LCDPORT |= DB6; else LCDPORT &= ~DB6;
if ((byte & 0x02) == 0x02) LCDPORT |= DB5; else LCDPORT &= ~DB5;
if ((byte & 0x01) == 0x01) LCDPORT |= DB4; else LCDPORT &= ~DB4;
if (control == 1) LCDPORT |= RS1; else LCDPORT &= ~RS1;
LCDPORT |= ENABLE;
LCDPORT &= ~ENABLE;
WaitBusy();
}
/***********************************************************************
Write strings to the display. Set position with tlcd_goto first.
Text will wrap if to long to show on one line.
***********************************************************************/
void tlcd_write_string(char *ptr)
{
while (*ptr != 0x00) tlcd_write_byte(DATA,*ptr++);
}

/***********************************************************************
Goto specified column and line. 1,1 is the upper left corner.
***********************************************************************/
void tlcd_goto(unsigned char column, unsigned char line)
{
unsigned char addr;
line--;
column--;
addr = (line * 64) + column;
tlcd_write_byte(CTRL, addr | 0x80);
}

//**************************************************
//установка курсора в позицию adr


void LcdSetPosition(unsigned char adr)
{
LcdWriteCommand(adr|0x80);
}

//**************************************************
//очистка экрана
void LcdClrScr()
{
LcdWriteCommand(0x01);
delay_ms(60);
}

//------------------------------------------------------------------------------
void LcdSetCGAdress(unsigned char adr)
{
LcdWriteCommand((adr&0x7f)|0x40);
}
//------------------------------------------------------------------------------


------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------



Файл delay.h

------------------------------------------------------------------------------------------------------------------------------

#include <intrinsics.h> //функции циклов

#define f_cpu (16000000) //Частота задающего генератора(ГЦ)




#define delay_us(temp) (__delay_cycles((temp * f_cpu) / 1000000));
/* макрос задержки на "temp" микросекунд. точная задержка при целом значении
задающей частоты генератора в МГц (1, 2, 3, 4, ..., 10, 11, ...) */// 571 + 2, 387 + 2

#define delay_ms(temp) (__delay_cycles((temp * f_cpu) / 1000));
/* макрос задержки на "temp" миллисекунд. точная задержка при целом значении
задающей частоты генератора в кГц (1, 2, 3, 4, ..., 10, 11, ...) */

#define delay_s(temp) (__delay_cycles(temp * f_cpu));
/* макрос задержки на "temp" секунд. точная задержка при целом значении
задающей частоты генератора в Гц (1, 2, 3, 4, ..., 10, 11, ...) */
------------------------------------------------------------------------------------------------------------------------------
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 10:19
Рейтинг@Mail.ru


Страница сгенерированна за 0.01391 секунд с 7
ELECTRONIX ©2004-2016