-
22.06.2007, 14:00 #1
- Регистрация
- 06.02.2007
- Адрес
- СПб
- Сообщений
- 317
- Поблагодарили
- 21
- Поблагодарил
- 26
Как выводить данные с МК на ЖК-индикатор?
Хочу разобраться с тем как выводить информацию на ЖК. Не очень понятно какие данные от МК ему требуются. Насколько понял, у ЖК должен быть свой контроллер (только не понятно, он в виде отдельной платы или уже встроен?), судя по описаниям эти контроллеры есть разных стандартов. Насколько они совместимы? Какие протоколы посылки данных в этот ЖК? Далее, у него есть свой буфер или данные надо обновлять постоянно? В общем, вопросов больше чем ответов.
Может где есть статья где это подробно расписано?
Tnx.
PS: Насколько понял, контроллер в современные ЖК обычно уже встроен. В магазине есть WH0802A от Winstar, буду разбираться с ним.DmitryElj :: WR-G305e, Icom R75 (был) + magnetic loop
-
22.06.2007, 14:50 #2
- Регистрация
- 12.09.2006
- Сообщений
- 153
- Поблагодарили
- 2
- Поблагодарил
- 0
вот в этом winstare стоит встроенный контроллер ЖКИ со своим буфером и знакосинтезатором HD44770 (могу ошибаться в количестве 4 и 7рок) . или полностью аналогичный. в сети масса примеров. на сайте www.gaw.ru есть описание протоколов режимы работы и помоему примеры. сложного там нет ничего. главное начать
/3 - Сергей г.Москва
-
22.06.2007, 16:27 #3
- Регистрация
- 06.02.2007
- Адрес
- СПб
- Сообщений
- 317
- Поблагодарили
- 21
- Поблагодарил
- 26
Спасибо, нашел на этом сайте подробное описание контроллера.
http://www.gaw.ru/html.cgi/txt/lcd/c...4780/start.htmDmitryElj :: WR-G305e, Icom R75 (был) + magnetic loop
-
22.06.2007, 16:58 #4
- Регистрация
- 14.02.2005
- Адрес
- Санкт-Петербург
- Возраст
- 60
- Сообщений
- 482
- Поблагодарили
- 35
- Поблагодарил
- 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" : " ");
}... Я там сам глубину промерял! :: Геннадий Завидовский (Санкт-Петербург)
-
22.06.2007, 20:12 #5
- Регистрация
- 06.02.2007
- Адрес
- СПб
- Сообщений
- 317
- Поблагодарили
- 21
- Поблагодарил
- 26
Всем спасибо, буду пробовать.
У меня Atmega, поэтому PIC пока не актуально.DmitryElj :: WR-G305e, Icom R75 (был) + magnetic loop
-
22.06.2007, 22:35 #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); }
DmitryElj :: WR-G305e, Icom R75 (был) + magnetic loop
-
02.07.2007, 01:13 #7
- Регистрация
- 03.12.2005
- Адрес
- Кошице
- Возраст
- 35
- Сообщений
- 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 на екранПоследний раз редактировалось UR5DKA; 02.07.2007 в 01:15.
UR5DKA
-
02.07.2007, 10:31 #8
- Регистрация
- 06.02.2007
- Адрес
- СПб
- Сообщений
- 317
- Поблагодарили
- 21
- Поблагодарил
- 26
Это да, единственное что sprintf больно уж громоздко реализована. Достаточно одного вызова этой функции чтобы размер Hex-файла увеличился на пару килобайт...
DmitryElj :: WR-G305e, Icom R75 (был) + magnetic loop
|
Социальные закладки