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 )