Ⅰ 單片機如何顯示漢字論文
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);
}}}