| Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей... |
WH4004 4bit Мозговой штурм
23.12.2011, 22:32
|
|
|
Частый гость
Регистрация: 23.12.2011
Сообщений: 13
Сказал спасибо: 15
Сказали Спасибо 7 раз(а) в 7 сообщении(ях)
|
WH4004 4bit Мозговой штурм
Добрый вечер уважаемые форумчане. Суть моей проблемы в том, что не получаеться запустить дисплей Winstar WH4004 4x40 в полной режиме. Т.е.
из 4-х строк, работают только две нижних. В первой строке горят квадратики (что косвенно указывает на работоспособность 1-го контроллера). Меняя местами сигналы Е1 и Е2 я убедился в том, что текст сообщений меняется.
Тоесть на экран должно вывести
LCD 1 Line 1
LCD 1 Line 2
LCD 2 Line 1
LCD 2 Line 2
Если у меня стояло Е1 Е2 было так
############
LCD 2 Line 1
LCD 2 Line 2
Если стояло Е2 Е1 то выводит так
############
LCD 1 Line 1
LCD 1 Line 2
ПРограмма + драйвер для дисплея написаны в PICC
|
Код:
|
//Программа
//lcd_40x4.c
#include ‹16F877A.h›
#use delay(clock=20000)
#fuses XT, NOPROTECT, PUT, NOWDT, NOBROWNOUT, NOLVP, NOCPD, NOWRT
#include ‹lcd_40x4_h.c›
void main() {
lcd_init1();
delay_ms(2);
lcd_init2();
while(true) {
//TEST 1
//---------------------------------
lcd_gotoxy(1,1);
printf(lcd_putc1,"Test ... 123456789");
delay_ms(150);
lcd_gotoxy(1,2);
printf(lcd_putc1,"QERTY ASDFGH ZXCVBNM");
delay_ms(150);
lcd_gotoxy(1,3);
printf(lcd_putc2,"TEST LCD 40X4");
delay_ms(150);
lcd_gotoxy(1,2);
printf(lcd_putc2,"/*-+,.");
delay_ms(1500);
lcd_putc1("\f");
delay_ms(1000);
lcd_putc2("\f");
delay_ms(1500);
//---------------------------------
//TEST 1
//---------------------------------
lcd_gotoxy(1,1);
printf(lcd_putc1,"LINE 1 LCD1");
delay_ms(1000);
lcd_gotoxy(1,2);
printf(lcd_putc1,"LINE 2 LCD1");
delay_ms(1000);
lcd_gotoxy(1,3);
printf(lcd_putc2,"LINE 1 LCD2");
delay_ms(1000);
lcd_gotoxy(1,4);
printf(lcd_putc2,"LINE 2 LCD2");
delay_ms(1000);
lcd_gotoxy(1,1);
printf(lcd_putc1,"LCD 1 LINE 1");
delay_ms(1500);
lcd_gotoxy(2,1);
printf(lcd_putc2,"LCD 2 LINE 1");
delay_ms(1500);
lcd_gotoxy(3,2);
printf(lcd_putc1,"LCD 1 LINE 2");
delay_ms(1500);
lcd_gotoxy(4,2);
printf(lcd_putc2,"LCD 2 LINE 2");
delay_ms(1500);
lcd_putc1("\f");
delay_ms(1500);
lcd_putc2("\f");
//---------------------------------
}
} |
|
Код:
|
//Драйвер
//lcd_40x4_h.c by huichoman
#define LCD_DB4 PIN_D4
#define LCD_DB5 PIN_D5
#define LCD_DB6 PIN_D6
#define LCD_DB7 PIN_D7
#define LCD_RS PIN_C0
#define LCD_RW PIN_C1
#define LCD_E1 PIN_C2
#define LCD_E2 PIN_C3
#define USE_RW_PIN 1
// These are the line addresses for most 4x40 LCDs.
#define LCD_LINE_1_ADDRESS 0x00 //1-st chip
#define LCD_LINE_2_ADDRESS 0x40 //1-st chip
#define LCD_LINE_3_ADDRESS 0x00 //2-ed chip
#define LCD_LINE_4_ADDRESS 0x40 //2-ed chip
//========================================
#define lcd_type 2 // 0=5x7, 1=5x10, 2=2 lines(or more)
int8 lcd_line;
int8 const LCD_INIT_STRING[4] =
{
0x20 | (lcd_type ‹‹ 2), // Set mode: 4-bit, 2+ lines, 5x8 dots
0xc, // Display on
1, // Clear display
6 // Increment cursor
};
//DISPLAY 1
//-------------------------------------
void lcd_send_nibble1(int8 nibble)
{
output_bit(LCD_DB4, !!(nibble & 1));
output_bit(LCD_DB5, !!(nibble & 2));
output_bit(LCD_DB6, !!(nibble & 4));
output_bit(LCD_DB7, !!(nibble & 8));
delay_cycles(1);
output_high(LCD_E1);
delay_us(2);
output_low(LCD_E1);
}
//DISPLAY 2
//-------------------------------------
void lcd_send_nibble2(int8 nibble)
{
output_bit(LCD_DB4, !!(nibble & 1));
output_bit(LCD_DB5, !!(nibble & 2));
output_bit(LCD_DB6, !!(nibble & 4));
output_bit(LCD_DB7, !!(nibble & 8));
delay_cycles(1);
output_high(LCD_E2);
delay_us(2);
output_low(LCD_E2);
}
#ifdef USE_RW_PIN
int8 lcd_read_nibble(void)
{
int8 retval;
#bit retval_0 = retval.0
#bit retval_1 = retval.1
#bit retval_2 = retval.2
#bit retval_3 = retval.3
retval = 0;
output_high(LCD_E1);
delay_us(1);
retval_0 = input(LCD_DB4);
retval_1 = input(LCD_DB5);
retval_2 = input(LCD_DB6);
retval_3 = input(LCD_DB7);
output_low(LCD_E1);
delay_us(1);
return(retval);
}
#endif
#ifdef USE_RW_PIN
int8 lcd_read_byte(void)
{
int8 low;
int8 high;
output_high(LCD_RW);
delay_cycles(1);
high = lcd_read_nibble();
low = lcd_read_nibble();
return( (high‹‹4) | low);
}
#endif
//DISPLAY 1
//----------------------------------------
// Send a byte to the LCD.
void lcd_send_byte1(int8 address, int8 n)
{
output_low(LCD_RS);
#ifdef USE_RW_PIN
while(bit_test(lcd_read_byte(),7)) ;
#else
delay_us(60);
#endif
if(address)
output_high(LCD_RS);
else
output_low(LCD_RS);
delay_cycles(1);
#ifdef USE_RW_PIN
output_low(LCD_RW);
delay_cycles(1);
#endif
output_low(LCD_E1);
lcd_send_nibble1(n ›› 4);
lcd_send_nibble1(n & 0xf);
}
//----------------------------
//DISPLAY 2
//----------------------------------------
// Send a byte to the LCD.
void lcd_send_byte2(int8 address, int8 n)
{
output_low(LCD_RS);
#ifdef USE_RW_PIN
while(bit_test(lcd_read_byte(),7)) ;
#else
delay_us(60);
#endif
if(address)
output_high(LCD_RS);
else
output_low(LCD_RS);
delay_cycles(1);
#ifdef USE_RW_PIN
output_low(LCD_RW);
delay_cycles(1);
#endif
output_low(LCD_E2);
lcd_send_nibble2(n ›› 4);
lcd_send_nibble2(n & 0xf);
}
//----------------------------
//DISPLAY 1
//----------------------------
void lcd_init1(void)
{
int8 i;
lcd_line = 1;
output_low(LCD_RS);
#ifdef USE_RW_PIN
output_low(LCD_RW);
#endif
output_low(LCD_E1);
delay_ms(35);
for(i=0 ;i ‹ 3; i++)
{
lcd_send_nibble1(0x03);
delay_ms(5);
}
lcd_send_nibble1(0x02);
for(i=0; i ‹ sizeof(LCD_INIT_STRING); i++)
{
lcd_send_byte1(0, LCD_INIT_STRING[i]); /*
Этой строки небыло, я добавил её сам по аналогии lcd_init2
*/
#ifndef USE_RW_PIN
delay_ms(5);
#endif
}
}
//DISPLAY 2
void lcd_init2(void)
{
int8 i;
lcd_line = 1;
output_low(LCD_RS);
#ifdef USE_RW_PIN
output_low(LCD_RW);
#endif
output_low(LCD_E2);
delay_ms(35);
for(i=0 ;i ‹ 3; i++)
{
lcd_send_nibble2(0x03);
delay_ms(5);
}
lcd_send_nibble2(0x02);
for(i=0; i ‹ sizeof(LCD_INIT_STRING); i++)
{
lcd_send_byte2(0, LCD_INIT_STRING[i]);
#ifndef USE_RW_PIN
delay_ms(5);
#endif
}
}
//----------------------------
void lcd_gotoxy(int8 x, int8 y)
{
int8 address;
switch(y)
{
case 1:
address = LCD_LINE_1_ADDRESS;
break;
case 2:
address = LCD_LINE_2_ADDRESS;
break;
case 3:
address = LCD_LINE_3_ADDRESS;
break;
case 4:
address = LCD_LINE_4_ADDRESS;
break;
default:
address = LCD_LINE_1_ADDRESS;
break;
}
address += x-1;
lcd_send_byte1(0, 0x80 | address);
lcd_send_byte2(0, 0x80 | address);
}
// DISPLAY 1
void lcd_putc1(char c)
{
switch(c)
{
case '\f':
lcd_send_byte1(0,1);
lcd_line = 1;
delay_ms(2);
break;
case '\n':
lcd_gotoxy(1, ++lcd_line);
break;
case '\b':
lcd_send_byte1(0,0x10);
break;
default:
lcd_send_byte1(1,c);
break;
}
}
//DISPLAY 2
void lcd_putc2(char c)
{
switch(c)
{
case '\f':
lcd_send_byte2(0,1);
lcd_line = 1;
delay_ms(2);
break;
case '\n':
lcd_gotoxy(1, ++lcd_line);
break;
case '\b':
lcd_send_byte2(0,0x10);
break;
default:
lcd_send_byte2(1,c);
break;
}
}
//------------------------------
#ifdef USE_RW_PIN
char lcd_getc(int8 x, int8 y)
{
char value;
lcd_gotoxy(x,y);
// Wait until busy flag is low.
while(bit_test(lcd_read_byte(),7));
output_high(LCD_RS);
value = lcd_read_byte();
output_low(LCD_RS);
return(value);
}
#endif |
Ниже прикладываю схемы соединений.
P.s. Буду признателен за помощь в решении моей проблемы.
Последний раз редактировалось VitaminPSG; 24.12.2011 в 15:27.
|
|
|
|
Сказали "Спасибо" VitaminPSG
|
|
|
23.12.2011, 23:07
|
|
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 9,979
Сказал спасибо: 928
Сказали Спасибо 2,261 раз(а) в 1,557 сообщении(ях)
|
Re: WH4004 4bit Мозговой штурм
Сообщение от VitaminPSG
|
|
ПРограмма + драйвер для дисплея написаны в PICC
|
Это CCS . Хоть он так же Pic C ,Но говоря PICC обычно подразумевают HI-TECH.
Вы меняете E1 и E2 и у вас меняется вывод . У меня подозрения что один из выходов или не сконфигурирован или не рабочий.
1) Осциллограф , анализатор есть ?
2) Подсоединять временно какой то один из E . Тут либо будет так же на одну половину выводить , либо совсем не будет . Зато это подтвердит мои слова.
__________________
Осторожно , злой кот
Последний раз редактировалось dosikus; 23.12.2011 в 23:11.
|
|
|
|
Эти 2 пользователя(ей) сказали Спасибо dosikus за это сообщение:
|
|
|
23.12.2011, 23:23
|
|
|
Частый гость
Регистрация: 23.12.2011
Сообщений: 13
Сказал спасибо: 15
Сказали Спасибо 7 раз(а) в 7 сообщении(ях)
|
Re: WH4004 4bit Мозговой штурм
Если я оставляю E1 (E2 отключаю выводит следующее)
#########
#########
Если я оставляю E2(E1 отключаю выводит следующее)
#########
LCD 2 Line 1
LCD 2 Line 2
Мне кажеться что не происходит инициализация первого контроллера =(
|
|
|
|
Сказали "Спасибо" VitaminPSG
|
|
|
23.12.2011, 23:26
|
|
|
Прописка
Регистрация: 08.10.2009
Сообщений: 101
Сказал спасибо: 2
Сказали Спасибо 11 раз(а) в 10 сообщении(ях)
|
Re: WH4004 4bit Мозговой штурм
Сообщение от VitaminPSG
|
Если я оставляю E1 (E2 отключаю выводит следующее)
#########
#########
Если я оставляю E2(E1 отключаю выводит следующее)
#########
LCD 2 Line 1
LCD 2 Line 2
Мне кажеться что не происходит инициализация первого контроллера =(
|
Правильно вам кажется  , а все из за того что у вас не правильно она написана
попробуйте почитать доку для инициализации там должна быть большая задержка в начале
для проверке исправить код программы так :
void main() {
lcd_init2();
delay_ms(2);
lcd_init1();
и верните все E как были
|
|
|
|
Эти 2 пользователя(ей) сказали Спасибо EugenPKH за это сообщение:
|
|
|
23.12.2011, 23:28
|
|
|
Почётный гражданин KAZUS.RUN
Регистрация: 05.08.2007
Адрес: Болгария Перник
Сообщений: 1,771
Сказал спасибо: 74
Сказали Спасибо 357 раз(а) в 245 сообщении(ях)
|
Re: WH4004 4bit Мозговой штурм
Код впечатляет. Без комментариев, тоесть пишем задачу, все ясно, через месяц, после написания кода следующей программы как будем разбиратся что написали прежде ? Если нужно подправить ? А ?
__________________
Мыслю, следовательно существую
|
|
|
|
Эти 2 пользователя(ей) сказали Спасибо Popeye за это сообщение:
|
|
|
23.12.2011, 23:40
|
|
|
Частый гость
Регистрация: 23.12.2011
Сообщений: 13
Сказал спасибо: 15
Сказали Спасибо 7 раз(а) в 7 сообщении(ях)
|
Re: WH4004 4bit Мозговой штурм
|
|
|
|
Сказали "Спасибо" VitaminPSG
|
|
|
23.12.2011, 23:41
|
|
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 9,979
Сказал спасибо: 928
Сказали Спасибо 2,261 раз(а) в 1,557 сообщении(ях)
|
Re: WH4004 4bit Мозговой штурм
VitaminPSG, Проверяете вживую ?
__________________
Осторожно , злой кот
|
|
|
|
Эти 2 пользователя(ей) сказали Спасибо dosikus за это сообщение:
|
|
|
23.12.2011, 23:42
|
|
|
Частый гость
Регистрация: 23.12.2011
Сообщений: 13
Сказал спасибо: 15
Сказали Спасибо 7 раз(а) в 7 сообщении(ях)
|
Re: WH4004 4bit Мозговой штурм
Сообщение от Popeye
|
|
Код впечатляет. Без комментариев, тоесть пишем задачу, все ясно, через месяц, после написания кода следующей программы как будем разбиратся что написали прежде ? Если нужно подправить ? А ?
|
Если поможете убду примного благодарен, на решение проблемы готов даже выделить 300 рублей)
|
|
|
|
Сказали "Спасибо" VitaminPSG
|
|
|
23.12.2011, 23:43
|
|
|
Частый гость
Регистрация: 23.12.2011
Сообщений: 13
Сказал спасибо: 15
Сказали Спасибо 7 раз(а) в 7 сообщении(ях)
|
Re: WH4004 4bit Мозговой штурм
Сообщение от dosikus
|
|
VitaminPSG, Проверяете вживую ?
|
Да, только что перепрошил, все по прежнему.
|
|
|
|
Сказали "Спасибо" VitaminPSG
|
|
|
23.12.2011, 23:47
|
|
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 9,979
Сказал спасибо: 928
Сказали Спасибо 2,261 раз(а) в 1,557 сообщении(ях)
|
Re: WH4004 4bit Мозговой штурм
Сообщение от VitaminPSG
|
|
Да, только что перепрошил, все по прежнему.
|
Мою версию проверить не можете ?
__________________
Осторожно , злой кот
|
|
|
|
Эти 2 пользователя(ей) сказали Спасибо dosikus за это сообщение:
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 10:01.
|
|