roboforum.ru

Технический форум по робототехнике.

Winstar WH1602a-NGG-CP к ATmega8 на PortC?

Winstar WH1602a-NGG-CP к ATmega8 на PortC?

Alex_Sor » 11 мар 2010, 11:10

Привет всем !

использую Winstar WH1602a-NGG-CP LCD display.

но надо нестандартное включение:
(смотри схему ниже)

Программа тут:
Код: Выделить всёРазвернуть
/*****************************************************
CodeWizardAVR V1.25.9

Project : lcd-2
Version : 1
Date : 10.02.2010
Author : alex
Company : SVR
Comments:

Chip type : ATmega8
Program type : Application
Clock frequency : 16,000000 MHz
Memory model : Small
External SRAM size : 0
Data Stack size : 256
*****************************************************/

#include <mega8.h>

// Standard Input/Output functions
#include <stdio.h>
#include <delay.h>

// ==============================================
// Declare your global variables here

char i;
unsigned char pc;

void init_mylcd(void)
{
PORTC.4=0; // ïîäíèìàåì RS â 0
pc=0x03; // init !
// pc|=0b00100000; // ïîäíèìàåì Å â 1
pc&=0b00001111; // ãàñèì ñòàðø.áèòû

PORTC=pc; // âûâîäèì äàííûå èç ðñ
PORTC.5=1; // Å â 1
delay_ms(1); // delay = 1 milisecond
PORTC.5=0; // ãàñèì Å â 0 - ò.å. äàåì ñòðîá.
delay_ms(5);

PORTC.4=0; // ïîäíèìàåì RS â 0
pc=0x03; // init !
// pc|=0b00100000; // ïîäíèìàåì Å â 1
pc&=0b00001111; // ãàñèì ñòàðø.áèòû
PORTC=pc; // âûâîäèì äàííûå èç ðñ
PORTC.5=1; // Å â 1
delay_ms(1);
PORTC.5=0; // ãàñèì Å â 0 - ò.å. äàåì ñòðîá.
delay_ms(5);

delay_ms(100);

PORTC.4=0; // ïîäíèìàåì RS â 0
pc=0x03; // init !
// pc|=0b00100000; // ïîäíèìàåì Å â 1
pc&=0b00001111; // ãàñèì ñòàðø.áèòû
PORTC=pc; // âûâîäèì äàííûå èç ðñ
PORTC.5=1; // Å â 1
delay_ms(1);
PORTC.5=0; // ãàñèì Å â 0 - ò.å. äàåì ñòðîá.
delay_ms(5);

PORTC.4=0; // ïîäíèìàåì RS â 0
pc=0x02; // init !
// pc|=0b00100000; // ïîäíèìàåì Å â 1
pc&=0b00001111; // ãàñèì ñòàðø.áèòû
PORTC=pc; // âûâîäèì äàííûå èç ðñ
PORTC.5=1; // Å â 1
delay_ms(1);
PORTC.5=0; // ãàñèì Å â 0 - ò.å. äàåì ñòðîá.
delay_ms(5);

PORTC.4=0; // ïîäíèìàåì RS â 0
pc=0x02; // init !
// pc|=0b00100000; // ïîäíèìàåì Å â 1
pc&=0b00001111; // ãàñèì ñòàðø.áèòû
PORTC=pc; // âûâîäèì äàííûå èç ðñ
PORTC.5=1; // Å â 1
delay_ms(1);
PORTC.5=0; // ãàñèì Å â 0 - ò.å. äàåì ñòðîá.
delay_ms(5);

PORTC.4=0; // ïîäíèìàåì RS â 0
pc=0x0C; // init N+F
// pc|=0b00100000; // ïîäíèìàåì Å â 1
pc&=0b00001111; // ãàñèì ñòàðø.áèòû
PORTC=pc; // âûâîäèì äàííûå èç ðñ
PORTC.5=1; // Å â 1
delay_ms(1);
PORTC.5=0; // ãàñèì Å â 0 - ò.å. äàåì ñòðîá.
delay_ms(5);

PORTC.4=0; // ïîäíèìàåì RS â 0
pc=0x00; // init !
// pc|=0b00100000; // ïîäíèìàåì Å â 1
pc&=0b00001111; // ãàñèì ñòàðø.áèòû
PORTC=pc; // âûâîäèì äàííûå èç ðñ
PORTC.5=1; // Å â 1
delay_ms(1);
PORTC.5=0; // ãàñèì Å â 0 - ò.å. äàåì ñòðîá.
delay_ms(5);

PORTC.4=0; // ïîäíèìàåì RS â 0
pc=0x08; // init !
// pc|=0b00100000; // ïîäíèìàåì Å â 1
pc&=0b00001111; // ãàñèì ñòàðø.áèòû
PORTC=pc; // âûâîäèì äàííûå èç ðñ
PORTC.5=1; // Å â 1
delay_ms(1);
PORTC.5=0; // ãàñèì Å â 0 - ò.å. äàåì ñòðîá.
delay_ms(5);

PORTC.4=0; // ïîäíèìàåì RS â 0
pc=0x00; // init !
// pc|=0b00100000; // ïîäíèìàåì Å â 1
pc&=0b00001111; // ãàñèì ñòàðø.áèòû
PORTC=pc; // âûâîäèì äàííûå èç ðñ
PORTC.5=1; // Å â 1
delay_ms(1);
PORTC.5=0; // ãàñèì Å â 0 - ò.å. äàåì ñòðîá.
delay_ms(5);

PORTC.4=0; // ïîäíèìàåì RS â 0
pc=0x01; // init !
// pc|=0b00100000; // ïîäíèìàåì Å â 1
pc&=0b00001111; // ãàñèì ñòàðø.áèòû
PORTC=pc; // âûâîäèì äàííûå èç ðñ
PORTC.5=1; // Å â 1
delay_ms(1);
PORTC.5=0; // ãàñèì Å â 0 - ò.å. äàåì ñòðîá.
delay_ms(5);

PORTC.4=0; // ïîäíèìàåì RS â 0
pc=0x00; // init !
// pc|=0b00100000; // ïîäíèìàåì Å â 1
pc&=0b00001111; // ãàñèì ñòàðø.áèòû
PORTC=pc; // âûâîäèì äàííûå èç ðñ
PORTC.5=1; // Å â 1
delay_ms(1);
PORTC.5=0; // ãàñèì Å â 0 - ò.å. äàåì ñòðîá.
delay_ms(5);

PORTC.4=0; // ïîäíèìàåì RS â 0
pc=0x07; // init ID+S
// pc|=0b00100000; // ïîäíèìàåì Å â 1
pc&=0b00001111; // ãàñèì ñòàðø.áèòû
PORTC=pc; // âûâîäèì äàííûå èç ðñ
PORTC.5=1; // Å â 1
delay_ms(1);
PORTC.5=0; // ãàñèì Å â 0 - ò.å. äàåì ñòðîá.
delay_ms(5);
PORTC.4=1; // ïîäíèìàåì RS â 1
delay_ms(220);
}

