系列文章索引:Linux下C51入门教程索引
这个是点阵
类型是16×16
和32 × 32
。
点阵的显示方式是将对应的坐标{(x,y)|0<=x&<=15,0<=y<=15}点亮,按照一定的排列就会看起来显示字符。
第一步就是字符代码,根据字符生成代码,将代码写入元器件实现字符显示。但是,网上能找到的软件都是Windows下的,我不想使用wine,就只能自己写了。
我用Qt/C++写了一个点阵取字模软件,第一个版本就是生成简单的字符对应的代码。
32*32
效果
使用是没什么问题了,后续功能再添加。
原理和功能及实现方式见源码。
原理
以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);
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); }
|
至此,第一个问题解决。接下来就是显示,动态显示,移动显示。