我怀疑你根本就没开显示。12864你用命令开了显示了吗?如果不是,看我下面所写的。
Proteus里的12864是个无字库纯点阵的液晶屏。我给你几个函数,因为这里不能全贴上,字数有限。只能给你几个关键的基础函数,给你太多反而看不懂,因此只给你3个。你在看懂这些函数的情况下在修改自己的函数。
proteus里的12864不需要像实际的液晶那样的有各自不同厂商的个性设置,只需要使用基本指令就够了。因此它其实初始化是很简单的,开显示就行。而实际的12864使用都是有字库的,初始化复杂。而无字库12864一般用的不多。
void _L12864Init(void)
{
LcdWriteComOrData(0,0x3f); //显示开
}
//这个函数是应用函数,是在基础函数上构造的,意义不大,只是举个例子。
//内容是左右半屏方式,显示图像
static void ShowPicture(uchar (*p)[64])//显示一张图片,因为图片是没有字符那样的局部空间,一个整体
{ //显示一页就是64列,这里64是二维数组的第二维是64
uchar i,j;
CS1=0;CS2=1; //显示左半屏
for(i=0;i<8;i++)
{
LcdWriteComOrData(0,AddressX|i); //确定要显示的页
LcdWriteComOrData(0,AddressY); //确定要显示的初始列,不能丢,很重要
for(j=0;j<64;j++)
LcdWriteComOrData(1, p[i<<1][j] ); //把i*2变成i<<1,乘法变成移位
}
CS1=1;CS2=0; //换右半屏显示
for(i=0;i<8;i++)
{
LcdWriteComOrData(0,AddressX|i); //page还从第0行开始
LcdWriteComOrData(0,AddressY);
for(j=0;j<64;j++)
LcdWriteComOrData(1, p[(i<<1)+1][j]);
};
}
//下面两个是重要的基础函数,如果不显示主要是这里有问题,看懂我的看看自己的程序哪里有问题。
static void LcdWriteComOrData(uchar x,uchar content)
{
LcdReadComBusy(); //检测忙标志
P0Data=content;
E=0; //按照HD44780/KS0066控制器的脉冲时序走
if(x==0){RS=0;RW=0; } //如果是0,选址程序寄存器写;这种程序结构来自于金鹏LCD
else {RS=1;RW=0; } //如果是1,选择数据寄存器写
E=1;
Delay1ms(1); //写程寄存器需要一段延时,执行也有延时。因为控制字写入之后,查书发现,执行至少需要40us,如果在E=1和0之间没有延时,程序不执行
E=0; //这行和上一行Delay1ms(1)交换后,发现检测不到了,原因就是以上的延时问题。
}
//************************************************************
static void LcdReadComBusy(void) //这种程序结构来自于网友大海橡树的程序
{
P0Data=0; //准备读忙标志,用的是P0口,所以可以直接放低就可以了,如果用其他口,Px不能直接写0,必须先写1才能读入外部信息
RS=0; //选择程序寄存器
RW=1; //读
E=1; //使能打开
while( P0Data & 0x80 ) ; //如果是忙P0data与0x80就不等于0,所以while语句总是执行。
E=0; //使能关闭
}
//***********************************************************
下面这个图是告诉你我是成功的,所以你不用怀疑我函数的正确性。
2018-03-24