void WriteIns(unsigned char instruction)
{
unsigned char tmp;

PORTC.4=0; // ïîäíèìàåì RS â 0
tmp=instruction>>4;
// tmp|=0b00100000; // ïîäíèìàåì Å â 1
tmp&=0b00001111; // ãàñèì ñòàðø.áèòû
PORTC=tmp; // âûâîäèì äàííûå
PORTC.5=1; // ïîäíèìàåì Å â 1
delay_ms(1);
PORTC.5=0; // ïîäíèìàåì Å â 0

// instruction|=0b00100000; // ïîäíèìàåì Å â 1
instruction&=0b00001111; // ãàñèì ñòàðø.áèòû
PORTC.4=0; // ïîäíèìàåì RS â 0
PORTC=instruction; // âûâîäèì äàííûå
PORTC.5=1; // ïîäíèìàåì Å â 1
delay_ms(1);
PORTC.5=0; // ïîäíèìàåì Å â 0
delay_ms(100);
}

void WriteData(unsigned char data1)
{
unsigned char tmp1;

PORTC.4=1; // ïîäíèìàåì RS â 1

tmp1=data1>>4;
// tmp1|=0b00110000; // ïîäíèìàåì Å è RS â 1
tmp1&=0b00011111; // ãàñèì ñòàðø.áèòû
PORTC=tmp1; // âûâîäèì äàííûå
PORTC.5=1; // ïîäíèìàåì Å â 1
delay_ms(1);
PORTC.5=0; // ïîäíèìàåì Å â 0

// data1|=0b00110000; // ïîäíèìàåì Å è RS â 1
data1&=0b00011111; // ãàñèì ñòàðø.áèòû
PORTC.4=1; // ïîäíèìàåì RS â 1
PORTC=data1; // âûâîäèì äàííûå
PORTC.5=1; // ïîäíèìàåì Å â 1
delay_ms(1);
PORTC.5=0; // ïîäíèìàåì Å â 0
delay_ms(100);
}


