
Стрелкой отмечен первый контакт (SCL).
Схема подключения:
1 – SCL – i2c
2 – POR – сброс драйвера, сброс высоким уровнем, подключен напрямую к ноге микроконтроллёра
3 – SDA – i2c
4 – VDD1 – +5В
5 – VDD2/VDD3 – через диод 1N4148 к +5. Катодом (отмечен чёрной полоской) к VDD2/VDD3.
6 – VSS – земля
7 – VLCD – керамический конденсатор 0.1 мкФ на землю
SCL и SDA подтянуты резисторами 4.7 КОм к +5. Между VDD1 и VSS конденсатор 0.1 мкФ.
Для начала надо инициализировать индикатор.
void LCD_init(void){ TRISC = 0x00; // Порт на вывод PORTC = 0xFF; // Сброс высоким уровнем Delay1KTCYx(100); // Пауза PORTC = 0x00; // Низкий уровень Delay1KTCYx(100); // Пауза StartI2C(); WriteI2C(0x74); // Адрес индикатора WriteI2C(0b00000000); // Co=0, RS=0 WriteI2C(0b00110100); // DL=1, M=1, SL=0, H=0 WriteI2C(0b00001100); // D=1, C=0, B=0 WriteI2C(0b00000110); // I/D=1, S=0 WriteI2C(0b00110101); // DL=1, M=1, SL=0, H=1 WriteI2C(0b00000011); // L=1 WriteI2C(0b00000100); // P=0, Q=0 WriteI2C(0b00001000); // IM=0, IB=0 WriteI2C(0b00010000); // TC1=0, TC2=0 WriteI2C(0b01000010); // S1=1, S0=0 (4x) WriteI2C(0b10000000 | 23); // V=0 (Va) StopI2C(); }
Функция устанавливающая адрес DDRAM, по которому будет выводиться следующий символ.
Здесь 0×40 – это адрес первого символа второй строки.
void LCD_Address(){ StartI2C(); WriteI2C(0x74); // Адрес индикатора WriteI2C(0b00000000); // Co=0, RS=0 WriteI2C(0b00110100); // DL=1, M=1, SL=0, H=0 WriteI2C(0b10000000 | 0x40); // Установка адреса DDRAM StopI2C(); }
Ну и простой пример. Настройка I2C делается отдельно, у меня в коде её нет.
Инициализирую индикатор. Вывожу три символа в первой строке. Перевожу указатель на вторую строку. Вывожу ещё три символа
void main(void) { LCD_init(); // Инициализация индикатора StartI2C(); WriteI2C(0x74); // Адрес индикатора WriteI2C(0b01000000); // Co=0, RS=1 WriteI2C('A'+128); // 'A' WriteI2C('B'+128); // 'B' WriteI2C('C'+128); // 'C' StopI2C(); LCD_Address(); // Указатель на вторую строку StartI2C(); WriteI2C(0x74); // Адрес индикатора WriteI2C(0b01000000); // Co=0, RS=1 WriteI2C('1'+128); // '1' WriteI2C('2'+128); // '2' WriteI2C('3'+128); // '3' StopI2C(); while(1); }
Есть особенности с кодовой таблицей. Так чтобы вывести латинские символы и цифры, к их коду надо прибавить 128. С кирилицей сложнее. Символы идут не по порядку и они там не все. Так нет символов ‘С’,'T’ и других. Их приходится заменять латинскими.


Похожие статьи
6 отзывов к этой записи
Добавлю свою лепту.
код настройки процесора для работы аппаратного MSSP и подпрограммы
#define FOSC 20000000 // Частота процессора
#define I2CClock 100000 // Скорость шины i2c
#define ClockValue (((FOSC/I2CClock)/4) -1) // Расчет значения
// Настройка модуля MSSP режим i2c мастер
SSPSTAT = 0;
SMP = 1;
SSPADD = ClockValue;
SSPCON2 = 0;
SSPCON = 0b00101000; // SSPEN=1;
SSPIF = 0;
BCLIF = 0;
void I2C_Start (void)
{
SSPIF = 0;
SEN = 1; // Start
while (SSPIF==0) ;
}
//———————————–
void I2C_Stop (void)
{
SSPIF = 0;
PEN = 1;
while (SSPIF==0) ;
}
//——————————————–
//————————————-
void I2C_Send_Byte (unsigned char Data)
{
SSPIF = 0;
SSPBUF = Data;
while (BF==1);
while (SSPIF==0);
}
Опиши еще корректный пример возврата указателя на первую строчку, а то на вторую мы попали, а ведь надо и обратно.
А чтобы попасть обратно надо адрес установить в 0×00. Вот и всё)
круто..взяла почти все))
мило ждем еще…
просто афигенно!!!!))
Оставить отзыв