Перейти к содержанию

16F84A И Wh1602A


S_F_H

Рекомендуемые сообщения

Всем доброго времени суток. Пытаюсь подключить LCD WH1602A к МК PIC16F84A, чтоб вывести на него какую-нибудь строку.

Подключаю по схеме, описанной здесь: http://www.cqham.ru/lc_meter.phtml

С прилагаемой прошивкой все работает, а вот при попытке написать свою прошивку, на экране отображается только черная полоска.

Исходники прошивки взяты из примеров к компилятору PICC10/12/16 от HI-TECH и переделаны под схему.

Вот собственно исходник прошивки:

/*
*      LCD interface example
*      Uses routines from delay.c
*      This code will interface to a standard LCD controller
*      like the Hitachi HD44780. It uses it in 4 bit mode, with
*      the hardware connected as follows (the standard 14 pin 
*      LCD connector is used):
*      
*      PORTB bits 0-3 are connected to the LCD data bits 4-7 (high nibble)
*      PORTA bit 3 is connected to the LCD RS input (register select)
*      PORTA bit 1 is connected to the LCD EN bit (enable)
*      
*      To use these routines, set up the port I/O (TRISA, TRISD) then
*      call lcd_init(), then other routines as required.
*      
*/
#include        <htc.h>

#ifndef _XTAL_FREQ
// Unless specified elsewhere, 4MHz system frequency is assumed
#define _XTAL_FREQ 4000000
#endif





#define LCD_RS RA1
#define LCD_RW RA3
#define LCD_EN RA2
#define lcd_cursor(x)   lcd_write(((x)&0x7F)|0x80)

#define LCD_DATA        PORTB

#define LCD_STROBE()    ((LCD_EN = 1),(LCD_EN=0))

/* write a byte to the LCD in 4 bit mode */

void
lcd_write(unsigned char c)
{
 __delay_us(40);
 LCD_DATA = ( ( c >> 4 ) & 0x0F );
 LCD_STROBE();
 LCD_DATA = ( c & 0x0F );
 LCD_STROBE();
}

/*
*      Clear and home the LCD
*/

void
   lcd_clear(void)
{
 LCD_RS = 0;
 lcd_write(0x1);
 __delay_ms(2);
}

/* write a string of chars to the LCD */

void
   lcd_puts(const char * s)
{
 LCD_RS = 1;     // write characters
 while(*s)
   lcd_write(*s++);
}

/* write one character to the LCD */

void
   lcd_putch(char c)
{
 LCD_RS = 1;     // write characters
 lcd_write( c );
}


/*
* Go to the specified position
*/

void
   lcd_goto(unsigned char pos)
{
 LCD_RS = 0;
 lcd_write(0x80+pos);
}

/* initialise the LCD - put into 4 bit mode */
void
   lcd_init()
{
 char init_value;

 /*ADCON1 = 0x06;  // Disable analog pins on PORTA*/

 init_value = 0x3;
 TRISA=0;
 TRISB=0;
 LCD_RS = 0;
 LCD_EN = 0;
 LCD_RW = 0;

 __delay_ms(15); // wait 15mSec after power applied,
 LCD_DATA         = init_value;
 LCD_STROBE();
 __delay_ms(5);
 LCD_STROBE();
 __delay_us(200);
 LCD_STROBE();
 __delay_us(200);
 LCD_DATA = 2;   // Four bit mode
 LCD_STROBE();

 lcd_write(0x28); // Set interface length
 lcd_write(0xF); // Display On, Cursor On, Cursor Blink
 lcd_clear();    // Clear screen
 lcd_write(0x6); // Set entry Mode
}

void
   main(void)
{
 __CONFIG(FOSC_XT & WDTE_OFF, CP_OFF);

 lcd_init();
 lcd_goto(0);    // select first line
 lcd_puts("12345678");
 lcd_goto(0x40); // Select second line
 lcd_puts("Hello world");

 for(;;
}

помогите пожалуйста разобраться, где именно проблемы, или хотя бы как заставить WH1602 работать. Примерны на C приветствуются.

Заранее спасибо.

Изменено пользователем S_F_H
Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

1.непонятно что за инклюд

#include        <htc.h>

а для контроллера разве не нужно?

2.Если как вы говорите прошивка работает,то почему вы ее не используете?

3.тут вижу подводный камень.

#define LCD_STROBE()    ((LCD_EN = 1),(LCD_EN=0))

если это работало на одной частоте контроллера,то может не заработать на другой.

Дело в том,что контроллер дисплея работает на своей частоте,а строб должен быть шириной как раз,чтобы прошел такт синхронизации дисплея.Как я считаю.Я между командами бы паузу поставил

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...