void main(void)
{
PORTB=0x00;
DDRB=0x00;

PORTC=0x00;
DDRC=0x7F;

PORTD=0x00;
DDRD=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;

// Global enable interrupts
#asm("sei")

while (1)
{
delay_ms(500);
init_mylcd();
// ---------------------

i=0;
pc=0;

for (i=0; i<20; i++)
{
WriteIns(0x00); // Óñòàíîâèëè êóð â 1 ïîç ïåð ñòðîê
WriteData(0x44); // âûâåëè "D"
WriteIns(0x01); // âòîð ïîçèöèÿ ïåð ñòîðîêè
WriteData(0x49); // âûâåëè "I"
WriteIns(0x02); // òðåòüÿ ïîçèöèÿ ïåð ñòîðîêè
WriteData(0x47); // âûâåëè "G"
WriteIns(0x03); // ÷åòâåðòàÿ ïîçèöèÿ ïåð ñòîðîêè
WriteData(0x49); // âûâåëè "I"
WriteIns(0x04); // ïÿòàÿ ïîçèöèÿ ïåð ñòîðîêè
WriteData(0x54); // âûâåëè "T"

delay_ms(500);

}
delay_ms(1000);
};
}


Писано "дебильно" :) потому что я уже задолбался - не работает дисплей - ни одного символа не выводит и инит не проходит. Осциллографом все проверил - все сигналы АТмега8 выдает, ЖКИ сам рабочий - проверял на другом контроллере...
Пайка нормальная - проверил все что можно.
Косяков нет.

ПОМОГИТЕ !!!

саму тему такого нестандартного включения я брал отсюда:
http://www.pocketmagic.net/?p=447
Вложения
lcd-to-ATmega8-sheet.gif
LCD to ATmega8 to PORTC...
Последний раз редактировалось Alex_Sor 11 мар 2010, 11:36, всего редактировалось 2 раз(а).

Re: Winstar WH1602a-NGG-CP к ATmega8 на PortC?

avr123.nm.ru » 11 мар 2010, 11:17

Вот рабочий пример, пояснения, исходники - все, что нужно для использования поплуярных LCD - http://proavr.narod.ru/z5.htm

Re: Winstar WH1602a-NGG-CP к ATmega8 на PortC?

blindman » 11 мар 2010, 11:32

Модератор "blindman":Картинку закачать на форум, код оформить тэгом code

Re: Winstar WH1602a-NGG-CP к ATmega8 на PortC?

Alex_Sor » 11 мар 2010, 11:32

:(
Вы тему вообще читали ?
Для АТмеги8 CVAVR НЕ ДАЕТ в "проекте" использовать ПортС !
Поэтому ваш "лечебник" не работает в моей схеме.

Я пытаюсь "побитово" тупо проинитить дисплей и хоть что-то в него вывести.
Нихрена не выходит - ни морганий ни выдачи символа :(

Пример того мужика (последняя ссылка в моем посте) написан для WinAVR, портировка кода - неприемлема - я убил день чтобы хоть как-то скрестить - и бросил.
Я сам напишу себе все необходимые функции - мне нужно сейчас две веши:
1) проинитить ЖКИ. Причем именно мой а не какой-то "условно стандартный",
2) хоть один символ вывести на него...

