不建议你用外元件,你看看KS1080的信号,数据线D0-D7是双向的,因此,无法用外芯片来扩展,而那些个选通信号,复位信号,读写信号,数据/指令信号,虽然是输入的,但是,你考虑一下,用译码器扩展的时候,你会发现你用到单片机引脚几乎没有什么减少,如果你一定要扩展,建议你,用个74595,去对付那些选通信号,复位信号,读写信号,数据/指令信号吧,这样可以节省大概三个引脚吧,不过程序处理就比较麻烦了。
我怀疑你根本就没开显示。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] ); //把i2变成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; //使能关闭
}
//
下面这个图是告诉你我是成功的,所以你不用怀疑我函数的正确性。
根据网上关于CF12864-3的信息,它应该不带中文字库
你换的话,驱动模块应该一致才好,程序是根据驱动模块不一样区分的
图形点阵液晶模块,为12864Dots,显示4行,8个1616点的汉字/行。其外型尺寸为:7870mm,视阈尺寸为:6244mm。显示类型为:STN,黄绿膜,灰膜。模块带LED背光。1/64Duty,1/9Bias。8bit I/O。6点钟视角。5V电压驱动。
既然各个供应商都没有写带中文字库,它就是不带的,不可能说它不带中文字库还强调一下:"我不带中文字库!"带的话会写上"带中文字库"因为带字库的要贵一些你买的时候如果找不到一样的就买驱动,管脚,尺寸一样就可以了
/////////////////////////////////////////////////////////////////////////////////
//基于arduino 平台的KS0180芯片12864并口显示LCD测试程序by 王瑾 2014/9/27
//程序较大使用小RAM芯片可能无法运行,如无法运行可将调用logo部分删除,会大幅减小RAM使用
//因为uno 坏了只在mega 2560测试成功
//和ST7920芯片主要是RAM地址的分布不同注意分析RAM地址写程序
//程序没有采用库文件,显示程序也没有另写子程序,主要是为了个人修改方便
//////////////////////////////////////////////////////////////////////////////
//
int CS1=A0;//左半屏,高电平有效
int CS2=A1;//右半屏,高电平有效
int RS = 12;
int RW = 11;
int DB[] = {3, 4, 5, 6, 7, 8, 9, 10};//使用数组来定义总线需要的管脚DB 0-7
int Enable = 2;
/////////////////////////////////////////////////////////////////////////
// Bitmap点阵数据表 //
// 内容为:南京舟芯电子,TEL025-66085988 //
// 尺寸: 128 64 //
/////////////////////////////////////////////////////////////////////////
unsigned char logo1[] =
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
};
////////////////////////////////////////////////////////
//写命令子程序
///////////////////////////////////////////////////////
void LcdCommandWrite(int value) {
digitalWrite(RS, 0);
digitalWrite(RW, 0);
int i = 0;
for (i=3; i <= 10; i++) //总线赋值
{
digitalWrite(i,value & 01);//value与0001相与赋予i
value >>= 1;//value右移一位
}
digitalWrite(Enable,1);
delayMicroseconds(1);
digitalWrite(Enable,LOW);
delayMicroseconds(1);
}
//////////////////////////////////////////////////////
//写数据子程序
/////////////////////////////////////////////////////
void LcdDataWrite(int value) {
// 定义所有引脚
int i = 0;
digitalWrite(RS, 1);
digitalWrite(RW, 0);
//digitalWrite(DI, HIGH);
//digitalWrite(RW, LOW);
for (i=DB[0]; i <= DB[7]; i++) {
digitalWrite(i,value & 01);
value >>= 1;
}
digitalWrite(Enable,HIGH);
delayMicroseconds(1);
digitalWrite(Enable,LOW);
delayMicroseconds(1); // 延时百万分之一秒
}
///////////////////////////////////////////////////
//输出引脚声明
//////////////////////////////////////////////////
void setup (void) {
int i = 0;
for (i=Enable; i <= 12; i++) {
pinMode(i,OUTPUT);
}
pinMode(A0,OUTPUT);
pinMode(A1,OUTPUT);
}
////////////////////////////////////////////
//循环主程序
/////////////////////////////////////////////////
void loop (void) {
///////////////////////////////////////////////////////////////////////////////////////////
//初始化,因为KS0108芯片无初始化命令需要对整个屏幕赋值0x00, 不然的话会有杂点
//没有查到KS0108芯片的始化命令,位图调用一直有杂点,采用REST复位也不能解决,所以采用此方法
//////////////////////////////////////////////////////////////////////////////////////////
digitalWrite(CS1,1);
digitalWrite(CS2,1);
LcdCommandWrite(0x3e); // 显示关
int i = 0;
int yg,x,y;
int temp;
int tmp;
for(yg=0;yg<8;yg++)
{
x=yg+0xb8; //0xb8为首页地址
y=0x40; //0x40为首列地址注意分析规格书RAM地址分布图
LcdCommandWrite(x); //写入y轴坐标
LcdCommandWrite(y); //写入x轴坐标
tmp=yg64;
for(i=0;i<64;i++)
{
LcdDataWrite(0x00);
tmp++;
}
}
LcdCommandWrite(0x3f); //显示图象
delay(1);
//////////////////////////////////////////////////////////
//显示ZXET logo
///////////////////////////////////////////////////////////
digitalWrite(CS1,1); //先显示左半屏
digitalWrite(CS2,0);
for(yg=0;yg<8;yg++)
{
x=yg+0xb8;
y=0x40;
LcdCommandWrite(x); //写入y轴坐标
LcdCommandWrite(y); //写入x轴坐标
tmp=2yg64;
for(i=0;i<64;i++)
{
LcdDataWrite(logo[tmp]);
tmp++;
}
}
LcdCommandWrite(0x3f); //此处无需延迟直接接右半屏显示程序
////////////////////////
digitalWrite(CS1,0); //显示右半屏
digitalWrite(CS2,1);
for(yg=0;yg<8;yg++)
{
x=yg+0xb8;
y=0x40;
LcdCommandWrite(x); //写入y轴坐标
LcdCommandWrite(y); //写入x轴坐标
tmp=(2yg+1)64;
for(i=0;i<64;i++)
{
LcdDataWrite(logo[tmp]);
tmp++;
}
}
LcdCommandWrite(0x3f);
delay(3000);
///////////////////////////////////////////////////////////////
//显示 文字,依然采用位图数据调用,KS0108无字库只能采用这种办法
///////////////////////////////////////////////////////////////
digitalWrite(CS1,1);
digitalWrite(CS2,0);
for(yg=0;yg<8;yg++)
{
x=yg+0xb8;
y=0x40;
LcdCommandWrite(x); //写入y轴坐标
LcdCommandWrite(y); //写入x轴坐标
tmp=2yg64;
for(i=0;i<64;i++)
{
LcdDataWrite(logo1[tmp]);
tmp++;
}
}
LcdCommandWrite(0x3f);
//////////////////////////////////////
digitalWrite(CS1,0);
digitalWrite(CS2,1);
for(yg=0;yg<8;yg++)
{
x=yg+0xb8;
y=0x40;
LcdCommandWrite(x); //写入y轴坐标
LcdCommandWrite(y); //写入x轴坐标
tmp=(2yg+1)64;
for(i=0;i<64;i++)
{
LcdDataWrite(logo1[tmp]);
tmp++;
}
}
LcdCommandWrite(0x3f);
delay(3000);
///////////////////////////////////////////////////////
//测试画面 :全黑
////////////////////////////////////////////////////////
digitalWrite(CS1,1);
digitalWrite(CS2,1);
for(yg=0;yg<8;yg++)
{
x=yg+0xb8;
y=0x40;
LcdCommandWrite(x); //写入y轴坐标
LcdCommandWrite(y); //写入x轴坐标
for(i=0;i<64;i++)
{
LcdDataWrite(0xFF);
}
}
LcdCommandWrite(0x3f);
delay(3000);
///////////////////////////////////////////////////////
//测试画面 :全白
////////////////////////////////////////////////////////
digitalWrite(CS1,1);
digitalWrite(CS2,1);
for(yg=0;yg<8;yg++)
{
x=yg+0xb8;
y=0x40;
LcdCommandWrite(x); //写入y轴坐标
LcdCommandWrite(y); //写入x轴坐标
for(i=0;i<64;i++)
{
LcdDataWrite(0x00);
}
}
LcdCommandWrite(0x3f);
delay(3000);
///////////////////////////////////////////////////////
//测试画面 :数条纹
////////////////////////////////////////////////////////
digitalWrite(CS1,1);
digitalWrite(CS2,1);
for(yg=0;yg<8;yg++)
{
x=yg+0xb8;
for(i=0;i<32;i++)
{
y=0x40+2i;
LcdCommandWrite(x); //写入y轴坐标
LcdCommandWrite(y); //写入x轴坐标
LcdDataWrite(0xFF);
}
}
LcdCommandWrite(0x3f);
delay(3000);
}
切换屏幕的时候要先清屏,然后在延时一小段的时间,向12864里写数据时也最好有一定的延时,否则12864可能会出现错误的 *** 作,我以前用带字库的时候,一个屏幕和另一个屏幕切换时如果不清屏加延时也容易出错,你可以试试
以上就是关于无字库12864液晶(KS0108)和51单片机相连电路(用的单片机引脚最少)全部的内容,包括:无字库12864液晶(KS0108)和51单片机相连电路(用的单片机引脚最少)、proteus仿真LCD12864,屏幕一直为黑,找不到原因,高分求解、12864液晶屏有无字库怎么识别等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)