带字库12864超详细扩展操作写自定义字符画图画直线画圆读取数据等操作Word下载.docx
- 文档编号:5268435
- 上传时间:2023-05-04
- 格式:DOCX
- 页数:45
- 大小:1.07MB
带字库12864超详细扩展操作写自定义字符画图画直线画圆读取数据等操作Word下载.docx
《带字库12864超详细扩展操作写自定义字符画图画直线画圆读取数据等操作Word下载.docx》由会员分享,可在线阅读,更多相关《带字库12864超详细扩展操作写自定义字符画图画直线画圆读取数据等操作Word下载.docx(45页珍藏版)》请在冰点文库上搜索。
RW=0;
//指明为写操作
3>
E=1;
4>
DB=data;
//data为你要写入的命令或数据值
5>
E=0;
[/p][p=30,2,left]以下是我的驱动函数,仅供参考:
[/p][p=30,2,left]
CODE:
/********************************液晶端口定义**************************/
#define
lcd_data
P0
//数据口
sbit
RS
=P2^4;
//选择寄存器(并行)0:
指令寄存器1:
数据寄存器;
RW
=P2^5;
//读写控制脚(并行)0:
写入1:
读出
E
=P2^6;
//读写数据启始脚(并行)
PSB
=P2^1;
//串并方式选择引脚,0为串行模式,1为8/4位数据口模式
RST
=P2^3;
//复位引脚
//********************************************************
//延时函数
voiddelay(unsignedintk)
{
unsignedinti;
unsignedcharj;
for(i=0;
i<
k;
i++)
{
for(j=0;
j<
10;
j++);
}
}
//延时1ms函数
voiddelay_ms(unsignedintk)//延时0.994us,晶振12M
unsignedintx,y;
for(x=k;
x>
0;
x--)
for(y=121;
y>
y--);
}
//写命令函数
voidLcdWcom(unsignedcharWCom)
delay
(1);
RS=0;
//指明操作对象为指令寄存器
RW=0;
//指明为写操作
E=1;
lcd_data=WCom;
//将命令写入总线
E=0;
//写数据函数
//********************************************************
voidLcdWdata(unsignedcharWData)
RS=1;
//指明操作对象为数据寄存器
lcd_data=WData;
//将数据写入总线
}[/p][p=30,2,left]二、初始化操作[/p][p=30,2,left]以8位并行操作为例,操作流程图如下:
初始化.JPG
[/p][p=30,2,left]初始化操作如下:
[/p][p=30,2,left]1>
芯片上电;
[/p][p=30,2,left]2>
延时40ms以上;
[/p][p=30,2,left]3>
复位操作:
RST出现一个上升沿(RST=1;
RST=0;
RST=1;
);
[/p][p=30,2,left]4>
功能设定;
[/p][p=30,2,left]5>
延时100us以上;
[/p][p=30,2,left]6>
再次进行功能设定;
[/p][p=30,2,left]7>
延时37us;
[/p][p=30,2,left]8>
显示开关控制;
[/p][p=30,2,left]9>
[/p][p=30,2,left]10>
清除显示;
[/p][p=30,2,left]11>
延时10ms以上;
[/p][p=30,2,left]12>
进入点设置;
[/p][p=30,2,left]13>
初始化结束;
[/p][p=30,2,left]
这里我遇到了一个小问题,我的液晶按照这个顺序进行初始化结果不正确,无法显示,最后我把调整了一下就可以了,调整后的顺序为:
清除显示进入点设置显示开关控制,不知道是什么原因,知道的告诉我一声…[/p][p=30,2,left]
//显示初始化函数
voidDisplay_Init(void)
delay_ms(45);
//延时45ms
PSB=1;
//8位并行口
//复位操作
//功能设定
LcdWcom(0x30);
//设置为8位并行口,基本指令集
delay(10);
//再次设置为8位并行口,基本指令集
delay(5);
//
//显示开关控制
LcdWcom(0x0c);
//游标显示关,正常显示,整体显示开
delay(10);
//清除显示
LcdWcom(0x01);
delay_ms(12);
//延时12ms
//进入点设置
LcdWcom(0x06);
//设置为游标右移,DDRAM位地址加1,画面不移动
LcdWcom(0x0C);
//开显示
}[/p][p=30,2,left]三、显示基本的字符和汉字[/p][p=30,2,left]1、要想显示汉字或字符,首先要确定显示的位置,看看芯片说明书上关于屏幕地址的分配:
DDRAM位址.JPG
[/p][p=30,2,left]由于此液晶为128*64,即是横向128个点,竖向64个点,由于该液晶控制器支持的字符为8*16,汉字为16*16,因此只能显示四行,如果是汉字,为每行显示8个,如果是字符,每行显示16个。
由上图设置DDRAM地址的指令可知,最高位为1,余下7位为地址值,因此就对应了为什么起始地址为80H的原因(即对应的写地址指令为10000000);
因此如果你要设定显示的地址为第一行的第一个位置,只需要调用写指令函数,写入0x80即可。
[/p][p=30,2,left]存在的问题:
参考网上的程序及在试验过程中发现,实际能显示出来的地址分布式这样的[/p][p=30,2,left]0x800x810x820x830x840x850x860x87
//第一行汉字位置
0x900x910x920x930x940x950x960x97
//第二行汉字位置
0x880x890x8a0x8b0x8c0x8d0x8e0x8f
//第三行汉字位置
0x980x990x9a0x9b0x9c0x9d0x9e0x9f
//第四行汉字位置[/p][p=30,2,left]百思不得其解,尤其让人受不了的是居然是第一行和第三行地址接续,而不是第二行,有明白的高手给讲解一下…[/p][p=30,2,left]设定DDRAM地址参考程序:
//设置光标函数
//参数说明:
x为行号,y为列号
voidSet_Cursor(unsignedcharx,unsignedchary)
unsignedchari;
switch(x)//确定行号
{
case0x00:
i=0x80;
break;
//第一行
case0x01:
i=0x90;
//第二行
case0x02:
i=0x88;
//第三行
case0x03:
i=0x98;
//第四行
default:
i=y+i;
//确定列号
LcdWcom(i);
//写地址
}[/p][p=30,2,left]2、显示字符[/p][p=30,2,left]由数据手册可查看可以显示的字符及其显示码:
半宽字.JPG
[/p][p=30,2,left]因此,当你设置好所要显示的光标位置后,即可调用写数据函数,写入对应相应字符的显示码,比如要显示!
就应该写入0x21。
//显示字符函数
voidDisplay_Char(unsignedcharAlphabet)
LcdWdata(Alphabet);
//写入需要显示字符的显示码
}显示!
实例:
/**********************显示单个字符*************************/
Set_Cursor(0,0);
//光标地址设定
Display_Char(0x21);
//显示字符!
[/p][p=30,2,left]效果图:
1.JPG
[/p][p=30,2,left]扩展程序:
在指定位置显示字符串
//指定位置显示字符串函数
voidDisplay_String(unsignedcharx,unsignedchary,unsignedchar*Alphabet)
unsignedchari=0;
Set_Cursor(x,y);
//设置显示的起始地址
while(Alphabet[i]!
='
\0'
)
LcdWdata(Alphabet[i]);
//写入需要显示字符的显示码
i++;
}显示字符串实例:
/***********************显示字符串*************************/
Display_String(1,0,"
WWW.CEPARK.COM"
);
//显示字符串效果图:
2.JPG
[/p][p=30,2,left]3、显示汉字[/p][p=30,2,left]
[/p][p=30,2,left]因为一个汉字占用两个字节的大小,因此要想显示一个汉字,需要进行两个数据写入操作。
[/p][p=30,2,left]所支持的8192个16*16的汉字详见数据手册附录中的ST7920GB中文字型码表。
[/p][p=30,2,left]参考程序:
//指定位置显示汉字函数
voidDisplay_HZ(unsignedcharx,unsignedchary,unsignedchar*HZ)
//设置显示的起始地址
LcdWdata(HZ[0]);
//写入需要显示汉字的高八位数据
LcdWdata(HZ[1]);
//写入需要显示字符的低八位数据
}显示汉字实例:
/************************显示汉字*************************/
Display_HZ(0,1,"
电"
//显示电
Display_HZ(0,2,"
子"
//显示子
Display_HZ(0,3,"
园"
//显示园效果图:
3.jpg
[/p][p=30,2,left][/p][p=30,2,left][/p][p=30,2,left][/p][p=30,2,left]扩展程序:
//指定位置显示一行汉字函数,可自动换行
voidDisplay_HZ_Line(unsignedcharx,unsignedchary,unsignedchar*HZ)
while(HZ[i]!
LcdWdata(HZ[i++]);
//写入需要显示汉字的高八位数据
//写入需要显示字符的低八位数据
if((y+i)%16==0)
//如果满一行
{
x++;
if(x==4)
//如果满一屏
x=0;
Set_Cursor(x,0);
//重新设置显示的起始地址
[/p][p=30,2,left]显示一行汉字实例:
/************************显示一行汉字*********************/
Display_HZ_Line(2,0,"
欢迎转载,转载请注明出处,谢谢!
"
//显示一行汉字效果图:
4.jpg
[/p][p=30,2,left]再来一个整体的现实效果[/p][p=30,2,left]
//**************************************************************************
//说明:
程序主函数
voidmain(void)
/***********************液晶初始化***************************/
Display_Init();
//光标地址设定
//显示字符!
//显示字符串
//显示电
//显示子
//显示园
//显示一行汉字
while
(1);
}[/p][p=30,2,left]
5.jpg
最新回复
love_wjgygaat2010-12-0112:
24:
08
[i=s]本帖最后由love_wjgyga于2010-12-116:
23编辑
[p=30,2,left]四、关于CGRAM的使用:
[/p][p=30,2,left]可以参考这个网站的程序:
http:
//bbs.友好站点,请勿转贴.com/ShowTopic.aspx?
id=81220ST7920自行产生RAM提供使用者图像定义(造字)功能,可以提供四组16*16点的自定义图像空间,使用者可以将内部自行没有提供的图像自行定义到CGRAM中,便可以通过DDRAM显示在液晶屏上。
注意:
网上介绍说ST7920芯片同屏幕不能显示4个以上自定义汉字(用CGRAM)。
显示CGRAM字型:
将16位元资料写入DDRAM中,一共有0000H,0002H,0004H,0006H四种编码。
CGRAM1.JPG
CGRAM2.JPG
[/p][p=30,2,left]操作步骤:
设置为扩充指令集;
设置SR=O,允许设定CGRAM地址;
设置为基本指令集;
循环执行以下操作写入16个字节数据(设定CGRAM的存储地址;
写入自定义数据);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 字库 12864 详细 扩展 操作 自定义 字符 画图 直线 读取 数据