pic24-PCF8574A-lcd1602

Обсуждаем цифровые устройства...
Ответить
Аватара пользователя
Виталий_36
Первый раз сказал Мяу!
Сообщения: 33
Зарегистрирован: Ср мар 02, 2011 15:09:25
Откуда: Воронеж

pic24-PCF8574A-lcd1602

Сообщение Виталий_36 »

Пробую запустить индикатор HD44780 по протоколу I2C через PCF8574A. С PCF8574A проблем нет все сигналы передает а вот HD44780 не запускается. Выкладываю код, может кто подскажет в чем дело.
Выложу и весь проект.
Изображение
Спойлер#include <xc.h> // подключение процессора
//#include <p24fj64ga002.h>
#define FCY 32000000UL // определение тактовой частоты для макросов __delay_ms() и __delay_us()
#include <libpic30.h> // библиотека функций
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
//---------------------------------------------------------------------------
// конфигурирование контроллера

#pragma config POSCMOD = NONE // Главный генератор отключен
//#pragma config I2C1SEL = PRI // Использовать SCL1/SDA1 контакты по умолчанию
//#pragma config IOL1WAY = OFF // Впоследствии состояние IOLOCK может быть изменено с помощью разблокировки
#pragma config OSCIOFNC = ON // OSC2/CLKO/RC15 функциями, как порт ввода / вывода (RC15)
#pragma config FCKSM = CSDCMD // Переключатель генератора отключен, Fail-Safe монитор генератора отключен
#pragma config FNOSC = FRCPLL // Тактирование от внутреннего скоростного генератора через умножитель PLL - (FRCPLL)
//#pragma config SOSCSEL = LPSOSC // Вторичный генератор внутренний низкоскоростной 31 кГц LPRC генератор (LPSOSC)
//#pragma config WUTSEL = FST // Быстрый пробуждения таймер
#pragma config IESO = OFF // IESO режим (две скорости запуска) отключены
#pragma config WDTPS = PS1024 // Сторожевой таймер Postscaler
#pragma config FWPSA = PR128 // Сторожевой таймер Prescaler соотношении 1: 128
#pragma config WINDIS = ON // Оконный режим сторожевого таймера - отключен
#pragma config FWDTEN = OFF // Сторожевой таймер выключен
#pragma config ICS = PGx1 // Эмулятор EMUC1/EMUD1 выводы совместно с PGC1/PGD1
#pragma config COE = OFF // Сброс в рабочий режим
#pragma config BKBUG = OFF // Устройство сбрасывает в рабочий режим
#pragma config GWRP = OFF // Запись в память программы отключены
#pragma config GCP = ON // Код защита включена для всего пространства памяти программы
#pragma config JTAGEN = OFF // JTAG порт отключен
//---------------------------------------------------------------------------

void init(void)
{
ClrWdt(); // сброс сторожевого таймера
// настройка тактового генератора
// настройка тактового генератора
OSCCON=0b00000111000000001;
// |||||||||||||||+-- OSWEN: выбор генератора определяется в регистре конфигураций
// ||||||||||||||+--- SOSCEN: вторичный внутренний генератора 32 кГц отключен
// |||||||||||||+---- неиспользуемый
// ||||||||||||+----- CF: флаг детектора сбоя тактового генератора
// |||||||||||+------ неиспользуемый
// ||||||||||+------- LOCK: флаг состояния работы PLL модуля
// |||||||||+-------- IOLOCK: блокировка активна
// ||||||||+--------- CLKLOCK: часы и PLL выбор не заблокирован
// |||||+++---------- NOSC2:NOSC0: новый генартор 001 - Тактирование от внутреннего скоростного генератора через умножитель PLL - (FRCPLL)
// ||||+------------- неиспользуемый
// |+++-------------- COSC2:COSC0: текущий генаратор 001 - Тактирование от внутреннего скоростного генератора через умножитель PLL - (FRCPLL)
// +----------------- неиспользуемый
// настройка регистра делителя тактовой частоты
CLKDIV=0b0000000000000000;
// ||||||||++++++++-- неиспользуемые
// |||||+++---------- RCDIV2:RCDIV0:постделитель - 000 = 8 MHz (divide by 1)
// ||||+------------- DOZEN: делитель отключен, тактирование 1:1 (первый делитель тактовой частоты)
// |+++-------------- DOZE2:DOZE0: - 1:1
// +----------------- прерывания не влияют DOZEN
// регистр калибровки внутреннего тактового генератора
OSCTUN=0;


// настройка портов

AD1PCFG = 0xffff; // все выводы цифровые

TRISA = 0; // разряды порта A на выход
TRISB = 0; // разряды порта B на выход

//---------------------------------------------------------------------------
}

#define PCF8574A 112

void SendLCDcomm(unsigned char data) // команда RS =0
{ i2c_start (PCF8574A, 0);
i2c_write(((data>>4)&0b00001111)|0b00010000); // старший полубайт E = 1
__delay_us(1);
i2c_write((data>>4)&0b00001111); // старший полубайт E = 0
__delay_us(1);
i2c_write(((data)&0b00001111)|0b00010000); // младший полубайт E = 1
__delay_us(1);
i2c_write((data)&0b00001111); // младший полубайт E = 0
__delay_us(1);
i2c_stop();
}

void SendLCDdata(unsigned char data) // данные RS =1
{ i2c_start (PCF8574A, 0);
i2c_write(0b00000000);

i2c_write(((data>>4)&0b00001111)|0b01010000); // старший полубайт E = 1
__delay_us(1);
i2c_write(((data>>4)&0b00001111)|0b01000000); // старший полубайт E = 0
__delay_us(1);
i2c_write(((data)&0b00001111)|0b01010000); // младший полубайт E = 1
__delay_us(1);
i2c_write(((data)&0b00001111)|0b01000000); // младший полубайт E = 0
__delay_us(1);
i2c_stop();
}

void Init1602(void)
{
char a;
__delay_ms(20); // задержка на подачу питания 20 ms
i2c_start (PCF8574A, 0);
i2c_write(0b00000000);
__delay_us(10);
for ( a = 0; a < 4; a++ )
{
i2c_write(0b00010011);// E = 1 DB4=1, DB5=1
__delay_us(1);
i2c_write(0b00000011);// E = 0 DB4=1, DB5=1

__delay_ms(6); // задержка 6 ms
}

i2c_write(0b00010010);// E = 1 DB4=0, DB5=1
__delay_us(1);
i2c_write(0b00000010);// E = 0 DB4=0, DB5=1
i2c_stop();

__delay_ms(6); // задержка 6 ms
SendLCDcomm( 0b00101000 ); // Настройка функций
SendLCDcomm( 0b00001100 ); // Включить дисплей
SendLCDcomm( 0b00000001 ); // Дисплей очистить
SendLCDcomm( 0b00000110 ); // Entry Mode
SendLCDcomm( 0b10000000 ); // DDRAM addresss 0000
SendLCDcomm( 0b00000010 ); // return home
}

int main()
{
ClrWdt(); // сброс сторожевого таймера
init();
i2c_Open (100);

Init1602();
SendLCDdata(0b00110001); // нарисовать еденицу 0x31
while(1)
{ ClrWdt(); // сброс сторожевого таймера

}
}//
Вложения
24fj128ga010.X.zip
(128.44 КБ) 142 скачивания
Реклама
Ответить

Вернуться в «Цифровая техника»