Есть идеи ? только без посылания "читать учебник" - я в С программирую с 1986года, и самостоятельно маленькие контроллеры разрабатываю с конца 90-х - так что не надо меня идиотом считать, Ок ?

Re: Winstar WH1602a-NGG-CP к ATmega8 на PortC?

avr123.nm.ru » 11 мар 2010, 11:38

> не надо меня идиотом считать, Ок ?

Вы не идиот.

Но если внимательно почитаете то узнаете что библиотека для LCD от CVAVR правится на изменение расположения сигналов для LCD в порте.

Добавлено спустя 2 минуты 23 секунды:
Alex_Sor писал(а):Нихрена не выходит - ни морганий ни выдачи символа :(


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

Раз вы давно программируете и не ... то вам это нетрудно будет сделать.

Re: Winstar WH1602a-NGG-CP к ATmega8 на PortC?

Alex_Sor » 11 мар 2010, 11:43

...какие все умные :)

вот весь целиком файл lcd.h из CVAVR:
Код: Выделить всёРазвернуть
/* LCD driver routines

  CodeVisionAVR C Compiler
  (C) 1998-2003 Pavel Haiduc, HP InfoTech S.R.L.

  BEFORE #include -ING THIS FILE YOU
  MUST DECLARE THE I/O ADDRESS OF THE
  DATA REGISTER OF THE PORT AT WHICH
  THE LCD IS CONNECTED!

  EXAMPLE FOR PORTB:

    #asm
        .equ __lcd_port=0x18
    #endasm
    #include <lcd.h>

*/

#ifndef _LCD_INCLUDED_
#define _LCD_INCLUDED_

#pragma used+

void _lcd_ready(void);
void _lcd_write_data(unsigned char data);
// write a byte to the LCD character generator or display RAM
void lcd_write_byte(unsigned char addr, unsigned char data);
// read a byte from the LCD character generator or display RAM
unsigned char lcd_read_byte(unsigned char addr);
// set the LCD display position  x=0..39 y=0..3
void lcd_gotoxy(unsigned char x, unsigned char y);
// clear the LCD
void lcd_clear(void);
void lcd_putchar(char c);
// write the string str located in SRAM to the LCD
void lcd_puts(char *str);
// write the string str located in FLASH to the LCD
void lcd_putsf(char flash *str);
// initialize the LCD controller
unsigned char lcd_init(unsigned char lcd_columns);

#pragma used-
#pragma library lcd.lib

#endif



Простая замена (как вы мне советуете) ПОРТ-а на PORTC (соотв. циферьками :) )
ни к чему не приводит - ЖКИ не работает.

Еще идеи будут ? :) кроме отсылания к чтению учебников ?

Re: Winstar WH1602a-NGG-CP к ATmega8 на PortC?

avr123.nm.ru » 11 мар 2010, 11:51

Вы внимательно читайте !
avr123.nm.ru писал(а):правится на изменение расположения сигналов для LCD в порте.

Не порт меняется - что и так ясно, а то что написано выше.

Добавлено спустя 1 минуту 5 секунд:
Alex_Sor писал(а):...какие все умные :)

Этож робофорум, а не ...

Добавлено спустя 2 минуты 18 секунд:
пазырьте ка LCD.LIB

Re: Winstar WH1602a-NGG-CP к ATmega8 на PortC?

blindman » 11 мар 2010, 12:15

Alex_Sor писал(а):Пример того мужика (последняя ссылка в моем посте) написан для WinAVR, портировка кода - неприемлема - я убил

Для программиста с 20-летним стажем портирование того кода займет час максимум - в паре мест переписать ассемблерный код задержек и поправить дефайны для PORT/PIN/DDR, ну и макросы отсутствующие добавить типа _BV. Всяко быстрее и надежнее чем пытаться реанимировать код без отступов и комментариями крякозябрами

Re: Winstar WH1602a-NGG-CP к ATmega8 на PortC?

Alex_Sor » 11 мар 2010, 12:20

Вы даете какие-то заоблачные знания...

