导航:首页 > 操作系统 > 单片机读汉字

单片机读汉字

发布时间:2022-08-23 07:47:09

单片机显示汉字

编码说白了就是索引,就是通过一定的计算公式能找到字符所在数据块所在的地址,比如12X12的汉字就占用18BYTE。

编码有这几种GB2313,GBK,Unicode等,相同的字的数据是一样的,唯独就是在标准字库的的地址不一样。

字库里的数据有横向纵向,高位在前低位在前等等不同方式。

㈡ 单片机如何显示汉字论文

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);
}}}

㈢ 如何用单片机C51读取16*16点阵里的汉字

首先ROM里面每一个汉字都会对应一个地址,应该是有一张地址码的。假设“我”字的地址是0xFF,一般来说,你要将此地址送到ROM的地址线,然后读数据线,就能取出这个字的点阵编码了。

也就是说,你要先有一张地址表,每一个地址对应一个汉字,需要哪个汉字,便取相应的地址码。说得很粗略,不知道有没有看明白?具体你可以上网找一些实例来看。

回答你的补充:

你输入的按键组合其实就是一个编码啊。一个编码对应一个汉字就可以了。如果一个编码对应有多个汉字,可以把相同的都列出来备选就可以了。

㈣ 51单片机点阵显示一个汉字

8x8的点阵太小,很难正常显示一个汉字,通常,会使用4个8x8的点阵即16x16的点阵来显示一个汉字。

单片机在通过点阵显示汉字的时候,需要用到如下技术手段:

1、汉字取模

汉字取模,即把汉字对应16x16点阵的图形用16进制数来描述,形成可以用于驱动显示的数据。

例如下图,的汉字“中”

该字的16x16点阵图形中,每行有16个像素,可以编码为2个字节,每8个像素,对应一个字节的高低位,则该字编码的前2个字节为0x01,0x80……,如此,可用32个字节描述汉字的点阵图形。

关于汉字取模有很多开源的软件,你可以搜索下载并使用,将你的程序中所需要使用的汉字,全部处理成字模,再定义到程序中即可。(也可以使用汉字字库芯片,这里就不讨论了)

2、扫描显示

通常,驱动点阵设备时,为了节约单片机的管脚资源,会使用锁存器一类的期间,即锁存器输出端与点阵连接,而输入段由单片机控制,采用行、场扫描或分块行、场扫描的方式驱动,具体你可以搜寻相关资料。

㈤ 怎么让单片机阅读文字信息或者自动翻译图片上的文字

可以实现,
第一:你需要一个扫描器(千万别指望单片机内部来完成),最好这个扫描器能自动识出文字(有吗?我不知道,如果有也应该是扫描模块)。然后把这个扫描器连接到单片机上(如何连接,取决于扫描模块的接口,如I2C、PCI等);
第二:你需要外接一个语音合成芯片(别指望单片机来实现这个功能),将转换的文字信息交给语音芯片来合成;
第三:你需要外接一个扬声器,以便于发声。
呵呵!这样看来单片机只起到一个指挥的功能。
至于你说的用电脑来翻译,只是把我说的第一步由电脑来完成,另外两部分还是需要实现。至于让单片机来阅读你从电脑发送的(可通过串口或USB来实现)信息,还是别指望单片机来实现。
对了,由于信息量非常大,你可能需要扩展数据存储器,不够用。

㈥ 怎么在stm32f429 单片机显示中文文字

不管何种 单片机显示中文文字,首先要看液晶屏是否自带字库
如果带字库只管送中文文字的Uinicode编码就行(编译软件会自选查找)
如果不带字库,就要制作或复制字模(库)文件,显示时计算好要显示的汉字在字库中的位置,读出该字字模后,逐位判断是1还是0,从而决定是画黑点还是白点(当然彩屏还可以是多种颜色)这些在野火和正点原子的STM32教程中都有

㈦ 单片机怎样通过语音模块读出显示屏上的汉字谢谢各位啦~

