Da ich momentan noch an einem größeren Projekt arbeite und dieses eine LCD-Anzeige benötigt, habe ich mir gedacht, ich veröffentliche den Ausschnitt mal.
Vielleicht ist ja jemand auf der Suche danach oder will sich nicht extra die Mühe machen, selbst etwas zu basteln. Bitte hinterlasst einen Kommentar, falls ihr das Display in euer Programm mit einbauen wollt. Ich bin gespannt, zu was es eingesetzt wird.
Zuerst der Code und dann die Erklärungen:
Start.java
import javax.swing.JFrame;
@SuppressWarnings("serial")
public class Start extends JFrame {
Display anzeige;
public Start() {
setSize(320, 110);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
anzeige = new Display();
//Anfangstext
String text = "jahnke.im";
for (int i = 0; i < text.length(); i++) {
anzeige.setCursorPos(i);
anzeige.setChar(text.charAt(i));
}
add(anzeige);
setTitle("LCD-Display");
setVisible(true);
}
public static void main(String[] args) {
new Start();
}
}
Display.java
import java.awt.Color;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JPanel;
@SuppressWarnings("serial")
public class Display extends JPanel {
Pixel[][][] display = new Pixel[32][8][5];
private int position_x = 10;
private int position_y = 10;
private int cursorPos = 0;
private boolean[][][] charTable = new boolean[256][8][5];
public Display() {
init();
for (int i = 0; i < display.length; i++) {
for (int j = 0; j < display[0].length; j++) {
for (int k = 0; k < display[0][0].length; k++) {
display[i][j][k] = new Pixel(false, position_x, position_y);
position_x += 3;
}
position_x -= 15;
position_y += 3;
}
position_x += 18;
position_y -= 24;
if (i == 15) {
position_x -= 288;
position_y += 27;
}
}
}
public void paintComponent(Graphics g) {
g.setColor(new Color(120, 166, 72));
g.fillRect(0, 0, 400, 400);
for (int i = 0; i < display.length; i++) {
for (int j = 0; j < display[0].length; j++) {
for (int k = 0; k < display[0][0].length; k++) {
if (display[i][j][k].isActivated()) {
g.setColor(new Color(29, 70, 51));
} else {
g.setColor(new Color(91, 159, 73));
}
g.fillRect(display[i][j][k].getX(), display[i][j][k].getY(), 2, 2);
}
}
}
this.repaint();
}
public void init() {
BufferedImage image;
File file = new File(this.getClass().getClassLoader().getResource("pixeldata.bmp").getPath());
try {
image = ImageIO.read(file);
for (int i = 0; i < 256; i++) {
for (int y = 0; y < 8; y++) {
for (int x = 0; x < 5; x++) {
if (image.getRGB(x + 5 * i, y) < -1) {
charTable[i][y][x] = true;
} else {
charTable[i][y][x] = false;
}
}
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
public void setCursorPos(int pos) {
cursorPos = pos;
}
public void setChar(int chr) {
int c = chr;
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 5; j++) {
display[cursorPos][i][j].setActivated(charTable[c][i][j]);
}
}
}
public void setChar(char chr) {
int c = (int) chr;
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 5; j++) {
display[cursorPos][i][j].setActivated(charTable[c][i][j]);
}
}
}
}
Pixel.java
public class Pixel {
private boolean activated;
private int x;
private int y;
public Pixel(boolean activated, int x, int y) {
this.activated = activated;
this.x = x;
this.y = y;
}
public boolean isActivated() {
return activated;
}
public void setActivated(boolean activated) {
this.activated = activated;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
}
Es wurde der Zeichensatz des Displays verwendet: (Leichte Abweichung zum originalen ASCII-Code)
Die verschiedenen Zeichen werden mithilfe der angehängten Bitmap, die beim Programmstart ausgelesen wird, erzeugt.
Link zur Bitmap
Momentan habe ich noch keine Möglichkeit mit eingebaut, den Text zur Laufzeit zu ändern. Aber ich denke, ein Textfeld mit einzubauen sollte für niemanden ein Problem darstellen.
Der Text wird in der Start.java definiert: z.B.:
anzeige.setCursorPos(0);
anzeige.setChar('A');
//oder:
anzeige.setCursorPos(0);
anzeige.setChar(65);
Eine einfache Methode in Display.java genügt, um den Text zur Laufzeit bearbeiten zu können. Diese sollte selbstklärend sein. Andernfalls genügt eine kurze Mail über das Kontaktformular an mich.