HiPi

 view release on metacpan or  search on metacpan

lib/HiPi/Interface/LCDBackpackPCF8574.pm  view on Meta::CPAN

	    devicename    => ( $pi->board_type == RPI_BOARD_TYPE_1 ) ? '/dev/i2c-0' : '/dev/i2c-1',
        backend       => 'i2c',
    );
    
    # get user params
    foreach my $key( keys (%userparams) ) {
        $params{$key} = $userparams{$key};
    }
	
    unless( defined($params{device}) ) {
        $params{device} = HiPi::Interface::PCF8574->new(
            devicename   => $params{devicename},
            address      => $params{address},
            backend      => $params{backend},
        );
    }
    
    my $self = $class->SUPER::new(%params);
    return $self;
}

sub send_text {
    my($self, $text) = @_;
    for my $p ( split(//, $text) ) {
        $self->_send_data( ord($p) );
    }
}

sub send_command {
    my($self, $command) = @_;
    my $lsb = $command & 0x0F;
    my $msb = ( $command >> 4 ) & 0x0F;
    $self->_write_command_part($msb);
    $self->_write_command_part($lsb);
}

sub _send_data {
    my($self, $data) = @_;
    my $lsb = $data & 0x0F;
    my $msb = ( $data >> 4 ) & 0x0F;
    $self->_write_data_part($msb);
    $self->_write_data_part($lsb);
}

sub backlight {
    my($self, $brightness) = @_;
    
    $brightness = 0 if $brightness < 0;
    $brightness = 100 if $brightness > 100;
    
    # $brightness = 0 to 100
    # we translate to 0 - 250
    
    return unless $self->backlightcontrol;
    
    my $bset = int( 2.5 * $brightness);
    $self->_backlight( $bset );
    $self->_write_to_bus(0x00, SEND_MODE_DATA, SEND_DISABLE );
}

sub update_baudrate {
    my $self = shift;
    # not handled
    return;
}

sub update_geometry {
    my $self = shift;
    # not handled
    return;
}

sub _write_command_part {
    my($self, $data) = @_;
    $self->_write_to_bus( $data, SEND_MODE_CMD, SEND_ENABLE );
    $self->delayMicroseconds(1);
    $self->_write_to_bus( $data, SEND_MODE_CMD, SEND_DISABLE );
    $self->delayMicroseconds(40);
}

sub _write_data_part {
    my($self, $data) = @_;
    $self->_write_to_bus( $data, SEND_MODE_DATA, SEND_ENABLE );
    $self->delayMicroseconds(1);
    $self->_write_to_bus( $data, SEND_MODE_DATA, SEND_DISABLE );
    $self->delayMicroseconds(40);
}

sub _write_to_bus {
    my($self, $data, $mode, $onoff) = @_;
    my $byte = $data << 4;
    $byte |= ( $mode & 1 );
    $byte |= SEND_ENABLE if $onoff;
    $byte |= SEND_BACKLIGHT if $self->_backlight;
    $self->device->write_byte( $byte ); 
}

sub init_display {
    my $self = shift;
    
    $self->_write_to_bus(0, 0, 0);
    $self->delay(50); 
    
    # put the LCD into 4 bit mode according to the hitachi HD44780 datasheet figure 26, pg 47
    $self->_write_command_part(0x03);
    $self->delayMicroseconds(4500); 
    $self->_write_command_part(0x03);
    $self->delayMicroseconds(4500); 
    $self->_write_command_part(0x03);
    $self->delayMicroseconds(150); 
    $self->_write_command_part(0x02);
    
    $self->send_command( HD44780_CURSOR_OFF );
}

1;

__END__



( run in 0.463 second using v1.01-cache-2.11-cpan-39bf76dae61 )