山东快乐扑克33玩法———LCD12864怎么实现任意位置显示字符或汉字

12864液晶——读写、划点、划线、汉字、32*16的字符 - CSDN博客
12864液晶——读写、划点、划线、汉字、32*16的字符
//左半屏幕和右半屏幕的列号是一样的,页号也是一样的。
//选择整个屏幕,在给DDRAM中写数据时,会同时写到两个屏幕中,即两个屏幕中将会显示一样的数据。
//在清屏的时候可以选择整个屏幕。
//在滚动的时候可以选择整个屏幕,此时如果分别选屏幕滚动,可以实现两个屏幕滚动方向相反。
#define LCD_OFF 0x3E //关显示
#define LCD_ON 0x3F//开显示
#define Add_X 0xB8 //页初始地址,共8页
#define Add_Y 0x40 //Y初始地址,0到63,0x40到0x7f
#define Add_Z 0xC0 //DDRAM的初始地址
#define UPLINE 0x01 //上划线就是每个字节的第一位都是1
#define UNDERLINE 0x80//下划线就是每个字节的最后一位都是1
#define LCD12864_DATA_PORT P0//数据端口DB0~7接P0口
sbit LCD12864_E=P2^4; //E使能端
sbit LCD12864_RW=P2^3; //RW为0是写,为1是读
sbit LCD12864_RS=P2^2; //RS为0输入的为命令,为1输入的为数据
sbit LCD12864_CS1=P2^0; //CS1,低电平有效
sbit LCD12864_CS2=P2^1; //CS2,低电平有效
sbit LCD12864_RST=P2^5; //复位端口
void delayus(unsigned int us)//延时函数
while(us--);
void LCDSel(unsigned char sel)//选择屏幕
switch(sel)
case 0: LCD12864_CS1=0;LCD12864_CS2=0; //选择两个屏幕
case 1: LCD12864_CS1=0;LCD12864_CS2=1; //选择左半屏幕
case 2: LCD12864_CS1=1;LCD12864_CS2=0; //选择右半屏幕
void WaitLCD()//检测忙
LCD12864_DATA_PORT=0xFF;//P0口全部置1
LCD12864_RW=1;
LCD12864_RS=0;
LCD12864_E=1;
LCD12864_E=1;
& LCD12864_E=0;
LCD12864_DATA_PORT=0xFF; //读有效数据
LCD12864_RW=1;
& LCD12864_RS=0;
LCD12864_E=1;
flag=LCD12864_DATA_PORT;
LCD12864_DATA_PORT=0xFF;
& }while(!((flag&0x80)==0x80));
LCD12864_E=0;
void WriteDatToLCD12864(unsigned char dat)//写数据函数
// WaitLCD();
LCD12864_RS=1; //the data
LCD12864_RW=0; //write
LCD12864_DATA_PORT=
LCD12864_E=1;
LCD12864_E=0;
void WriteCmdToLCD12864(unsigned char cmd)//写命令函数
// WaitLCD();
LCD12864_RS=0; //the command
LCD12864_RW=0; //write
LCD12864_DATA_PORT=
LCD12864_E=1;
LCD12864_E=0;
unsigned char ReadDatFromLCD12864(void)//读数据
WaitLCD();
LCD12864_DATA_PORT=0xFF; //读空操作
LCD12864_RS=1; //the data
LCD12864_RW=1; //read
LCD12864_E=1;
LCD12864_E=1;
LCD12864_E=0;
LCD12864_DATA_PORT=0xFF; //读有效数据
LCD12864_RS=1;
LCD12864_RW=1;
LCD12864_E=1;
dat=LCD12864_DATA_PORT;
LCD12864_E=0;
void LCD12864_init(void)//初始化12864
LCD12864_RST=0;//液晶复位
delayus(50);
LCD12864_RST=1;
LCDSel(0); //选择整个屏幕
WriteCmdToLCD12864(LCD_OFF);//关显示
WriteCmdToLCD12864(LCD_ON);//开显示
void SetX(unsigned char x)//页选择0~7
WriteCmdToLCD12864(Add_X+x);
void SetY(unsigned char y)//ADD_Y是0x40,列初始地址,Y地址自动加一,DDRAM中的写入一字节数据的对应关系是竖着的八位,低位在上面,高位在下面。两个半屏幕的列号都是从0~63。当选中两个屏幕时,操作是对两个屏幕同时操作,并且进行一样的操作。由选屏、页和列就能指定唯一的一字节单元,只能写入一字节,不能一位一位的写,行号是指DDRAM和屏幕显示用的。
WriteCmdToLCD12864(Add_Y+y);
void SetZ(unsigned char z)//ADD_Z是0xC0,起始行地址,自动加一,SetZ(0)表示DDRAM中的第0行对应屏幕中的第1行,改变对应的行可以实现滚屏的效果。写数据是把DB0~DB7一字节的数据写到DDRAM中,Y地址指针自动加1,读数据是从DDRAM中读一个字节数据,Y地址指针自动加1。改变SetZ(z)中z的值只是改变了DDRAM与屏幕的对应关系。DDRAM中的数据到屏幕上的显示是一行一行进行的,因此有个自动加1。
WriteCmdToLCD12864(Add_Z+z);
void ClearLCD()//清屏
LCDSel(0);//选择两个屏幕
for(j=0;j&8;j++)
WriteCmdToLCD12864(LCD_ON);//开显示
SetX(j); //从0到7选择每一页
WriteCmdToLCD12864(Add_Y); //写入列的初始地址,列地址会自动加1,diffrent from SetY(0),SetY(64);
SetZ(0);//DDEAM和屏幕的对应关系是DDRAM中第0行对应屏幕的第1行。
for (i=0;i&64;i++)
WriteDatToLCD);//选中了两个半屏,向两个半屏相同列号处同时写入0x00,清屏。
//左上角第一个点为原点,向下Y为轴,向右为X轴
//x:0~63~127 列号 y:0~63行号
//由于是由页和列控制的,因此此处给出的x必须转化为页,即除以8即可,由于是处理一个点,还要得到这一页的第几行,即对8求余
//flag : 0:擦除某个点, 1:显示某个点 ,其本质就是赋值,赋值0是清除一个点,赋值1是显示一个点
unsigned char code Tab[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//一个字节中的8个位,此处要控制点,因此要处理八位中的一位。
void Dot(char x,char y,bit flag)
unsigned char dat = 0;
if(x&64)//x属于0~63就是左半屏幕,x是向右的X轴坐标,即在左半屏幕x是列号,在右半屏幕x-64是列号
LCDSel(1);//选择左半屏幕
SetX(y&&3); //y是行号,y属于0~63,除以8就得到当前的页,得到页号就可以设置页地址
SetY(x); //由列号设置列地址
dat = ReadDatFromLCD12864();//读数据,由于是一个字节一个字节操作的,别的点不能改变,因此要读数据,从而来保证其余7位的值
if(flag)//flag为1显示某个点,点显示为黑色的,液晶中每个字体的显示都是黑色的
dat = dat|(Tab[y&7]);//对8求余:y%8或y&7。对8求余得到当前页的第y%8行,由列和行可以确定唯一一个点。与0求或不变,与1求或变为1。
dat = dat&(~(Tab[y&7]));//清除这个点,与0求与为0,与1求与不变。
SetY(x); //列地址会自动加1,改变的点还要写入DDRAM中,因此将列地址仍设置为列号为x的列
WriteDatToLCD12864(dat);//写数据,仅仅只改变了一个点的状态
else if(x&128)//右半屏幕
LCDSel(2);//选择右半屏幕
SetX(y&&3);//设置页地址
SetY(x-64);//列地址,右屏幕的列号是从0到63
dat = ReadDatFromLCD12864();//读数据,由于是一个字节一个字节操作的,别的点不能改变,因此要读数据
dat=dat|(Tab[y&7]);
dat=dat&(~(Tab[y&7]));
SetY(x-64);//右半屏幕的列地址也是0~63
WriteDatToLCD12864(dat);//写数据
//左上角第一个点为原点,向下Y为轴,向右为X轴
//在两个点之间划线,draw a line between point(x1,y1) and point(x2,y2)
//flag为0是erase擦除线,为1是画线
void Line(unsigned char x1,unsigned char y1,unsigned char x2,unsigned char y2,bit flag)
//临时变量,用于交换两个数
//if中是划竖线
if(x1==x2)//坐标系是左上角第一个点为原点,向下Y为轴,向右为X轴,x1等于x2则这两个点在同一列
if(y1&y2)//如果y1大于y2,交换y1和y2的值
temp = y1;
for(i=y1;i&=y2;i++)//y1等于y2就是画点
Dot(x1,i,flag);//列相同,从y1到y2划点形成线
//else中是划横线和斜线
if(x1&x2)//为了保证k为正值,当然也可以用绝对值函数
temp = x1;
temp = y1;
k = (float)(y2-y1)/(float)(x2-x1);//计算斜率,k为0是划横线,由于x1不等于x2,所以不会是画点
temp = x2-x1;
for(i=0;i&i++)
Dot(x1+i,(unsigned char)(y1+k*i),flag);
void Rect(unsigned char x1,unsigned char y1,unsigned char x2,unsigned char y2,bit flag)//画矩形
Line(x1,y1,x2,y1,flag);//y1行所在横线
Line(x2,y1,x2,y2,flag);//x2列所在竖线
Line(x2,y2,x1,y2,flag);//y2行所在横线
Line(x1,y2,x1,y1,flag);//x1列所在竖线
//汉字是16*16
//x是页0~7,y是列0~127
//n为要显示汉字的个数
//upline为0表示有上划线,underline为0表示有下划线
//flag为0表示汉字反白显示
void hz_disp(unsigned char x,unsigned char y,unsigned char n,unsigned char code *hz,bit flag,bit upline,bit underline)
unsigned char i,j;
for (j=0;j&n;j++)//要显示n个汉字,汉字编号0~n-1,j表示当前汉字编号
//显示上半个汉字
//每页是8行,汉字是16*16的,因此一个汉字分成上下两部分显示,即8*16,8行16列。
for(i=0;i&16;i++)//一个汉字占32个字节,这是前16个字节,每个字节占DDRAM中的一列
//点的位置是在左半屏幕还是右右半屏幕
if((y+(j&&4)+i)&64)//y表示要显示的起始列号,j表示当前汉字编号,j要乘以16,i表示当前汉字中0~16行的第i行,因此y+j&&4+i才是当前要写入数据的列号
LCDSel(1);//选择左半屏幕
WriteCmdToLCD12864(LCD_ON);//开显示
SetX(x);//设置页
SetZ(0);//DDRAM和屏幕的对应关系
SetY(y+(j&&4)+i);//设置列地址
if(upline)//如果没有上划线
if(flag)//汉字不反白显示
WriteDatToLCD12864(hz[(j&&5)+i]);//一个汉字占32个单元,j要乘以32,即左移5位
else//汉字反白显示
WriteDatToLCD12864(~hz[(j&&5)+i]);
else//如果有上划线
if(flag)//不反白显示
WriteDatToLCD12864(hz[(j&&5)+i]|UPLINE);//将每个字节的最低位置为1
else//反白显示
WriteDatToLCD12864(~hz[(j&&5)+i]|UPLINE);//将每个字节的最低位置为1
else if((y+(j&&4)+i)&128)//在右半屏幕
LCDSel(2);//选择右半屏幕
WriteCmdToLCD12864(LCD_ON);//开显示
SetX(x);//设置页地址
SetZ(0);//DDRAM和屏幕对应关系
SetY(y+(j&&4)+i-64);//设置列地址,右半屏需要减去64
if(upline)
if(flag) WriteDatToLCD12864(hz[(j&&5)+i]);
else WriteDatToLCD12864(~hz[(j&&5)+i]);
if(flag) WriteDatToLCD12864(hz[(j&&5)+i]|UPLINE);
else WriteDatToLCD12864(~hz[j&&5+i]|UPLINE);
//显示下半个汉字
for(i=16;i&32;i++)//一个汉字占32个单元,这是后16个单元
if((y+(j&&4)+i-16)&64)//汉字在左半屏幕
if(x+1&8)//页编号是0~7,共8页,如果x+1小于8,这说明这个汉字不会最后一页显示汉字的上半部分,第一页显示汉字的下半部分
LCDSel(1);//选择左半屏幕
WriteCmdToLCD12864(LCD_ON);//开显示
SetX(x+1);//设置页地址
SetZ(0);//DDRAM和屏幕对应关系
SetY(y+(j&&4)+i-16);//设置列地址
if(underline)//如果没有下划线
if(flag) WriteDatToLCD12864(hz[j&&5+i]);
else WriteDatToLCD12864(~hz[j&&5+i]);
else//有下划线
if(flag) WriteDatToLCD12864(hz[j&&5+i]|UNDERLINE);//将每个字节的最高位置为1
else WriteDatToLCD12864(~hz[j&&5+i]|UNDERLINE);
else if((y+(j&&4)+i-16)&127)//下半部分的汉字在右半屏幕
if(x+1&8)
LCDSel(2);
WriteCmdToLCD12864(LCD_ON);
SetX(x+1);
SetY(y-64+(j&&4)+i-16);
if(underline)
if(flag) WriteDatToLCD12864(hz[j&&5+i]);
else WriteDatToLCD12864(~hz[j&&5+i]);
if(flag) WriteDatToLCD12864(hz[j&&5+i]|UNDERLINE);
else WriteDatToLCD12864(~hz[j&&5+i]|UNDERLINE);
//字母和数字是16行8列的
//x:行0~7 y:列0~127
//asc: 指向标准交换码ASCII
//string: 指向要显示的字符串
//flag: 0 反白显示
//online: 0 带上划线,underline : 0带下划线
//n: the number of the string
void en_disp(unsigned char x,unsigned char y,unsigned char n,unsigned char code *asc,const unsigned char *string,bit flag,bit online,bit underline)
unsigned char i,j,
for (j=0;j&n;j++)//从第一个字符开始处理,字符串string长度为n
loc = string[j]-0x30;//0~9和:的ASCII码是从0x30到0x3A,:正好在9后面,0~9和:的ASCII码在Asc[]数组中对应,loc是指示第几个元素,loc*16才是Asc[]数组中对应的位置,因为每个字符占16个单元,如果建立一个二维数据更容易处理一些。
for(i=0;i&8;i++)//ASCII码的上半部分
if((y+(j&&3)+i)&64)//y是列地址,每一个字符占8列,j&&3表示前面有j个字符占了8*j列,还要加上i,即当前字符的第i列
LCDSel(1);//选择左半屏幕
WriteCmdToLCD12864(LCD_ON);//开显示
SetX(x);//设置页地址
SetY(y+(j&&3)+i);//设置列地址
if(online)//没有上划线
if(flag) WriteDatToLCD12864(asc[loc&&4+i]);//不反白显示
else WriteDatToLCD12864(~asc[loc&&4+i]);//反白显示
if(flag) WriteDatToLCD12864(asc[loc&&4+i]|UPLINE);
else WriteDatToLCD12864(~asc[loc&&4+i]|UPLINE);
else if((y+(j&&3)+i)&128)
LCDSel(2);
WriteCmdToLCD12864(LCD_ON);
SetY(y-64+(j&&3)+i);
if(online)
if(flag) WriteDatToLCD12864(asc[loc&&4+i]);
else WriteDatToLCD12864(~asc[loc&&4+i]);
if(flag) WriteDatToLCD12864(asc[loc&&4+i]|UPLINE);
else WriteDatToLCD12864(~asc[loc&&4+i]|UPLINE);
for(i=8;i&16;i++)//显示下半个字母
if((y+(j&&3)+i-8)&64)
if(x+1&8)
LCDSel(1);
WriteCmdToLCD12864(LCD_ON);
SetX(x+1);
SetY(y+(j&&3)+i-8);
if(underline)
if(flag) WriteDatToLCD12864(asc[loc&&4+i]);
else WriteDatToLCD12864(~asc[loc&&4+i]);
if(flag) WriteDatToLCD12864(asc[loc&&4+i]|UNDERLINE);
else WriteDatToLCD12864(~asc[loc&&4+i]|UNDERLINE);
else if((y+(j&&3)+i-8)&128)
if(x+1&8)
LCDSel(2);
WriteCmdToLCD12864(LCD_ON);
SetX(x+1);
SetY(y-64+(j&&3)+i-8);
if(underline)
if(flag) WriteDatToLCD12864(asc[loc&&4+i]);
else WriteDatToLCD12864(~asc[loc&&4+i]);
if(flag) WriteDatToLCD12864(asc[loc&&4+i]|UNDERLINE);
else WriteDatToLCD12864(~asc[loc&&4+i]|UNDERLINE);
//显示一个32行16列的字符,占用4页
//line是页
//column是列
//flag是反白标识
void Show16X32(unsigned char page,unsigned char column,unsigned char *pt,bit flag)
unsigned char i,j;
for(j=0;j&4;j++)
SetX(page+j); //设置页地址
LCDSel(1); //选左半屏
SetY(column); //一个字符占用4页,但每页的列首地址都是相同的,设置列地址
for(i=0;i&16;i++)//一个字符占16列
if((column+i)&=64) //如果列大于等于64
LCDSel(2);//选右屏幕
SetY(column+i-64);//设置列地址,列地址会自动加一
if(flag) WriteDatToLCD12864(*pt);//不反白显示
else WriteDatToLCD12864(~(*pt));
pt++;
本文已收录于以下专栏:
相关文章推荐
自制单片机之六……LCD12864的驱动c51单片机
字号: 大大
小小 LCD12864的驱动LCD12864在市面上...
我做本实验的软件平台为MDK,软件,12864液晶屏为并行接法。其中所有程序全部由自己编写,最终可在12864液晶屏上面任意位置显示任意内容。
下面贴出实验源程序,希望对做12864液晶屏实验的同学提...
之前所见的到的12864均为20脚的,突然有一天发现了一只16脚的12864,原谅我乡下人见的少,于是惊喜之余,把玩了一番,介于网上的资料略少,我就简单的描述一下它和20脚的12864的用法和区别。话...
/******************************************************************************************
* 文件名称 ...
C++对多语言文本字符的支持,通过宽字符来解决。
只要将输入输出设备绑定到一个本地的locale对象上即可。locale currentlocale("chs");表示中国
其处理方法与原来的单字节字...
首先声明:这些内容主要是面向C语言的初学者,尤其是正在学习C语言的学生。
在上一篇文章中,我们利用字符型变量处理了文本文件中的英文字符。但是,文本文件中不仅能输入英文字符,更多的时候我们需要...
本人总结的最全字符编码概述,分享学习,涉及ACSII,GB2312,GBK,GB18030,Unicode,UTF8,UTF16,UTF32,BOM。
在做总结时被问到字符编码的知识,由于这块知识没...
首先,要将char转换成对应的整型大小。比如ASCII码164对应的字符串,二进制形式:.
直接使用强制转换成int再输出16进制的话,会得到ffffffa4,这是因为字符串的最高...
他的最新文章
讲师:何宇健
讲师:董岩
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)12864液晶显示,这么样实现写入汉字,显示出来。_百度知道
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。
12864液晶显示,这么样实现写入汉字,显示出来。
我有更好的答案
用字模软件画出图形你好:如果你的12864是带字库的话,用液晶显示就行了。这两种液晶的程序我也有,如果你需要回复我,直接在写数据函数里用双引号写一个汉字就能直接显示。如果不是带字库的液晶。希望我的回答能帮助到你,就是通过绘图的方式,只要写好了驱动
采纳率:89%
/articles/article/item/90296" target="_blank">.<a href="http://chao6636
为您推荐:
其他类似问题
12864液晶的相关知识
等待您来回答查看: 8117|回复: 12
怎么在12864液晶上显示任意大小汉字
怎么在12864液晶上显示任意大小汉字
本帖最后由 ahshmj 于
12:53 编辑
自带字库的字就是16*16点阵的汉字(全角字符),或8*16(半角字符,数字或字母),只能是这样。但是你可以使用图形模式用自己的字模。
你做成的字模是多大显示就是多大。小于16*16的不好看,大于32*32的显示的字又太少。
不带字库的,要显示汉字或字母当然要制作字模。
汉字一般12*12分辨率已经很低了,不过还是能看,但是笔画多的就不一定了,建议最小12*12,,自己取模,写个显示函数。我一般是用无字库的cog,价格很便宜,几块钱到十几块一大把。一般采用16*16,那就可以直接用字库的了
自带字库的字就是16*16点阵的汉字(全角字符),或8*16(半角字符,数字或字母),只能是这样。但是你可以 ...
可不可以发一个示例程序?
汉字一般12*12分辨率已经很低了,不过还是能看,但是笔画多的就不一定了,建议最小12*12,,自己取模,写个 ...
谢谢指导!
#include &reg52.h&
#include&intrins.h&
#define&&uchar unsigned char
#define&&uint&&unsigned&&int
sbit rs =P2^0;& &// //数据\//指令//选择
sbit rw =P2^1;& &// //读\写选择
sbit en =P2^2;& &// 读\写使能&&
sbit cs1 =P2^4;&&// 片选1,低有效(前64列)
sbit cs2 =P2^5;&&// 片选2,低有效(后64列)
void& & lcdstate()
uchar&&lcd=0x00; /*设置初值为0,全部为低,方便后面的判忙*/
rs=0; /*根据时序图拉低,选择写指令*/
rw=1; /*根据时序图拉低,选择写模式*/
en=1; /*使能,使液晶输出信号,检查是否忙*/
_nop_();_nop_();_nop_();_nop_();/*延时4US*/
lcd=P0; /*把P0口的状态值读回来给lcd*/
en=0; /*使能端跳变*/;
}while(lcd&0x80); /*结果的高位保留,如果高位DB7为一,则表示忙*/
void delay(uchar&&ms)
{ uchar& &i;
& &uchar& &j;
&&for(i=0;i&100;i++)
& &for(j=0;j&j++);
void& &write_command(uchar& &command)
lcdstate();
&&rs=0;& & & & & & & & & & & & & & & & //RS=0;为往MCU进行指令操作
&&rw=0;& & & & & & & & & & & & & & & & //RW=0;为往MCU写入操作
&&_nop_();_nop_();_nop_();_nop_();/*延时4US*/
&&_nop_();_nop_();_nop_();_nop_();/*延时4US*/
&&_nop_();_nop_();_nop_();_nop_();/*延时4US*/
void& &write_data(uchar& &datas)
& &lcdstate();
& &rw=0;&&
& &_nop_();_nop_();_nop_();_nop_();/*延时4US*/
& &_nop_();_nop_();_nop_();_nop_();/*延时4US*/
& &_nop_();_nop_();_nop_();_nop_();/*延时4US*/
void& &lcdinit()
& & delay(100);& & & & & & & & & & & & & & & & & & & &&&//
& & cs1=1;
& & & & cs2=1;
& & & & delay(100);& & & &
& & & & lcdstate();& & & & & & & & & & & & & & & &&&//
& & & & write_command(0x3e);& & & & & & & &&&//
& & & & write_command(0xb8+0);& & & & & & & & & & & &&&//
& & & & write_command(0xc0+0);& & & & & & & &&&//
& & & & write_command(0x40+0);& & & & & & & &&&//
& & & & write_command(0x3f);& & & & & & & &&&
void clearScreen(&&)
{& &uchar i,j;
& & lcdstate();
& & cs1=1;
& & & & cs2=1;
& & & & write_command(0x3f);& & & & & & & & & & & & //设置显示开
& & & & write_command(0xb8);& & & & & & & && &&&//Y& & & & 设置第0页;
& & & & write_command(0x40);& & & & & & & & & & & &&&//& & & & 设置第0列
& &for(i=0;i&8;i++)
& &&&write_command(0xb8+i);
& &&&for(j=0;j&64;j++)
& & & && & //write_command(0x40+j);
& && & write_data(0x00);
& & & && &
unsigned char code& & jin[128]=
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0xF0,0xF8,0x7C,0x3C,0x7C,0xF8,0xE0,0xC0,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x20,0x60,0x70,0x78,0x38,0x3C,0x7E,0x6F,0x67,0x67,0x63,0x61,0xE0,0xE0,0xE0,0xE0,0x61,0x63,0x63,0x67,0x6F,0x7E,0x7E,0x1C,0x3C,0x38,0x78,0x78,0x10,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0xD8,0xD8,0xD8,0x98,0x18,0x18,0xFF,0xFF,0xFF,0xFF,0x18,0x18,0x38,0xF8,0xD8,0xD8,0xD8,0x18,0x18,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x30,0x30,0x30,0x30,0x31,0x37,0x37,0x33,0x32,0x30,0x3F,0x3F,0x3F,0x3F,0x30,0x38,0x3F,0x3F,0x3F,0x33,0x30,0x30,0x30,0x30,0x30,0x00,0x00,0x00};/*&金&,0*/
/* (32 X 32 , 黑体, 加粗 )*/
uchar code& & se[128]=
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC0,0xF0,0xFC,0xFC,0xF8,0xC8,0xC8,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x10,0x30,0x38,0x3C,0xFE,0xFF,0xFF,0xF7,0x33,0x30,0x30,0x30,0x30,0xF0,0xF0,0xF8,0xFE,0x3F,0x3F,0x33,0x31,0x30,0xF0,0xF0,0xF0,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x1C,0x1C,0x1C,0x1C,0x1C,0x1F,0x1F,0x1F,0x1F,0x1C,0x1C,0x1C,0x1C,0x1C,0x3F,0x3F,0x3F,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x1F,0x3F,0x3F,0x38,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x38,0x3E,0x1E,0x0C,0x00,0x00};/*&色&,1*/
/* (32 X 32 , 黑体, 加粗 )*/
uchar code& & tong[128]=
{0x00,0x00,0x00,0x00,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0xE0,0xE0,0x60,0x68,0x7C,0x7C,0x7C,0x60,0x60,0xE0,0xE0,0xE0,0x60,0x60,0x60,0x60,0x60,0x60,0x00,0x00,0x00,
0x00,0x00,0x00,0x04,0x04,0x04,0xE4,0xE4,0xE4,0x64,0x67,0x67,0x67,0x67,0x64,0xE4,0xE4,0xE4,0x64,0x67,0x67,0x67,0x65,0x64,0xE4,0xE4,0xE4,0x04,0x04,0x04,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x3F,0x3F,0x32,0x32,0x32,0x32,0x32,0x32,0xFF,0xFF,0xFF,0x32,0x32,0x32,0x32,0x32,0x32,0x3F,0x3F,0x3F,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x30,0x30,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x3F,0x3F,0x3F,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x33,0x30,0x30,0x00,0x00};/*&童&,2*/
/* (32 X 32 , 黑体, 加粗 )*/
uchar code& & nian[128]=
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xE0,0xF8,0xFC,0xFC,0x98,0x88,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x00,0x00,
0x00,0x00,0x20,0x30,0x78,0x7C,0x3F,0xDF,0xCF,0xC3,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xFF,0xFF,0xFF,0xFF,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0xC1,0x01,0x00,0x00,0x00,
0x00,0x00,0xC0,0xC0,0xC0,0xC0,0xC0,0xFF,0xFF,0xFF,0xFF,0xC0,0xC0,0xC0,0xC0,0xC0,0xFF,0xFF,0xFF,0xFF,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x7F,0x7F,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};/*&年&,3*/
/* (32 X 32 , 黑体, 加粗 )*/
void hz_display16(unsigned char pag, unsigned char col, unsigned char code *hzk)
& & & & uchar j=0;
& & & & uchar i=0;
& & & & for(j=0;j&4;j++)& & & & & & & && && && &&&//这里写四页
& & & & & & & & write_command(0xb8+pag+j);& & & && &//page在这里就是从page表示的这页开始写起。
& & & & & & & & write_command(0x40+col);& & & && &//从列为col表示的列开始
& & & & & & & & for(i=0;i&32;i++) & & & & & & & & & & & && &//这里写32列
& & & & & & & & write_data(hzk[32*j+i]);& & & & //J为页,I,为第J行第I个数
void main()
lcdinit();
clearScreen(&&);
&&delay(2);
// hz_display16(0,0,xms[]);
& & cs2=0;
&&hz_display16(0,0,jin);
&&hz_display16(0,32,se);
&&cs1=0;cs2=1;
hz_display16(0,0,tong);
hz_display16(0,32,nian);
这个是显示32*32字的,金色童年
#include&intrins.h&
#define&&uchar unsigned char
我在网上搜了一些程序例子,发现有些程序都有cs1和cs3这两个片选端口,但是我的12864上面没有cs1和cs2这2个端口,只有psb这个串并行选择端口,这是为什么?难道是12864有很多不同的型号!
我在网上搜了一些程序例子,发现有些程序都有cs1和cs3这两个片选端口,但是我的12864上面没有cs1和cs2这2 ...
这个其实你可以上网查一下,我了解的是因为有两种不同芯片的12864的屏,一种是KS0108芯片的,其中有片选CS1和CS2,它没有内置字库,需要取模,另外一种是ST7920,它是 只有PSB这个串行并行选择端口,它有字库,一般不需要取模了。
使用KS0108芯片的实际上每一片控制64*64的区域,如果是2片组合,就是128*64,三片组合就是192*64 。
CS1和CS2就是选择这2片或3片的。这样的LCD都是不带字库的。
使用KS0108芯片的实际上每一片控制64*64的区域,如果是2片组合,就是128*64,三片组合就是192*64 。
谢谢你的解答!
汉字一般12*12分辨率已经很低了,不过还是能看,但是笔画多的就不一定了,建议最小12*12,,自己取模,写个 ...
请问你是在哪里买的无字库的12864?我买不到,都是带字库的,贵的死
自带字库文字大小不可以改变,除非自己取模
突破哦了利客来
Powered by

我要回帖

更多关于 快乐扑克3豹子遗漏 的文章

 

随机推荐