|
Помогите разобраться с символьным ЖКИ, HD44780 |
|
|
|
Feb 20 2007, 10:49
|

Местный
  
Группа: Свой
Сообщений: 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!
|
|
|
|
|
 |
Ответов
|
Apr 9 2008, 10:57
|

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

|
Привет всем.
не смог бы обладатель готового решения поделиться опытом, и скинуть готовые библиотеки которые не надо править.
я сталкнулся с той-же проблемой что и автор форума. раньше писал на CVAR и там все было без проблем.
интересно автор решил эту проблему ???
|
|
|
|
|
Jun 4 2008, 07:39
|
Частый гость
 
Группа: Свой
Сообщений: 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, ...) */ ------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
Сообщений в этой теме
Pavel V. Помогите разобраться с символьным ЖКИ Feb 20 2007, 10:49 prottoss Цитата(Pavel V. @ Feb 20 2007, 14:49) Уже... Feb 20 2007, 11:18 Сергей Борщ Цитата(Pavel V. @ Feb 20 2007, 09:49) К с... Feb 20 2007, 11:35 Pavel V. Что-то никак не получается ничего..
prottoss, я и... Feb 20 2007, 20:11 Николай Z Цитата(Pavel V. @ Feb 21 2007, 00:11) ...... Aug 21 2007, 09:40  zltigo Цитата(Николай Z @ Aug 21 2007, 12:40) Ве... Aug 21 2007, 12:17 alux Нашел классный исходник! Классный - от слова к... Jun 11 2008, 16:24 Сергей Борщ Цитата(alux @ Jun 11 2008, 19:24) Но обяз... Jun 11 2008, 22:35 z80ru Может и мне советом поможите, по замене МТ-10Т7 на... Jun 26 2008, 15:03
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|