无字库12864液晶(KS0108)和51单片机相连电路(用的单片机引脚最少)

无字库12864液晶(KS0108)和51单片机相连电路(用的单片机引脚最少),第1张

不建议你用外元件,你看看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液晶屏有无字库怎么识别等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9272124.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-26
下一篇 2023-04-26

发表评论

登录后才能评论

评论列表(0条)

保存