Professional Documents
Culture Documents
Detalles
Última actualización el Lunes, 25 Noviembre 2013 20:39
Escrito por Biblioman
El PCF8574 es un expansor de E/S compatible con la mayoría de microcontroladores, permite una comunicación
bidireccional, necesitando para ello solo dos líneas a través del bus I2C.
Direccionamiento
Este módulo dispone de dos modelos (PCF8574 y PCF8574A) cuya única diferencia es su dirección.
Los primeros cuatro bits vienen configurados de fábrica y los tres últimos son configurables por hardware, por
lo que podemos tener 8 módulos conectados al mismo bus I2C (y si combinamos ambas versiones hasta 16).
Funcionamiento
Como cualquier dispositivo I2C la comunicación es a través de dos líneas:
Ambas líneas deben de estar conectadas a una alimentación positiva a través de una resistencia pul-up.
El microcontrolador es el que está configurado como maestro y él o los módulos PCF8574 que estén conectados
al bus se configuran como esclavos, el maestro es el que realiza las peticiones de lectura o escritura sobre los
módulos y controla la señal de reloj (SCL).
La transferencia de datos puede ser inicializada solo cuando el bus no está ocupado.
Ejemplos
Los ejemplos están basados en el siguiente módulo que se puede adquirir fácilmente por Internet y que incluye
en una pequeña placa el integrado PCF8574 listo para usar:
Vídeo de la demo:
01./*
02.** Example Arduino sketch for SainSmart I2C LCD Screen 16x2
03.** based on https://bitbucket.org/celem/sainsmart-i2c-
lcd/src/3adf8e0d2443/sainlcdtest.ino
04.** by
05.** Edward Comer
06.** LICENSE: GNU General Public License, version 3 (GPL-3.0)
07.
08.** This example uses F Malpartida's NewLiquidCrystal library. Obtain from:
09.** https://bitbucket.org/fmalpartida/new-liquidcrystal
10.
11.** Modificado por Biblioman
12.
13.** NOTE: Tested on Arduino Uno whose I2C pins are A4==SDA, A5==SCL
14.
15.*/
16.#include <Wire.h>
17.#include <LCD.h>
18.#include <LiquidCrystal_I2C.h>
19.
20.#define I2C_ADDR 0x3f // <<-Dirección del esclavo
21.#define BACKLIGHT_PIN 3
22.#define En_pin 2
23.#define Rw_pin 1
24.#define Rs_pin 0
25.#define D4_pin 4
26.#define D5_pin 5
27.#define D6_pin 6
28.#define D7_pin 7
29.
30.int n = 1;
31.
32.LiquidCrystal_I2C lcd(I2C_ADDR,En_pin,Rw_pin,Rs_pin,D4_pin,D5_pin,D6_pin,D7_pin);
33.
34.void setup()
35.{
36.lcd.begin (16,2); // <<--- LCD 16x2
37.
38.
39.// Enciende el backlight
40.lcd.setBacklightPin(BACKLIGHT_PIN,POSITIVE);
41.lcd.setBacklight(HIGH);
42.
43.}
44.
45.void loop()
46.{
47.lcd.setCursor (0,0); // va al comienzo de la 1ª línea LCD
48.lcd.print("Aquihayapuntes");
49.lcd.setCursor (0,1); // va al comienzo de la 2ª línea LCD
50.lcd.print("LCD I2C.......");
51.delay(3000);
52.
53.lcd.setCursor (0,0); // va al comienzo de la 1ª línea LCD
54.lcd.print("LCD I2C.......");
55.lcd.setCursor (0,1); // va al comienzo de la 2ª línea LCD
56.lcd.print("Aquihayapuntes");
57.delay(3000);
58.}
59.
60.
Esquema:
Vídeo de la demo:
Código fuente:
01.
02./*--------------------------------------------------------*\
03.| Ejemplo uso de bus expansor de 8 bits PC8574 |
04.| autor: biblioman |
05.| www.aquihayapuntes.com |
06.\*--------------------------------------------------------*/
07.
08.#include <16F877.h>
09.#FUSES NOWDT, XT, NOPUT, NOPROTECT, NOBROWNOUT, NOLVP, NOCPD, NOWRT, NODEBUG
10.#use delay(clock=4000000)
11.#use i2c(master,sda=pin_C4,scl=pin_C3,force_hw)
12.
13.int array[16] =
{0xFF,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xA7,0xA1,0x86,0x8E};
14.int valor=0b11111111;
15.
16.#int_EXT
17.void EXT_isr(void){
18.
19.//Lectura Bus I2C
20.int tmp=0;
21.i2c_start(); // Start I2C
22.i2c_write(0x4F); // Direccion del dispositivo PCF8574 + bit modo lectura
23.tmp = i2c_read(); //Asigno el valor leído en la variable tmp
24.tmp=~tmp;//
25.valor=array[tmp];
26.i2c_stop(); // Stop
27.
28.}
29.void main() {
30.
31.enable_interrupts(GLOBAL);//habilito interrupción global
32.enable_interrupts(INT_EXT);//habilito interrupción externa
33.ext_int_edge(H_TO_L);//interrupción activa a nivel bajo
34.
35.while(true){
36.delay_ms(500);
37.//Escritura del valor en el Bus
38.i2c_start(); // Inicio
39.i2c_write(0x42); // Dirección del dispositivo PCF8574 + bit modo escritura
40.i2c_write(valor);
41.i2c_stop(); // Stop I2C
42.}
43.}
44.
Esquema:
Vídeo de la demo:
Código fuente:
01./*--------------------------------------------------------*\
02.| Ejemplo LCD I2C con PIC |
03.| autor: biblioman |
04.| www.aquihayapuntes.com |
05.\*--------------------------------------------------------*/
06.
07.#include <16f877.h>
08.#use delay(clock=4000000)
09.
10.#FUSES XT,NOPROTECT,NOWRT,PUT,NOWDT,NOLVP,NOCPD
11.
12.#include "lcd_i2c.h"
13.
14.void main()
15.{
16.
17.lcd_init();
18.While(true){
19.delay_ms(3000);
20.lcd_gotoxy(1,1);
21.printf(lcd_putc, "Aquihayapuntes");
22.lcd_gotoxy(1,2);
23.printf(lcd_putc, "LCD I2C PIC ");
24.delay_ms(3000);
25.lcd_gotoxy(1,1);
26.printf(lcd_putc, "LCD I2C PIC ");
27.lcd_gotoxy(1,2);
28.printf(lcd_putc, "Aquihayapuntes");
29.}
30.}
31.
Fuente de la información
Datasheet PCF8574