Linux下C51入门教程09:16×16点阵

系列文章索引:Linux下C51入门教程索引

这个是点阵

类型是16×1632 × 32

点阵的显示方式是将对应的坐标{(x,y)|0<=x&<=15,0<=y<=15}点亮,按照一定的排列就会看起来显示字符。

第一步就是字符代码,根据字符生成代码,将代码写入元器件实现字符显示。但是,网上能找到的软件都是Windows下的,我不想使用wine,就只能自己写了。

我用Qt/C++写了一个点阵取字模软件,第一个版本就是生成简单的字符对应的代码。

32*32效果

点阵软件演示2

使用是没什么问题了,后续功能再添加。

原理和功能及实现方式见源码。

原理

以16×16点阵为例,点阵共有256个点,显示字符就是将部分点点亮。

本软件需要做的就是确定需要点亮那些点。

代码生成原理是每八个点取一个值,方向为横向。

比如第一行,16个点没有一个亮,就是0000000000000000
=(00000000)(00000000)=(0x00)(0x00)

生成代码结果就是

1
char code tab[]={0x00,0x00,...};

本软件设计理念就是:在QLabel上面写一个字,然后按照16*16的尺寸进行切割访问像素值,如果是背景色(白色)就是0,如果是字(黑色)就是1,然后每八位进行计算十六进制值并转换为QString,将每个十六进制值拼接为结果并显示。

源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
void MainWindow::drawText(QString text)
{
int size=ui->comboBoxSize->currentText().toInt();
QImage image(QSize(size,size),QImage::Format_Mono);
QPainter painter(&image);
QRgb backColor = qRgb(255, 255, 255);
image.fill(backColor); //将位图背景设置为白色

QFont font;
QString family = ui->comboBoxFont->currentFont().family();
qDebug()<<"Current font family is: "<<family;
font.setFamily(family); //设置字体,宋体
font.setPixelSize(size); //设置字号,以像素为单位
font.setWeight(50); //设置字型,不加粗
font.setItalic(false); //设置字型,不倾斜
font.setUnderline(false); //设置字型,无下划线
QPen pen;
pen.setBrush(QBrush(font_color));
painter.setFont(font);
painter.setPen(pen);
int flats = Qt::AlignCenter |Qt::AlignTop;
painter.drawText(0,0,size,size,flats,text);

//绘制表格
// font.setPixelSize(1);
// painter.setFont(font);
// painter.setPen(Qt::green);
// for(int i=0;i<size;i++){
// painter.drawLine(i,0,i,size);
// }
// for(int i=0;i<size;i++){
// painter.drawLine(0,i,size,i);
// }

ui->labelDisplay->setPixmap(QPixmap::fromImage(image).scaled(ui->labelDisplay->size()));

//代码计算
int count=0;
QString cResult,asmResult="DB ";
QImage img = image;
for(int i=0;i<size;i++){
QByteArray byte;
for(int j=0;j<size;j++){
QRgb k=image.pixel(j,i);
if(k!=backColor){
byte.append('1');
}
else byte.append('0');
if((j+1)%8==0){
count++;
cResult += "0x"+toHex(byte)+',';
asmResult += toHex(byte)+"H,";
byte.clear();
if(count%8==0) cResult+='\n';
if(count%32==0) asmResult+="\nDB ";
}
}
}
ui->textResultC->setPlainText("const char tab[]={"+cResult+"};");
ui->textResultASM->setPlainText(asmResult);
}

至此,第一个问题解决。接下来就是显示,动态显示,移动显示。


Linux下C51入门教程09:16×16点阵
https://blog.jackeylea.com/c51/c51-16-16-lattice/
作者
JackeyLea
发布于
2020年4月25日
许可协议