Re: Работа с ЖКИ на контроллере HD44780 и его аналогах
Добавлено: Сб янв 19, 2013 11:15:42
Запустил на 4 МГц, заработало. А надо на 8 МГц. Что надо сделать: изменить задержки delay с 15 до 30 или в как то по другому. чтобы грамотно было?
Здесь можно немножко помяукать :)
https://radiokot.ru/forum/
грамотно - выставлять задержки по даташиту на индикатор, см стр.16 "Инициализация"vetdoktor писал(а):Запустил на 4 МГц, заработало. А надо на 8 МГц. Что надо сделать: изменить задержки delay с 15 до 30 или в как то по другому. чтобы грамотно было?
+1unalex писал(а): я бы эту либу для себя с нуля написал, согласно своим потребностям и не ковыряясь в чужом коде
Спасибо большое за то, что откликнулись! А как это законнектить с CodeVision AVR? К сожалению, до гуру программирования МК не дорос пока, начал осваивать с языка С, так как его я знаю более менее) Подключать к МК научился, выводить текст и данные научился, но хочу до конца довести задумку. Очень надеюсь на Вашу помощь и помощь форумчан!sa-ta писал(а):Вывод на LCD собственных знаков и символов - http://www.picbasic.ru/forum/9-803-1
там даже софтинка прилагается.
Код: Выделить всё
// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0x15 ;PORTC
#endasm
#include <lcd.h>
#include <delay.h>
//#define DEBUG
// Global variables defination
typedef unsigned char byte;
//Тут определяем как будт выглядеть символ(ы)
//поле 5х8
flash byte ch0[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f};
flash byte ch1[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x1f};
flash byte ch2[8]={0x00,0x00,0x00,0x00,0x00,0x1f,0x1f,0x1f};
flash byte ch3[8]={0x00,0x00,0x00,0x00,0x1f,0x1f,0x1f,0x1f};
flash byte ch4[8]={0x00,0x00,0x00,0x1f,0x1f,0x1f,0x1f,0x1f};
flash byte ch5[8]={0x00,0x00,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f};
flash byte ch6[8]={0x00,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f};
flash byte ch7[8]={0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f};
//функция регистрации самопальных символов
void define_char(byte flash *pc,byte char_code)
{
byte i,a;
a=(char_code<<3) | 0x40;
for (i=0; i<8; i++) lcd_write_byte(a++,*pc++);
}
//В данном случае символы нужны для отображения урвня
//так он и выводится.
void display_level(unsigned char _level)
{
#ifndef DEBUG
unsigned char k,j;
lcd_gotoxy(8,1);
for (k=0;k<=_level;k++)
//Сам символ выводится как обычно функцией lcd_putchar()
lcd_putchar(k);
for (j=k;j<8;j++)
lcd_putsf(" ");
#endif
}
void main(void)
{
...
...
lcd_init(16);
lcd_gotoxy(0,0);
define_char(ch0,0);
define_char(ch1,1);
define_char(ch2,2);
define_char(ch3,3);
define_char(ch4,4);
define_char(ch5,5);
define_char(ch6,6);
define_char(ch7,7);
lcd_clear();
lcd_putsf("LCD TEST");
lcd_gotoxy(0,1);
lcd_putsf("Signal ");
for(i=0;i<8;i++)
{
display_level(i);
delay_ms(100);
};
}//end of main
Насколько я понял человек собрался свои собственные символы выводить.ibiza11 писал(а):Единственное не понял, что Вы имели в виду под "64 байтами для 8 символов"Зачем 64 байта для 8 символов?
Код: Выделить всё
void lcd_cgram_init(void) //процедура инициализации пользовательского знакогенератора
{
lcd_set_address(CGRAM_START_ADDRESS); //установка начального адреса CGRAM
delay (107); //танцы с бубном :)
unsigned char i;
for (i=0; i<8; i++) //правая стрелка
lcd_put_byte(RightArrow[i]);
for (i=0; i<8; i++) //левая стрелка
lcd_put_byte(LeftArrow[i]);
for (i=0; i<8; i++) //правая стрелка - остановленная
lcd_put_byte(RightArrowStop[i]);
for (i=0; i<8; i++) //левая стрелка - остановленная
lcd_put_byte(LeftArrowStop[i]);
for (i=0; i<8; i++) //основание степени (10^)
lcd_put_byte(Exp[i]);
for (i=0; i<8; i++) //запятая
lcd_put_byte(Dot[i]);
lcd_set_address(DDRAM_START_ADDRESS); //установка курсора в начальное положение ОЗУ
delay(107);
}В ДШ она производится при печати каждого байта, судя по диаграмме работыRepeated procedures for an 4-bit bus interface
Noise causing transfer mismatch between the four upper and lower bits can be corrected by a reset triggered by consecutively writing a “0000” instruction five times. The next transfer starts from the lower four bits and then first instruction “Function set” can be executed normally. Please insert the synchronization function in the head of procedures.
Код: Выделить всё
//НАСТРАИВАЕМЫЕ ДЕФАЙНЫ (порты и линии портов для работы с LED дисплеем)
#define LCDDataPORT PORTD /*порт данных LCD*/
#define LCDDataDDR DDRD /*программирование линий данных LCD*/
#define LCD_D4 4 /*линия данных D4*/
#define LCD_D5 5 /*линия данных D5*/
#define LCD_D6 6 /*линия данных D6*/
#define LCD_D7 7 /*линия данных D7*/
#define LCDControlPORT PORTD /*порт линий управления LCD*/
#define LCDControlDDR DDRD /*программирование линий управления LCD*/
#define LCD_RS 2 /*линия управления RS*/
#define LCD_E 3 /*линия управления E*/
//НЕНАСТРАИВАЕМЫЕ ДЕФАЙНЫ
#define INLINE inline __attribute__((__always_inline__))
#define NOINLINE __attribute__((__noinline__))
#define LCDCommandCurHome 0x02 /*LCD переместить курсов в позицию 0,0*/
#define LCDCommandCurOn 0x0E /*LCD показать курсор*/
#define LCDCommandCurBlink 0x0F /*LCD мигающий курсор*/
#define LCDCommandCurOff 0x0C /*LCD выключить курсор*/
#define LCDCommandCurLeft 0x10 /*LCD курсор переместить влево*/
#define LCDCommandCurRight 0x14 /*LCD курсор переместить вправо*/
#define LCDCommandDispClear 0x01 /*LCD очистить данные дисплея*/
#define LCDCommandDispBlank 0x08 /*LCD скрыть данные (но не стирать)*/
#define LCDCommandDispVisible 0x0C /*LCD отобразить данные*/
#define LCDCommandDispShiftLeft 0x18 /*LCD сдвиг информации на дисплее влево*/
#define LCDCommandDispShiftRight 0x1C /*LCD сдвиг информации на дисплее вправо*/
#define LCDCommandDispModeProg 0x08|0x04 /*0x08 - программирование режима дисплея (присутствует всегда)*/
/*0x04 - отображение данных включено,*/
/*0x02 - курсор включен, 0x01 - курсор мерцает*/
//----------------------------------------------------------------------------------------------
//задержка для строб импульса
NOINLINE void LCDStrobeDelay (void)
{
_delay_ms (1);
}
//строб импульс
NOINLINE void LCDEStrobe (void)
{
LCDControlPORT|= (1<<LCD_E);
LCDStrobeDelay ();
LCDControlPORT &= ~(1<<LCD_E);
LCDStrobeDelay ();
}
//Функция инициализации LCD
void LCDInit (void)
{
LCDDataPORT &= ~(1<<LCD_D7|1<<LCD_D6|1<<LCD_D5|1<<LCD_D4); //очистить линии данных
LCDDataDDR |= (1<<LCD_D7|1<<LCD_D6|1<<LCD_D5|1<<LCD_D4); //линии данных на вывод
LCDControlPORT &= ~(1<<LCD_E|1<<LCD_RS); //очистить линии управления
LCDControlDDR |= (1<<LCD_E|1<<LCD_RS); //линии управления на вывод
//_delay_ms (50); //закомментировать, если в фузах контроллера запрограммирована задержка при старте 64мс
LCDDataPORT |= (1<<LCD_D5|1<<LCD_D4);
LCDEStrobe ();
_delay_ms (5);
LCDEStrobe ();
LCDEStrobe ();
LCDDataPORT &= ~(1<<LCD_D4);
LCDEStrobe ();
LCDSendCommand (0x28); //режим - 4 бита, 2 строки
LCDSendCommand (LCDCommandDispModeProg); //режим дисплея (определен в дефайнах)
}
//----------------------------------------------------------------------------------------------
//Функция установки курсора в нужную позицию
void LCDCurGotoXY (unsigned char x, unsigned char y)
{
if (y == 1)
x |= 0x40;
LCDSendCommand (0x80 | x);
}
//----------------------------------------------------------------------------------------------
//Функция загрузки графического символа в LCD
void LCDCharDefine (unsigned char *pMas, unsigned char SimbNum){
unsigned char temp = (0x40 | (SimbNum<<3));
for (unsigned char i=0; i<8; i++){
LCDSendCommand (temp++);
LCDSendChar (pgm_read_byte (pMas++));
}
}
//----------------------------------------------------------------------------------------------
//Функция отправки команды на LCD
//АРГУМЕНТ - код команды
void LCDSendCommand (unsigned char byte)
{
LCDDataPORT &= ~(1<<LCD_D7|1<<LCD_D6|1<<LCD_D5|1<<LCD_D4); //очистить линии данных
LCDDataPORT |= ((byte & 0b11110000) >> (4-LCD_D4)); //вывод старшей тетрады команды
LCDEStrobe (); //строб импульс
LCDDataPORT &= ~(1<<LCD_D7|1<<LCD_D6|1<<LCD_D5|1<<LCD_D4); //очистить линии данных
LCDDataPORT |= ((byte & 0b00001111) << (LCD_D4)); //вывод младшей тетрады команды
LCDEStrobe (); //строб импульс
}
//----------------------------------------------------------------------------------------------
//функция вывода символа на LCD дисплей (в текущую позицию)
//АРГУМЕНТ - код символа
void LCDSendChar (unsigned char byte)
{
LCDControlPORT |= 1<<LCD_RS; //признак загрузки символа
LCDSendCommand (byte); //вывод символа
LCDControlPORT &= ~(1<<LCD_RS);
}
//----------------------------------------------------------------------------------------------
//Функция очистки буфера дисплея в SRAM (32 байта)
void LCDClearBuf (void)
{
for (unsigned char i=0; i<32; i++)
LCDBuffer [i] = 0x20;
} На одном изделии, стоящем в "плохих" электромагнитных условиях у меня тоже нижняя строка пропадает(4-битный режим). Лечу автоматической реинициализацией каждую минуту. Хватает т.к. на экран смотрят не чаще чем раз в полгода.Babulesnik писал(а):Кто-нибудь сталкивался с такой проблемой?
Спасибо.Стоит диод шотки ss36. А в каком смысле разделить питание ?vitalik_1984 писал(а):А не пробовали разделить питание силовое и сигнальное? И к тому же всякие там моторчики и катушки нужно шунтировать диодом(между плюсом и минусом потребителя- естественно так, чтобы не было КЗ при включении).