Ⅰ 单片机如何显示汉字论文
LED显示屏控制系统的系统分析
根据LED显示屏控制系统的应用,本章设计了LED图文显示屏的体系结构和工作流程。其中软件系统与无线传输控制硬件主系统之间采用串行通讯方式完成程序下载,实现文本信息的传输。
2.1 整体分析
LED显示屏系统组成
LED图文显示屏系统由软件控制系统、无线传输系统、设备主控制器、LED显示点阵、电源等部分组成。基本结构如下图:
图4-1 LED显示屏总体框架
系统工作过程:
软件控制系统主要完成的任务为图文编辑、字模提取与保存、图像预览与文件传输;无线传输系统主要完成文件信息由PC机传输至LED显示器,硬件控制系统中LED点阵主要任务是通过电流控制完成信息显示,通过单片机的扫描驱动方式的控制对LED点阵行列驱动,实现设备的驱动并最终实现接收的图文显示功能。
2.2 计算机软件模块分析与设计
软件模块分为编辑部分和控制通讯部分,编辑部分实现图文文件的编辑功能,通讯部分通过RS-232C串口通讯完成文件到单片机存储模块的传输。通讯部分将在第三章做详细的介绍。
系统设计采用Windows操作系统下,开启文本编辑窗口,客户区内像素点采用与实际LED点阵显示屏像素点相同,功能类似Word文档编辑工具,包括编辑模块、绘图模块、文字编辑模块、颜色控制模块、显示效果加载模块、预览模块、信息下载模块。
1、编辑模块
1)除Windows自生成的剪贴、复制、粘贴功能,系统加入了撤消、重复功能。
(1)选中撤消功能可以实现之前编辑工作的一步步取消功能。
(2)选中重复功能可以实现之前编辑工作的最近的一条操作命令。
2)绘图:包括直线、矩形、椭圆、圆等在内的图形绘制功能。
3)文字编辑:包括各种字体、字形、字号、效果、颜色的文字的编辑,并且根据应用的特殊用途,加入指定位置文字的编辑。
(1)选中文字功能,弹出字体选择框体,可以选择各种字体的文字进行编辑
(2)调出具体文字位置编辑对话框,输入文字和要求显示位置的横坐标和纵坐标。
4)颜色控制模块:由于应用领域的具体特点,主要采用了红、绿、黄三种颜色,可以实现颜色控制。
2、增添效果模块:通过增添显示效果和传输通讯中多屏文件单屏传送,完善了控制系统的功能。
1)普通效果,静态的显示屏幕上的信息
2)滚动效果,可以实现从左向右的信息滚动显示,可以与静态信息穿插显示。
3)单屏信息传输,实现编辑待传输信息的保存。
4)多屏信息传输,实现编辑保存好的单屏信息合并保存成一个文件,大大减少传输文件时的烦琐。
3、图像预览模块:在文件传输之前实现字模信息的预览功能,可以实现预览传输前所保存的任何形式的字模信息,并且直接集成到工具栏文件打开功能键按钮。
1)显示效果,通过文件传输前的预览,可以调整静态与滚动显示效果的排列顺序。
2)显示时间,显示不同屏幕显示信息之间的时间间隔。
软件模块结构图如下:
图3-2软件模块结构图
软件控制系统的设计与实现
在LED显示屏的软件控制系统中,文本信息的编辑、字模信息的保存、显示效果的处理、图像预览以及设备通讯是设计的核心上作。下面就这四个核心功能做详细的研究与设计。
4.1 编辑功能设计与实现
在LED显示屏上展现所要显示的内容以及效果,编辑工作是最重要的环节之一。本系统在设计时采用VC 6. 0开发工具,用VC++完成整个设计工作。
基于MFC AppWizard建立工程,以单文档View的形式开启文本区。下面对工程进行分析和设计:
1、文本区的开启:
由于所应用的LED显示屏的像素点数量已定,而计算机屏幕的分辨率显然远远高于显示屏,这样造成逻辑坐标的不同,即而显示的图像会有扭曲、拉长甚至失真情况。所以可以通过选择开启窗口的计算机屏幕像素点与显示屏像素数之间恰当的比例来减小误差。
现在用来解决此问题的方法很多。例如点阵数据的压缩方法,由于在Windows环境下,系统默认的每个汉字为4000多点,而16×16点阵一个字的大屏幕,每个汉字为256点,所以根据计算,可以采用间隔取点的方式,在横向和纵向每隔12个点取一个点,每个汉字256个点组成的原理来压缩数据。
但为了图像不失真,本系统采用所开启文本区与显示屏像素数完全相同的方式,从而避免了圆变椭圆,正方形变矩形,甚至连划斜线时的斜率也不会变。
CMainFrame::PreCreateWindow函数用来设置整个窗口的大小,但是窗口外框还包括菜单,工具栏,状态栏与客户区。而系统定义的文本区要求精确的client area,用于字模信息保存。所以表示客户区大小的纵坐标要加上状态栏与工具栏的高度,甚至菜单与窗口外框的边缘也要扣除[1]。
SetClientSize() //设置客户区大小的函数
{CRect rect;
CSize winSize;
int cx, cy = 0;
CControlBar* pBar;
pBar = GetControlBar(AFX_IDW_STATUS_BAR);
if((pBar ! =NULL) && (pBar -> IsWindowVisible())){
pBar ->GetWindowRect (rect);
winSize = rect. Size ();
cy+=(winSize. cy);}
pBar=GetControlBar(AFX_IDW_ TOOLBAR);
if((pBar!=NULL)&&(pBar ->IsWindowVisible())){
pBar -> GetWindowRect(rect);
winSize = rect.Size ();
cy+=(winSize. Cy*2);}
cx = 384+(384-m_clientSize. cx);
cy += (192+(192-m_clientSize. cy));
GetWindowRect(rect);
SetWindowPos(this,rect. left,rect.top, cx, cy, SWP_ NOZORDER);}
OnViewStatusBar(){
CFrameWnd::OnBarCheck(ID_VIEW_STATUS_BAR);
SetClientSize();}
通过对客户区的精确控制,可以真正的使文本区的像素点数与显示屏的平面发光点数对应,而且为了编辑操作过程中不至于因为失误造成文本区内的象素改变,所以系统限制了窗体最大化控制[3] [9]。
cs. style& = ~WS_MAXIMIZEBOX; //取消最大化使窗体大小固定。
2、编辑功能设计:
在控制系统中,把文字与图形的输入通通想象成是图像的编辑,这样就像在画板上一样,随心所欲的完成编辑工作。
MFC的绘图都是通过Device Context(它是设备与数据之间的媒介,可以缩写为DC)来将绘图输出到一个设备上。DC中存储设备的属性与输出绘图的数据。在MFC中要输出绘图数据至一个设备上,必须准备一个针对此设备的DC对象,它是继承于CDC的类的对象。这个DC对象可以使用CDC类的一些绘图函数(如画线、圆、方形等)。每个DC必须附着一些所谓的GDI object (GD工对象,如常见的画笔、画刷、字形、位图等画图上具)以配合DC的绘图函数。
系统通过编写Line()函数画直线、Rectangle()函数画矩形、Ellipse ()函数画椭圆、Circle ()函数完成图形的编辑[2] [3]。
需要指出的是将newPen析构:调用newPen. DeleteObject)方法。GDI对象的析构很重要,特别是自己创建的对象,一定要在适当的时机(GDI对象已经不在附着在DC时)去掉。解除附着的方法只有以SelectObject函数选择别的新的对象(旧的对象会自动被消除)。可以选择MFC预存的对象来解除对象的依附关系,因为MFC预存的对象会在不用的时候自动析构。DeleteObject是CGdiObject类公开的成员函数,所以它的子类都可以使用。
文字的输入:通过CFontDialog类生成一个选择字体类型(font)的对话框。
CDC* pDC=GetDC();
LOGFONT m _lFont;
COLORREF m_cTextColor;
CFont myFont;
CFont* pOldFont;
CFontDialog FontDlg;
FontDlg. m_cf. lpLogFont=&m_lFont;
FontDlg.m_cf.rgbColors=m_cTextColor;
FontDlg. m_cf. Flags!=CF_INITTOLOGFONTSTRUCT;
if ( FontDlg. DoModal() = =IDOK)
{
FontDlg.GetCurrentFont(&m_1Font);
m_cTextColor = FontDlg.GetColor();
}
调用系统自带的输入法,包括文字的字体、字形、颜色、效果等。
系统加载TextDialog对话框,以文本编辑区左上顶点为坐标原点,向右为X轴正方向,向下为Y轴正方向建立逻辑坐标系,实现文字指定位置的编辑:
CString str;
CTextDlg TextDlg;
//CRect rect (TextDlg. m_ctrEdit. GetClientRect());
if ( TextDlg. DoModal)==IDOK )
{
CRect rect (TextDlg. m_iPosX, TextDlg. m_iPosY,
TextDlg.m_iPosX+1000, TextDlg.m_iPosY+1000);
Str=TextDlg. m_sText;
myFont.CreateFontIndirect (&m lFont);
pOldFont=pDC->SelectObject(&myFont);
pDC->SetTextColor(m_cTextColor);
pDC->DrawText (str, rect, 0);
pDC->SelectObject(pOldFont);
SaveInStack();}
在OnFont()函数中嵌入TextDialog()函数,
DDX_ Text(pDX,IDC_ POS-X, m_iPosX); //文本区内文字输入X轴
DDX_ Text(pDX,IDC_ POS_ Y, m_iPosY); //文本区内文字输入Y轴
颜色的控制:
在Windows系统中,色彩是以ture color来定义的,即COLORREF它是一个四字节字,其中的3个字节分别代表红,绿,蓝三种基本单色,也就是每一个基本单色由一个字节来表示,亦即每一个基本单色有256种色阶。所以True color有16777216种色彩变化。虽然计算机内定义了这么多颜色,但是对于应用与现实生活中的LED显示屏来说无须也无法达到。因为人眼对不同颜色光线的敏感程度不同,并且红、绿和黄三种颜色是人眼视觉细胞最敏感的,所以这三种颜色成为基色,通过其不同比例的混合就能实现从白到黑的各种颜色。所以也正是应用于交通警视最为普遍的颜色。
LED显示屏应用于交通指挥大厅的法律宣传,为公众传输信息以及服务,基于特殊的应用领域,图文显示屏都只有三种颜色的变化。所以控制系统在上具栏内只添加了以上三种颜色满足今后扩展的要求。
4.2 字模提取
4.2.1字模简介
文字的字模是一组数字,但它的意义却与数字的意义有着根本的变化,它是用数字的各位信息来记载英文或汉字的形状[1]。
在电脑硬件中,根本没有汉字这个概念,也没有英文的概念,其认识的概念只有——内码(将ASCII表的高128个很少用到的数值以两个为一组来表示汉字,即汉字的内码。而剩下的低128位则留给英文字符使用,即英文的内码)。如果你用启动盘启动系统后用DIR命令可能得到一串串莫名其妙的字符,但那确确实实是汉字,如果你启动UCDOS或其他的汉字系统后,就会看到那是一个个熟悉的汉字。在硬件系统内,英文的字模信息一般固化在ROM里,即使在没有进入系统的CMOS里,也可以让你看到英文字符。而在DOS下,中文的字模信息一般记录在汉字库文件里(将制作好的字模放到一个个标准的库中,这就是点阵字库文件)。
4.2.2 LED显示屏领域字模实现技术
在通过软件实现的技术中,目前有许多字模生成软件,软件打开后输入汉字,点“检取”,十六进制数据的汉字代码即可自动生成,把我们所需要的竖排数据复制到我们的程序中即可。在通过硬件实现字模提取的技术中,有在单片机系统中增加硬汉字库的方法,主控器发送的汉字是其机内码,用两个字节来表示一个汉字。根据机内码,显示单元控制模块从汉字库中查取显示字模,实现汉字显示。由于带有硬汉字库,进行动态文字显示时,通用智能显示单元仅接受汉字的机内码即可,这样数据通讯量大大减少。因此,“动态文字显示速度快”。
4.2.3软件控制系统字模提取的分析与设计
而在LED显示屏控制系统具体应用的Windows操作系统下如何提取字模信息是设计的核心。软件控制系统在实际编辑过程中,要求各种字体、字号的文字都能被编辑、保存。所以系统在设计时,把文本区理解为由众多的象素点构成,而把不同字体、字号的文字理解为一幅图像。因为所开启的文本区大小与LED显示屏的大小对应,所以采用16×16点阵为单位,把文本区内的每个像素点都看成一个二维数组,由于系统中各种颜色都有对应的值,赋予每个不同颜色的像素点不同的对应值,再把每个点赋予一个int型的值,这样保存下来的信息就是二进制数据。通过这样的设计,我们不仅可以把任何字型,任何大小的文字保存下来,还可以显示以256个像素点阵为单位的任何图形。在软件控制系统中实现字模的提取,也就避免了在单片机中加载硬汉字库模块,从而简化了硬件模块的设计。
以下以单色屏为例,介绍系统采用字模保存的算法设计:
定义COLORREF zimo_ color为像素点的颜色,判断某个点的颜色值。如果值为Oxffffff,说明此点为白色,赋予此点值0。由于单色屏只有红色和不显色两种,所以可以简单赋值为除白色外其余点赋值为1。
CClientDC dc(this);
CFile myfile;
unsigned int zimo[192] [384]={0};
unsigned char zimo_data[192][48]={0};
COLORREF zimo_color;
int row, col ;
this ->HideCaret();
for (row=0;row<192;row++){
for (col=0;col<384;col++){
zimo_color=do.GetPixel (col, row);
if (zimo color = =Oxffffff)
{zimo [row] [col]=0;}else
{zimo [row] [col]=1;}}}
定义unsigned int zimo[192][384]={0};//文本区像素点
以8位为一字节(因为在随后的串行通讯中,传输的数据是8位的二进制数据)
定义 unsigned char zimo_data[192][48]={0};
this->ShowCaret();
int i,j,k;
for(i=0;i<192;i++){
for(j=0;j<48;j++){
for (k=0;k<8;k++){
zimo_data[i] [j]+=zimo[i] [8=}j+k]*((int) pow (2, (7-k)));}}}
4.3 效果添加与预览功能的设计与实现
在当今高度信息化的社会,图形图像等形象性信息所占比例日益提高,计算机在各种信息处理中正发挥着重要作用。由于数字化技术、计算机技术的介入,传统的模拟图像为主的电视界已开始全面进入数字化的数字广播时代。从电子显微镜下的微观世界,到卫星图像所拍广阔领域,图像处理在实际生活中广泛应用:把文档、图形等图像化的办公图像处理;医用X射线CT (Computer Tomography,计算机断层摄影)机为代表的医用图像处理;用于人造卫星拍摄的遥感图像处理以及广播电视、电影界中的图像处理等。
为了增强显示效果,LED显示屏也可以有多种显示模式。
1、硬件模块处理显示模式技术
LED图文显示屏可以增添多种显示模式,从而增强显示效果。产生不同显示模式的方法,主要是随时间变化不断控制刷新显示数据。但对于显示数据的刷新,并不意味着一定要重新编写显示数据,可以通过一定的算法从原来的显示数据直接生成。可以按顺序调整行号,使显示图文产生上下平移;而顺序调整列显示数据的位置,就可以达到左右平移的目的;同时调整行列顺序,就能得到对角线平移的效果。
2、软件模块直接加载效果技术
如果对于信息数据的刷新算法过于复杂,可以考虑直接生成带有显示模式的数据。经过系统的分析与设计,采用在文本区内,完成对文字及图形的编辑工作,完成字模的提取与保存后,通过算法设计,增添滚动显示模式。
1)滚动显示模式的设计与实现
屏幕显示滚动效果在PreviewDialog内,加入button选项,即实现多屏信息保存时,根据需要普通效果与滚动效果穿插选择达到最终保存的目的:
for (unsigned char i=0;i<file_number;i++)
CString tempFieldl,tempField2, tempField3;
unsigned char file_length, file_ distype,file_ distime;
tempFieldl = m_listCtrl.GetItemText(i,0);
tempField2 = m_listCtrl.GetItemText(i,1);
tempField3 = m_listCtrl.GetItemText(i,2);
file_length=(unsigned char)tempFieldl.GetLength();
myfile. Write (&file_length, 1); //存储文件名长度
myfile. Write (&file_distype, 1); //存储文件显示方式
myfile.Write(&file_ distime, 1);//存储文件显示时间}
2)图像预览功能设计与实现
控制系统完成编辑工作后,保存的是字模信息,增加图像预览功能主要用来预览要传输的字模保存文件,由于加入了多屏传输、滚动显示效果,而且传输到大屏的待显示的信息需要预先保存,所以对保存的信息预览有利于准确、高效的完成编辑到传输的工作。
研究与设计:
定义unsigned char dis_type_pre = 0;//表示普通方式
定义unsigned char dis_type_pre = 1;//表示滚动方式
当设置方式为滚动时:
if (roll_number! = 399){
for (row=0;row<192;row++){
for (col=0;col<=roll number;col++){
if (zimo [row] [383-roll_number+col”= = 1){
dc. SetPixel (col,row, 0);
}}}
else{
dis_type_pre=0;
roll_number=-1;
KillTimer (1);
for (row=0;row<192;row++){
for(col=0;col<383;col++){
if (zimo [row] [col]==1){
dc. SetPixel (col,row, 0);
}}}