Мне не нужно переделывать и переписывать все .h и .lib ради одной простой задачки...

упрощаю задачу - вот кусок кода инициализации:
Код: Выделить всёРазвернуть
void init_mylcd(void)
{
     PORTC.4=0;                //  поднимаем RS в 0
   pc=0x03;                // это наша команда дисплею
//   pc|=0b00100000;               // поднимаем Е в 1
   pc&=0b00001111;               // гасим старший полубайт

     PORTC=pc;                 // выводим данные в ПОРТС
     PORTC.5=1;                // поднимаем Е в 1
       delay_ms(1);
     PORTC.5=0;                // гасим Е в 0 - т.е. данные должны пройти в ЖКИ
       delay_ms(5);

     PORTC.4=0;                //  поднимаем RS в 0
   pc=0x03;                // это наша команда дисплею
//   pc|=0b00100000;               // ïîäíèìàåì Å â 1
   pc&=0b00001111;               // ãàñèì ñòàðø.áèòû
     PORTC=pc;                 // âûâîäèì äàííûå èç ðñ
     PORTC.5=1;                // Å â 1
       delay_ms(1);
     PORTC.5=0;                // гасим Е в 0 - т.е. данные должны пройти в ЖКИ
       delay_ms(5);

       delay_ms(100);

     PORTC.4=0;                //  поднимаем RS в 0
   pc=0x03;                // это наша команда дисплею
//   pc|=0b00100000;               // ïîäíèìàåì Å â 1
   pc&=0b00001111;               // ãàñèì ñòàðø.áèòû
     PORTC=pc;                 // âûâîäèì äàííûå èç ðñ
     PORTC.5=1;                // Å â 1
       delay_ms(1);
     PORTC.5=0;                // гасим Е в 0 - т.е. данные должны пройти в ЖКИ
       delay_ms(5);
       
     PORTC.4=0;                //  поднимаем RS в 0
   pc=0x02;                // это наша команда дисплею
//   pc|=0b00100000;               // ïîäíèìàåì Å â 1
   pc&=0b00001111;               // ãàñèì ñòàðø.áèòû
     PORTC=pc;                 // âûâîäèì äàííûå èç ðñ
     PORTC.5=1;                // Å â 1
       delay_ms(1);
     PORTC.5=0;                // гасим Е в 0 - т.е. данные должны пройти в ЖКИ
       delay_ms(5);

     PORTC.4=0;                //  поднимаем RS в 0
   pc=0x02;                // это наша команда дисплею
//   pc|=0b00100000;               // ïîäíèìàåì Å â 1
   pc&=0b00001111;               // ãàñèì ñòàðø.áèòû
     PORTC=pc;                 // âûâîäèì äàííûå èç ðñ
     PORTC.5=1;                // Å â 1
       delay_ms(1);
     PORTC.5=0;                // гасим Е в 0 - т.е. данные должны пройти в ЖКИ
       delay_ms(5);

     PORTC.4=0;                //  поднимаем RS в 0
   pc=0x0C;                // init N+F
//   pc|=0b00100000;               // ïîäíèìàåì Å â 1
   pc&=0b00001111;               // ãàñèì ñòàðø.áèòû
     PORTC=pc;                 // âûâîäèì äàííûå èç ðñ
     PORTC.5=1;                // Å â 1
       delay_ms(1);
     PORTC.5=0;                // гасим Е в 0 - т.е. данные должны пройти в ЖКИ
       delay_ms(5);

     PORTC.4=0;                //  поднимаем RS в 0
   pc=0x00;                // это наша команда дисплею
//   pc|=0b00100000;               // ïîäíèìàåì Å â 1
   pc&=0b00001111;               // ãàñèì ñòàðø.áèòû
     PORTC=pc;                 // âûâîäèì äàííûå èç ðñ
     PORTC.5=1;                // Å â 1
       delay_ms(1);
     PORTC.5=0;                // гасим Е в 0 - т.е. данные должны пройти в ЖКИ
       delay_ms(5);

     PORTC.4=0;                //  поднимаем RS в 0
   pc=0x08;                // это наша команда дисплею
//   pc|=0b00100000;               // ïîäíèìàåì Å â 1
   pc&=0b00001111;               // ãàñèì ñòàðø.áèòû   
     PORTC=pc;                 // âûâîäèì äàííûå èç ðñ
     PORTC.5=1;                // Å â 1
       delay_ms(1);
     PORTC.5=0;                // ãàñèì Å â 0 - ò.å. äàåì ñòðîá.
       delay_ms(5);

     PORTC.4=0;                //  поднимаем RS в 0
   pc=0x00;                // это наша команда дисплею
//   pc|=0b00100000;               // ïîäíèìàåì Å â 1
   pc&=0b00001111;               // ãàñèì ñòàðø.áèòû
     PORTC=pc;                 // âûâîäèì äàííûå èç ðñ
     PORTC.5=1;                // Å â 1
       delay_ms(1);
     PORTC.5=0;                // ãàñèì Å â 0 - ò.å. äàåì ñòðîá.
       delay_ms(5);

     PORTC.4=0;                //  поднимаем RS в 0
   pc=0x01;                // это наша команда дисплею
//   pc|=0b00100000;               // ïîäíèìàåì Å â 1
   pc&=0b00001111;               // ãàñèì ñòàðø.áèòû
     PORTC=pc;                 // âûâîäèì äàííûå èç ðñ
     PORTC.5=1;                // Å â 1
       delay_ms(1);
     PORTC.5=0;                // ãàñèì Å â 0 - ò.å. äàåì ñòðîá.
       delay_ms(5);

     PORTC.4=0;                //  поднимаем RS в 0
   pc=0x00;                // это наша команда дисплею
//   pc|=0b00100000;               // ïîäíèìàåì Å â 1
   pc&=0b00001111;               // ãàñèì ñòàðø.áèòû
     PORTC=pc;                 // âûâîäèì äàííûå èç ðñ
     PORTC.5=1;                // Å â 1
       delay_ms(1);
     PORTC.5=0;                // ãàñèì Å â 0 - ò.å. äàåì ñòðîá.
       delay_ms(5);

     PORTC.4=0;                //  поднимаем RS в 0
   pc=0x07;                // init ID+S
//   pc|=0b00100000;               // ïîäíèìàåì Å â 1
   pc&=0b00001111;               // ãàñèì ñòàðø.áèòû
     PORTC=pc;                 // âûâîäèì äàííûå èç ðñ
     PORTC.5=1;                // Å â 1
       delay_ms(1);
     PORTC.5=0;                // ãàñèì Å â 0 - ò.å. äàåì ñòðîá.
       delay_ms(5);
     PORTC.4=1;                //  поднимаем RS в 1 - т.е. режим данных
      delay_ms(220);
}


