Показано с 1 по 8 из 8
  1. #1
    Без позывного
    Регистрация
    06.02.2007
    Адрес
    СПб
    Сообщений
    317
    Поблагодарили
    21
    Поблагодарил
    26

    Как выводить данные с МК на ЖК-индикатор?

    Хочу разобраться с тем как выводить информацию на ЖК. Не очень понятно какие данные от МК ему требуются. Насколько понял, у ЖК должен быть свой контроллер (только не понятно, он в виде отдельной платы или уже встроен?), судя по описаниям эти контроллеры есть разных стандартов. Насколько они совместимы? Какие протоколы посылки данных в этот ЖК? Далее, у него есть свой буфер или данные надо обновлять постоянно? В общем, вопросов больше чем ответов.

    Может где есть статья где это подробно расписано?
    Tnx.

    PS: Насколько понял, контроллер в современные ЖК обычно уже встроен. В магазине есть WH0802A от Winstar, буду разбираться с ним.


  2. #2
    Standart Power
    Регистрация
    12.09.2006
    Сообщений
    153
    Поблагодарили
    2
    Поблагодарил
    0
    вот в этом winstare стоит встроенный контроллер ЖКИ со своим буфером и знакосинтезатором HD44770 (могу ошибаться в количестве 4 и 7рок) . или полностью аналогичный. в сети масса примеров. на сайте www.gaw.ru есть описание протоколов режимы работы и помоему примеры. сложного там нет ничего. главное начать

  3. #3
    Без позывного
    Регистрация
    06.02.2007
    Адрес
    СПб
    Сообщений
    317
    Поблагодарили
    21
    Поблагодарил
    26
    Спасибо, нашел на этом сайте подробное описание контроллера.
    http://www.gaw.ru/html.cgi/txt/lcd/c...4780/start.htm

  4. #4
    Standart Power Аватар для UA1ARN
    Регистрация
    14.02.2005
    Адрес
    Санкт-Петербург
    Возраст
    57
    Сообщений
    478
    Поблагодарили
    30
    Поблагодарил
    11
    //
    // mt-10t7.c,
    //
    // Support for WS1602, MELT


    #define F_CPU 8000000UL // 8 MHz

    #include <stdlib.h>

    /* Pin manipulation functioms */
    #include <avr\io.h>
    #include <util/delay.h>

    #include "mt-10t7.h"

    #define LCD_TARGET_PORT PORTB

    #define STROBE_BIT 0x20
    #define ADDRES_BIT 0x10
    // LCD connections
    //
    // PORTx0: DB0 (pin 7)
    // PORTx1: DB1 (pin 6)
    // PORTx2: DB2 (pin 5)
    // PORTx3: DB3 (pin 4)
    // PORTx4: A0 (pin 1) - '0' - addr, '1' - data
    // PORTx5: ~WR (pin 2) - '0' - write strob
    // PORTx6:
    // PORTx7:

    void mt10t7_wrpair(
    unsigned char addr,
    unsigned char data);


    /*
    DB0- g, DB1- e, DB2- d, DB3- a, DB4- h, DB5- b, DB6- c, DB7- f
    */
    #define SEG_A 0x08
    #define SEG_B 0x20
    #define SEG_C 0x40
    #define SEG_D 0x04
    #define SEG_E 0x02
    #define SEG_F 0x80
    #define SEG_G 0x01
    #define SEG_H 0x10


    static const unsigned char ten2led [] =
    {
    0x00 | SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F,
    0x00 | SEG_B | SEG_C,
    0x00 | SEG_A | SEG_B | SEG_G | SEG_E | SEG_D,
    0x00 | SEG_A | SEG_B | SEG_G | SEG_C | SEG_D,
    0x00 | SEG_F | SEG_G | SEG_B | SEG_C,
    0x00 | SEG_A | SEG_F | SEG_G | SEG_D | SEG_C,
    0x00 | SEG_A | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G,
    0x00 | SEG_A | SEG_B | SEG_C | SEG_F,
    0x00 | SEG_A | SEG_B | SEG_C | SEG_D | SEG_E | SEG_F | SEG_G,
    0x00 | SEG_A | SEG_B | SEG_C | SEG_D | SEG_F | SEG_G,
    };


    static const unsigned char mode2led [] =
    {
    0x00 | SEG_C | SEG_D | SEG_E, // small 'u' - USB
    0x00 | SEG_D | SEG_E, // small 'l' - LSB
    0x00 | SEG_D | SEG_E | SEG_G, // small 'c' - CW
    };
    #if 1
    extern const char * const mode2string [];
    #else
    const char * const mode2string [] =
    {
    "USB",
    "LSB",
    "CW ",
    };
    #endif

    // ADDRES_BIT is set
    void mt10t7_wrdata(
    unsigned char data)
    {
    unsigned char hibits = (LCD_TARGET_PORT & ~ 0x1f);

    LCD_TARGET_PORT = hibits | (data & 0x0f) | ADDRES_BIT;

    LCD_TARGET_PORT &= ~STROBE_BIT; // activate ~wr signal
    LCD_TARGET_PORT |= STROBE_BIT; // deactivate ~wr signal

    LCD_TARGET_PORT = hibits | ((data >> 4) & 0x0f) | ADDRES_BIT;

    LCD_TARGET_PORT &= ~STROBE_BIT; // activate ~wr signal
    LCD_TARGET_PORT |= STROBE_BIT; // deactivate ~wr signal
    }


    void mt10t7_wraddr(
    unsigned char addr)
    {
    unsigned char hibits = (LCD_TARGET_PORT & ~ 0x1f);
    // set address
    LCD_TARGET_PORT = hibits | (addr & 0x0f);

    LCD_TARGET_PORT &= ~STROBE_BIT; // activate ~wr signal
    LCD_TARGET_PORT |= STROBE_BIT; // deactivate ~wr signal
    }


    void mt10t7_wrpair(
    unsigned char addr,
    unsigned char data)
    {
    mt10t7_wraddr(addr);
    mt10t7_wrdata(data);
    }


    // rs = 1
    void ws1602_wrdata(
    unsigned char v)
    {
    unsigned char hibits = (LCD_TARGET_PORT & ~ 0x1f);

    LCD_TARGET_PORT = hibits | ((v >> 4) & 0x0f) | ADDRES_BIT;

    LCD_TARGET_PORT |= STROBE_BIT; // deactivate ~wr signal
    LCD_TARGET_PORT &= ~STROBE_BIT; // activate ~wr signal
    _delay_ms(1);

    LCD_TARGET_PORT = hibits | (v & 0x0f) | ADDRES_BIT;

    LCD_TARGET_PORT |= STROBE_BIT; // deactivate ~wr signal
    LCD_TARGET_PORT &= ~STROBE_BIT; // activate ~wr signal
    _delay_ms(1);
    }

    // rs = 0
    void ws1602_wrcmd(
    unsigned char v)
    {
    unsigned char hibits = (LCD_TARGET_PORT & ~ 0x1f);

    LCD_TARGET_PORT = hibits | ((v >> 4) & 0x0f);

    LCD_TARGET_PORT |= STROBE_BIT; // deactivate ~wr signal
    LCD_TARGET_PORT &= ~STROBE_BIT; // activate ~wr signal
    _delay_ms(1);

    LCD_TARGET_PORT = hibits | (v & 0x0f);

    LCD_TARGET_PORT |= STROBE_BIT; // deactivate ~wr signal
    LCD_TARGET_PORT &= ~STROBE_BIT; // activate ~wr signal
    _delay_ms(1);
    }


    void ws1602_init(void)
    {
    LCD_TARGET_PORT = 0;
    LCD_TARGET_PORT &= ~STROBE_BIT; // deactivate write pin

    ws1602_wrcmd(0x33);
    ws1602_wrcmd(0x32);

    ws1602_wrcmd(0x28); // two lines

    ws1602_wrcmd(0x0c); // ВКЛ.LCD , КУРСОР ОТКЛ., МИГАНИЕ КУРС. ОТКЛ.
    ws1602_wrcmd(0x06); // автомат перемещение курсора вправо
    ws1602_wrcmd(0x01); // очистка дисплея


    ws1602_wrdata(0x24);
    ws1602_wrdata(0x25);

    ws1602_wrcmd(0x80 | 0x40); // вторая строка
    ws1602_wrdata(0x30);
    ws1602_wrdata(0x31);

    ws1602_wrcmd(0x01); // очистка дисплея

    }

    void ws1602_string(const char * s)
    {
    while (* s != '\0')
    ws1602_wrdata(* s ++);
    }

    void mt10t7_init(void)
    {
    unsigned char i;

    LCD_TARGET_PORT |= STROBE_BIT; // deactivate write pin

    mt10t7_wrpair(0x0f, 0x11); // unlock bus

    for (i = 0; i < 10; ++ i)
    {
    mt10t7_wrpair(i, 0x00); // clear display
    }
    }

    void mt10t7_dispfreq(unsigned long freq, unsigned char mode, unsigned char special)
    {
    #define NDIGITS 7
    static const unsigned long vals [] =
    {
    10000000,
    1000000,
    100000,
    10000,
    1000,
    100,
    10,
    1,
    };
    static const unsigned char commas [] =
    {
    0x00, SEG_H, 0x00, 0x00, SEG_H, 0x00, 0x00, 0x00
    };

    unsigned char i = 0;

    mt10t7_wraddr(0x00);

    for (i = 0; i < NDIGITS; ++ i)
    {
    ldiv_t res = ldiv(freq, vals [i]);
    if (i == 0 && res.quot == 0)
    mt10t7_wrdata(0x00 | commas [i]); // supress zero
    else
    mt10t7_wrpair(i, ten2led [res.quot] | commas [i]);
    freq = res.rem;
    }

    mt10t7_wrpair(0x09, mode2led [mode] | (special ? SEG_A : 0x00));
    }


    const char * const mode2string [MODE_COUNT] =
    {
    "SSB",
    "USB", "LSB",
    "CW ", "CWR", "CWZ",
    "AM3", "AM6", "AM9", "AMW",
    "DRM",
    "FM3", "FMW"
    };

    void ws1602_dispfreq(unsigned long freq, unsigned char mode, unsigned char special)
    {
    #define NDIGITS 7
    static const unsigned long vals [] =
    {
    10000000,
    1000000,
    100000,
    10000,
    1000,
    100,
    10,
    1,
    };
    static const unsigned char commas [] =
    {
    0x00, 0x00, 0x00, 0x00, SEG_H, 0x00, 0x00, 0x00
    };

    unsigned char i = 0;

    ws1602_wrcmd(0x80 | 0x00); // курсор в начало первой строки

    for (i = 0; i < NDIGITS; ++ i)
    {
    ldiv_t res = ldiv(freq, vals [i]);
    if (i == 0 && res.quot == 0)
    ws1602_wrdata(' '); // supress zero
    else
    ws1602_wrdata('0' + res.quot);
    freq = res.rem;

    if (commas [i] != 0)
    ws1602_wrdata('.');
    }
    //ws1602_wrdata(' ');
    ws1602_wrcmd(0x80 | 0x00 | 0x0c); // курсор в 12 pos 1-st string
    ws1602_string(mode2string [mode]);
    ws1602_wrcmd(0x80 | 0x48); // курсор в 8 pos второй строки
    ws1602_string(special ? " FAST" : " ");
    }

  5. #5
    Без позывного
    Регистрация
    06.02.2007
    Адрес
    СПб
    Сообщений
    317
    Поблагодарили
    21
    Поблагодарил
    26
    Всем спасибо, буду пробовать.
    У меня Atmega, поэтому PIC пока не актуально.

  6. #6
    Без позывного
    Регистрация
    06.02.2007
    Адрес
    СПб
    Сообщений
    317
    Поблагодарили
    21
    Поблагодарил
    26
    2 All:
    Возможно кому будет интересно.

    Как оказалось, всё проще - необходимое API уже есть в C++ AVR.
    Вот исходный текст программы (для ЖК 2х16):

    Код:
    #include <mega16.h>
    // the LCD is connected to PORTC outputs
    // see the file lcd.h in the ..inc directory
    // 0x15 is the address of PORTC
    #asm
    .equ __lcd_port=0x15 ;PORTC
    #endasm
     
    // include the LCD driver routines
    #include <lcd.h>
     
    void main(void)
    { 
            // initialize the LCD for
            // 2 lines & 16 columns
            lcd_init(16);
     
            // go to the firs line of the LCD (x,y)
            lcd_gotoxy(0,0);
            // display the message
            lcd_putsf("- forum.qrz.ru -");
     
            // go to the second line of the LCD (x,y)
            lcd_gotoxy(0,1);
            // display the message
            lcd_putsf("73 from RA1AHC");
            
            // stop here, loop now
            while (1); 
    }
    Схема включения и результат симуляции в Proteus приложены в аттаче (цепи питания там не показаны)
    Миниатюры Миниатюры Нажмите на изображение для увеличения. 