需要实现录制每个汉字的发音,并建立一个地址映射关系,根据汉字编码,获取声音数据

㈧ 如何在单片机中调用hzk汉字库

这个需要用专用软件从“hzk汉字库”提取字模,然后以数组的形式,存在单片机中,这样就可以在代码中通过对数组的读取调用汉字库了

㈨ 求一个完整的单片机显示汉字程序

是用点阵式LED还是用LCD的?

这是液晶12864的显示程序
#include <reg51.h>

sbit RS=P2^2; // 数据\指令 选择
sbit RW=P2^1; // 读\写 选择
sbit E=P2^0; // 读\写使能
sbit CS1=P2^4; // 片选1
sbit CS2=P2^3; // 片选2

unsigned int number=0,mstcnt=0; //number 控制显示的字符个数,mstcnt用于延时控制

unsigned char code ziku[]=

{
/* 此方法显示的汉字为下半列排,即先分为上下两半,然后先取上半部分的点阵数据,且点阵对应的数为从下看到上 D7~D0
/*-- 文字: 我 -- 采用下半列排的方式,送数的方式:它是显8*16后接着换下一页显下半8*16
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/

/*-- 文字: 欢 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x14,0x24,0x44,0x84,0x64,0x1C,0x20,0x18,0x0F,0xE8,0x08,0x08,0x28,0x18,0x08,0x00,
0x20,0x10,0x4C,0x43,0x43,0x2C,0x20,0x10,0x0C,0x03,0x06,0x18,0x30,0x60,0x20,0x00,

/*-- 文字: 迎 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x40,0x41,0xCE,0x04,0x00,0xFC,0x04,0x02,0x02,0xFC,0x04,0x04,0x04,0xFC,0x00,0x00,
0x40,0x20,0x1F,0x20,0x40,0x47,0x42,0x41,0x40,0x5F,0x40,0x42,0x44,0x43,0x40,0x00,

/*-- 文字: 大 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x20,0x20,0x20,0x20,0x20,0x20,0xA0,0x7F,0xA0,0x20,0x20,0x20,0x20,0x20,0x20,0x00,
0x00,0x80,0x40,0x20,0x10,0x0C,0x03,0x00,0x01,0x06,0x08,0x30,0x60,0xC0,0x40,0x00,

/*-- 文字: 家 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x18,0x04,0x14,0x94,0x94,0xD5,0xB6,0x14,0x14,0x94,0x04,0x14,0x0C,0x04,0x00,
0x00,0x29,0x29,0x15,0x14,0x4A,0x89,0x44,0x3F,0x06,0x09,0x09,0x10,0x30,0x10,0x00,

/*-- 文字: 点 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x00,0x00,0xE0,0x20,0x20,0x20,0x3F,0x24,0x24,0x24,0xF4,0x24,0x00,0x00,0x00,
0x00,0x40,0x30,0x07,0x12,0x62,0x02,0x0A,0x12,0x62,0x02,0x0F,0x10,0x60,0x00,0x00,

/*-- 文字: 击 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x80,0x88,0x88,0x88,0x88,0x88,0xFF,0x88,0x88,0x88,0x88,0x88,0xC0,0x80,0x00,
0x00,0x00,0x00,0x7E,0x20,0x20,0x20,0x3F,0x20,0x20,0x20,0x20,0x7E,0x00,0x00,0x00,

/*-- 文字: 我 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x20,0x20,0x22,0x22,0xFE,0x21,0x21,0x20,0x20,0xFF,0x20,0x22,0xAC,0x20,0x20,0x00,
0x04,0x04,0x42,0x82,0x7F,0x01,0x01,0x10,0x10,0x08,0x07,0x1A,0x21,0x40,0xF0,0x00,

/*-- 文字: 的 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0xF8,0x8C,0x8B,0x88,0xF8,0x40,0x30,0x8F,0x08,0x08,0x08,0x08,0xF8,0x00,0x00,
0x00,0x7F,0x10,0x10,0x10,0x3F,0x00,0x00,0x00,0x03,0x26,0x40,0x20,0x1F,0x00,0x00,

/*-- 文字: 博 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x20,0x20,0xFF,0x20,0x20,0x04,0xF4,0x54,0x54,0xFF,0x54,0x55,0xF6,0x04,0x00,0x00,
0x00,0x00,0xFF,0x00,0x04,0x04,0x0F,0x35,0x15,0x47,0x85,0x7F,0x07,0x04,0x04,0x00,

/*-- 文字: 客 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x18,0x04,0x84,0x44,0x7C,0xA5,0x26,0x24,0xA4,0x64,0x24,0x14,0x0C,0x04,0x00,
0x08,0x08,0x05,0x04,0xFC,0x46,0x46,0x45,0x45,0x46,0x46,0xFE,0x04,0x0C,0x04,0x00,

/*-- 文字: 谢 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x40,0x42,0xCC,0x04,0x00,0xFC,0x56,0x55,0xFC,0x50,0x90,0x10,0xFF,0x10,0x10,0x00,
0x00,0x00,0x3F,0x50,0x29,0x11,0x4D,0x83,0x7F,0x00,0x41,0x80,0x7F,0x00,0x00,0x00,

/*-- 文字: 谢 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x40,0x42,0xCC,0x04,0x00,0xFC,0x56,0x55,0xFC,0x50,0x90,0x10,0xFF,0x10,0x10,0x00,
0x00,0x00,0x3F,0x50,0x29,0x11,0x4D,0x83,0x7F,0x00,0x41,0x80,0x7F,0x00,0x00,0x00,

/*-- 文字: 使 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x40,0x20,0xF0,0x1C,0x07,0xF2,0x94,0x94,0x94,0xFF,0x94,0x94,0x94,0xF4,0x04,0x00,
0x00,0x00,0x7F,0x00,0x40,0x41,0x22,0x14,0x0C,0x13,0x10,0x30,0x20,0x61,0x20,0x00,

/*-- 文字: 用 --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x00,0x00,0xFE,0x22,0x22,0x22,0x22,0xFE,0x22,0x22,0x22,0x22,0xFE,0x00,0x00,
0x80,0x40,0x30,0x0F,0x02,0x02,0x02,0x02,0xFF,0x02,0x02,0x42,0x82,0x7F,0x00,0x00,

};

checkstate() //状态检测(检查Busy)
{
unsigned char dat;
RS=0; //表示DB7~DBO为显示指令数据
RW=1; //数据被读到DB7~DBO
do
{
P1=0x00;
E=1; //E信号下降沿锁存DB7~DBO
dat=P1; //读入P1的值
E=0; //锁存
dat=0x80 & dat; //仅当第7位为0时才可操作(判别busy信号)为0时不忙
//BUSY:1内部在工作,0正常状态
}while(!(dat==0x00));
}
void writecommand(unsigned char command) //写命令
{
checkstate(); //检查Busy
RW=0;
P1=command;
E=1;
E=0;
}
void writedate(unsigned char date) //写数据
{
checkstate();
RS=1;
RW=0;
P1=date;
E=1;
E=0;
}
void cleanscreen() //清屏
{
unsigned char page,i;
for(page=0xb8;page<0xc0;page++) //共八页
{
writecommand(page); ///思路基本一样,从第一页写到最后一页
writecommand(0x40); ///数据指针 第一列开始
for(i=0;i<64;i++) ///0~63列
writedate(0x00);
}
}
void choosescreen(unsigned char NO) //选择屏幕 两屏
{
switch (NO)
{
case 0:
CS1=0;
CS2=0;
break; //不选,不显示
case 1:
CS1=0;
CS2=1;
break;
case 2:
CS1=1;
CS2=0;
break;
default:
break;
}
}

void lce_init(void)//初始化
{
writecommand(0xc0); //设置显示起始行
writecommand(0x3f);//显示开关控制
}

void display(unsigned char count) //显示
{
unsigned int i,m,page=0xb8; //0xb8设置设置页地址为第0页
choosescreen(1);
writecommand(0xb8);选择页面
writecommand(0x40);起始列
for(i=0;i<count*16;i++)
{
if(i!=0&&i%16==0)
m++;
switch (i) //控制显示的页指针与列指针
{
case 64: //显示的列累计求和 得所有左右屏四列的开始为 0.64 128.192 256.320 384.448
choosescreen(2); //右屏
writecommand(page); //字的上半部分 此显示方法与直接控制页显示类似,不过改进之处在于可逐字显示
writecommand(0x40); //设置起始列
break;
case 128:
choosescreen(1); //左屏
writecommand(page+2);
writecommand(0x40);
break;
case 192:
choosescreen(2);
writecommand(page+2);
writecommand(0x40);
break;
case 256:
choosescreen(1);
writecommand(page+4);
writecommand(0x40);
break;
case 320:
choosescreen(2);
writecommand(page+4);
writecommand(0x40);
break;
case 384:
choosescreen(1);
writecommand(page+6);
writecommand(0x40);
break;
case 448:
choosescreen(2);
writecommand(page+6);
writecommand(0x40);
break;
default:
break;
}
writedate(*(ziku+i+m*16));
}
choosescreen(1);
page=0xb9;
writecommand(page);
writecommand(0x40);
m=0;

/*
writecmd1(m); //上下循环显示
if(m==0xff)
{
m=0xc0;
}
m++;
writecmd2(n);
if(n==0xff)
{
n=0xc0;
}
n++;
*/

for(i=0;i<count*16;i++)
{
if(i!=0&&i%16==0)
m++;
switch (i) //控制显示的页指针与列指针
{
case 64: //显示的列累计求和
choosescreen(2); //右屏
writecommand(page); //字的下半部分
writecommand(0x40);
break;
case 128:
choosescreen(1); //左屏
writecommand(page+2);
writecommand(0x40);
break;

case 192:
choosescreen(2);
writecommand(page+2);
writecommand(0x40);
break;
case 256:
choosescreen(1);
writecommand(page+4);
writecommand(0x40);
break;
case 320:
choosescreen(2);
writecommand(page+4);
writecommand(0x40);
break;
case 384:
choosescreen(1);
writecommand(page+6);
writecommand(0x40);
break;
case 448:
choosescreen(2);
writecommand(page+6);
writecommand(0x40);
break;
default:
break;
}
writedate(*(ziku+i+m*16+16));
}
m=0;
}
void t0(void) interrupt 1 using 0
{
mstcnt++;
if(mstcnt==2000)
{
mstcnt=0;
number++;
}
}
main()
{
TMOD=0x02;
TH0=0x06; //// 6650us定时中断
TL0=0x06;
TR0=1;
ET0=1;
EA=1;

E=1;

choosescreen(0);

cleanscreen();

lce_init();

while(1)
{
display(number);
if(number==33)
{
number=0;
choosescreen(0);
cleanscreen();
}
}

}

阅读全文

与单片机读汉字相关的资料

热点内容
winftplinux 浏览:335
推特app界面如何设置成中文 浏览:452
太空工程师转子编程属性 浏览:32
windowscmd关机命令 浏览:342
云桌面只要服务器装一套软件 浏览:247
电脑右键按到什么导致文件夹全屏 浏览:454
我的世界如何制造服务器主城 浏览:365
linuxssh连不上 浏览:297
永宏plc用什么编程电缆 浏览:371
win激活命令行 浏览:886
新手学电脑编程语言 浏览:893
云空间在哪个文件夹 浏览:926
编程游戏小猫抓小鱼 浏览:790
安卓dosbox怎么打开 浏览:774
服务器无影响是怎么回事 浏览:958
比德电子采购平台加密 浏览:203
加密货币400亿 浏览:524
植发2次加密 浏览:44
vc6查看编译的错误 浏览:596
心理大全pdf 浏览:1002