что в нем не так ?
схема подключения - в моем первом посте.
документация на дисплей тут:
http://display.compel.ru/getpdf.php?path=passive%2Ffullpdf&fn=WH1602A-NGG-CP
(размер pdf = 256kB)

НЕ НАДО мне советовать пользоваться "стандартными библиотеками".

Добавлено спустя 2 минуты 49 секунд:
blindman писал(а):Для программиста с 20-летним стажем портирование того кода займет час максимум - в паре мест переписать ассемблерный код задержек и поправить дефайны для PORT/PIN/DDR, ну и макросы отсутствующие добавить типа _BV. Всяко быстрее и надежнее чем пытаться реанимировать код без отступов и комментариями крякозябрами


Я не прошу у вас совета как мне поступать.
Есть задача - БЕЗ встроеных библиотек решить - я пытаюсь ее решить. Почему - потому что МНЕ ТАК НАДО.

Что может быть сложного - дергаем биты в соответствии с "даташитом" на ЖКИ и получаем что нужно - ан нет - ЖКИ НЕ работает. :(

Re: Winstar WH1602a-NGG-CP к ATmega8 на PortC?

avr123.nm.ru » 11 мар 2010, 12:25

> НЕ НАДО мне советовать

> Я не прошу у вас совета

Это хорошо. Я всем советую - не слушайте ни каких советов !

Вы самито можете запустить симулятор и получить осциллограммы сигналов о твашего МК и потом сравнить с тем что по даташиту нужно ?

Re: Winstar WH1602a-NGG-CP к ATmega8 на PortC?

SERGEY_M » 11 мар 2010, 12:49

вот для программиста с 20-ти летним стажем
Код: Выделить всёРазвернуть
#define LcdPort PORTB //??? AVR PORTB4 .. PORTB7-?? 
#define E PORTB.2      //????? ????? ??? ?????. E
#define RS PORTB.0      //---||--- RS
#define RW PORTB.1

//**************************************************
void LcdWriteNibble (unsigned char a)
{
E=0;
delay_us(2);
LcdPort&=0x0f;
LcdPort|=(a&0xf0);
delay_us(2);
E=1;
delay_us(2);
E=0;
delay_us(2);
}                         
//**************************************************
void WaitBusy (void)
{
delay_us(150);
}                   
//**************************************************
void LcdWriteCommand (unsigned char a)
{
E=0;
RS=0;   
LcdWriteNibble(a);
LcdWriteNibble(a<<4);
WaitBusy();
}
//**************************************************
// ????????????? ?????? HD44780
//a=1 - ???????????? ???????
//a!=1 - ???????????   
//?????? ????????,????????????? ??????,??? ??????
//??????
// "а" = 1    одна строка
// "а" >= 2   2 и более строк

void lcd_init (unsigned char a)
{
E=0;
RS=0;
delay_ms(20);
LcdWriteNibble(0x30);
delay_ms(7);
LcdWriteNibble(0x30);
delay_us(100);
LcdWriteNibble(0x30); 
WaitBusy();
LcdWriteNibble(0x20);
WaitBusy();                 
if (a==1) LcdWriteCommand(0x20);
else LcdWriteCommand(0x28);
LcdWriteCommand(0x08);
LcdWriteCommand(0x01);
delay_ms(20);
LcdWriteCommand(0x06);
LcdWriteCommand(0x0c);
delay_ms(20);
}
//**************************************************
void LcdWriteData (unsigned char a)
{
E=0;
RS=1;
LcdWriteNibble(a);
LcdWriteNibble(a<<4);
WaitBusy();
}                   

void lcd_putchar (unsigned char a)
{
E=0;
RS=1;
LcdWriteNibble(a);
LcdWriteNibble(a<<4);
WaitBusy();
}                       
//**************************************************

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

void lcd_gotoxy (char x,char y)
{
if(y == 0) LcdSetPosition(x);
else LcdSetPosition(x + 0x40);
}
//**************************************************

void LcdClrScr()
{
LcdWriteCommand(0x01);
delay_ms(20);
}

void lcd_clear(void)
{
LcdWriteCommand(0x01);
delay_ms(20);
}   
//**************************************************
void LcdSetCGAdress(unsigned char adr)
{
LcdWriteCommand((adr&0x7f)|0x40);
}   
//**************************************************
void lcd_write_byte(unsigned char addr, unsigned char data)
{
LcdWriteCommand(addr);
LcdWriteData(data);
}
 

void lcd_puts(char *str)
{
char k;
while ((k=*str++) != 0) lcd_putchar(k);
}


void lcd_putsf(char flash *str)
{
char k;
while ((k=*str++) != 0) lcd_putchar(k);
}

в коде не используется чтение бита состояния ЖКИ, т.к. из-за этого у меня периодически висла основная прога))
Последний раз редактировалось SERGEY_M 11 мар 2010, 17:32, всего редактировалось 1 раз.