Название:	AVRLCD.JPG 
Просмотров:	2964 
Размер:	74.5 Кб 
ID:	7685  

  7. #7
    Low Power Аватар для UR5DKA
    Регистрация
    03.12.2005
    Адрес
    Кошице
    Возраст
    32
    Сообщений
    58
    Поблагодарили
    0
    Поблагодарил
    0
    Я сам работаю с ATmega, использую компилятор CodeVisionAVR для вывода любой информации на дисп6лей можно использовать команду sprintf.

    Например

    unsigned char lcd_buffer[33], p;

    sprintf(lcd_buffer, "%.2f", p) /*в переменную lcd_buffer записывается все что будет выведено на екран, p - сама переменная, " " - в кавычках параметры форматирования*/

    lcd_puts(lcd_buffer); //выводит lcd_buffer на екран

  8. #8
    Без позывного
    Регистрация
    06.02.2007
    Адрес
    СПб
    Сообщений
    317
    Поблагодарили
    21
    Поблагодарил
    26
    Это да, единственное что sprintf больно уж громоздко реализована. Достаточно одного вызова этой функции чтобы размер Hex-файла увеличился на пару килобайт...

Похожие темы

  1. ГИ-7Б/ГИ-6Б - паспортные данные
    от UU4JEY в разделе Усилители мощности
    Ответов: 1
    Последнее сообщение: 03.05.2006, 14:32
  2. ЖК индикатор
    от RW1ZK в разделе Общие вопросы
    Ответов: 16
    Последнее сообщение: 06.06.2005, 20:38
  3. семисегментный индикатор
    от rBo3Db в разделе Общие вопросы
    Ответов: 2
    Последнее сообщение: 11.08.2004, 10:10
  4. Трансформаторы ТИУ-данные
    от viking в разделе Радиолюбительские технологии
    Ответов: 0
    Последнее сообщение: 17.02.2004, 16:37
  5. Панорамный индикатор
    от RZ3AIF в разделе Радиолюбительские технологии
    Ответов: 24
    Последнее сообщение: 04.07.2003, 11:33

Социальные закладки

Социальные закладки

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •  
Похоже, что вы используете блокировщик рекламы :(
Форум QRZ.RU существует только за счет рекламы, поэтому мы были бы Вам благодарны если Вы внесете сайт в список исключений!
как отключить
×
Рейтинг@Mail.ru
eXTReMe Tracker
Яндекс.Метрика