Re: Winstar WH1602a-NGG-CP к ATmega8 на PortC?

blindman » 11 мар 2010, 12:50

Alex_Sor писал(а):Я не прошу у вас совета как мне поступать.

Да как вам угодно. Мне оно надо?

Re: Winstar WH1602a-NGG-CP к ATmega8 на PortC?

galex1981 » 11 мар 2010, 14:20

avr123.nm.ru писал(а):Вы самито можете запустить симулятор и получить осциллограммы сигналов о твашего МК и потом сравнить с тем что по даташиту нужно ?

Если чего, есть в Протеусе модель: LGM12641BS1R - копия вашего LCD и куча примеров к ней. Сверьтесь что вы сделали не так, а заодно можете проверить работу вашей программы...
ЗЫ: (у меня в свое время с таким LCD глюк аналогичный был - ничего не мог вывести на экран, проблема решилась, когда я внимательней прочитал даташит и исправил схему его включения)

Re: Winstar WH1602a-NGG-CP к ATmega8 на PortC?

Alex_Sor » 11 мар 2010, 14:59

SERGEY_M писал(а):вот для программиста с 20-ти летним стажем

...

в коде не используется чтение бита состояния ЖКИ, т.к. из-за этого у меня периодически висла основная прога))


СПАСИБО! Хоть один нормальный человек отозвался :)

"таблетка" помогла но наполовину :)
теперь оно мне кусок текста выводит "черными квадратами", и все в одной строке.
Сижу разбираюсь в чем у нас кардинальные отличия...
Пока что вижу несоответствие в "адреса строк", это исправил но не помогает,
и есть у меня главное подозрение что как-то не так происходит инициализация - т.е.
не техническая выдача самих кодов а то как их выводить.

Если не сложно - посмотрите файл
http://display.compel.ru/getpdf.php?path=passive%2Ffullpdf&fn=WH1602A-NGG-CP
страница 14 и страница 19.

вот сам HD44780 - отличия есть...
http://www.ladyada.net/media/lcd/HD44780.pdf

я коды инициации в Вашем куске программы прописал так:
Код: Выделить всёРазвернуть
   void lcd_init (unsigned char a) 
    {
    E=0;
    RS=0;
    delay_ms(20);
    LcdWriteNibble(0x03);
    delay_ms(7);
    LcdWriteNibble(0x03);
    delay_us(100);
    LcdWriteNibble(0x03); 
    WaitBusy();
    LcdWriteNibble(0x02);
    WaitBusy();                 
    LcdWriteCommand(0x24);
    delay_ms(20);
    LcdWriteCommand(0x08);
    LcdWriteCommand(0x01);
    LcdWriteCommand(0x06);
    delay_ms(20);
    }


стало веселее :)
курсор мигает (ура!) и прыгает по разным знакоместам рисуя "черный квадрат".
при отработке такой программки:
Код: Выделить всёРазвернуть
LcdClrScr();
lcd_gotoxy(0,0);                   
LcdSetPosition(0);
    delay_ms(1000);
lcd_gotoxy(0,0);
lcd_putsf("Hello");
lcd_gotoxy(2,1);
lcd_putsf("avr123.nm.r");
lcd_putsf("u");
    delay_ms(500);

Re: Winstar WH1602a-NGG-CP к ATmega8 на PortC?

SERGEY_M » 11 мар 2010, 16:52

читайте внимательно 42 стр. ДШ
используются старшие 4 бита...
значит будет не
Код: Выделить всёРазвернуть
LcdWriteNibble(0x03); 

а
Код: Выделить всёРазвернуть
LcdWriteNibble(0x30); 

все остальное соответственно...
покрутите контраст, мож черные квадраты в буквы превратятся :)

Добавлено спустя 10 минут 54 секунды:
в предложеной автором топика схеме используются 4 младших разряда порта для команд и данных
значит нужно изменить
Код: Выделить всёРазвернуть
void LcdWriteNibble (unsigned char a) 
    {
    E=0;               
    delay_us(2);
   LcdPort&=0xf0;       //сбрасываем в "0" младшие 4 бита порта
   LcdPort|=(a&0x0f);   // младшие 4 бита переменной "а" пишем в младшие биты порта
    delay_us(2);
    E=1;
    delay_us(2);
    E=0;
    delay_us(2);
    }   

и соответственно в других функциях меняем
Код: Выделить всёРазвернуть
LcdWriteNibble(a); 
LcdWriteNibble(a<<4);

на
Код: Выделить всёРазвернуть
LcdWriteNibble(a>>4); 
LcdWriteNibble(a);

вроде так :roll:


Rambler\'s Top100 Mail.ru counter