ly51s单片机开发板做的 12864液晶显示原理和C程序每一句都是什么意思,请高手教教我~感激不尽QQ174649050

头文件略-----------------
程序段1:(这些位定义都有什么用??)
sbit RS = P2^4;
sbit RW = P2^5;
sbit E = P2^6;
sbit RES = P2^3;
sbit PSB = P2^1;
sbit PAUSE = P3^0;
延时子程序略-------------------
程序段2:(忙位检测是什么原理,为什么要有这段程序??)
void Check_Busy() //忙位检测
{
RS=0;
RW=1;
E=1;
DataPort=0xff;
while((DataPort&0x80)==0x80);//忙则等待???
E=0;
}
程序段3:(为什么要有写命令,写数据,都是什么意思)
void Write_order(unsigned char order) // 写命令
{
Check_Busy();
RS=0;
RW=0;
E=1;
DataPort=order;
DelayUs2x(5);
E=0;
DelayUs2x(5);
}
void Write_Data(unsigned char Data) //写数据
{
Check_Busy();
RS=1;
RW=0;
E=1;
DataPort=Data;
DelayUs2x(5);
E=0;
DelayUs2x(5);
}
程序段4:(如何实现所谓的初始化的??)
void Init_ST7920() //屏幕初始化
{
DelayMs(40);
PSB=1; //设置为8BIT并口工作模式
DelayMs(1);
RES=0; //复位
DelayMs(1);
RES=1; //复位置高
DelayMs(10);
Write_order(0x30); //选择基本指令集
DelayUs2x(50);
Write_order(0x30); //选择8bit数据流
DelayUs2x(20);
Write_order(0x0c); //开显示(无游标、不反白)
DelayUs2x(50);
Write_order(0x01); //清除显示,并且设定地址指针为00H
DelayMs(15);
Write_order(0x06); //指定在资料的读取及写入时,设定游标的移动方向及指定显示的移位,光标从右向左加1位移动
DelayUs2x(50);
}
程序段5:(定义格式是什么原理实现的?)
void Admin() //自定义显示的字符 格式
{
int i;
Write_order(0x30);
Write_order(0x40);
for(i=0;i<16;i++)
{
Write_Data(user16x16[i*2]);
Write_Data(user16x16[i*2+1]);
}
}
程序段6:(x,y的坐标是如何产生的?为什么这么定义)
void DisplayAdmin(unsigned char x,unsigned char y) // 显示用户自定义字符
{
switch(y)
{
case 1: Write_order(0x80+x);break;
case 2: Write_order(0x90+x);break;
case 3: Write_order(0x88+x);break;
case 4: Write_order(0x98+x);break;
default:break;
}
Write_Data(00);
Write_Data(00);

}
while(*s>0)
{
Write_Data(*s);
s++;
DelayUs2x(50);
}
}

程序段7:(为何要分上,下屏显示??)
//显示图片
void LCD_PutGraphic(unsigned char code *img)
{
int i,j;
//显示上半屏内容设置
for(i=0;i<32;i++)
{
Write_order(0x80 + i); //SET 垂直地址 VERTICAL ADD
Write_order(0x80); //SET 水平地址 HORIZONTAL ADD
for(j=0;j<16;j++)
{
Write_Data(*img);
img++;
}
}
//显示下半屏内容设置
for(i=0;i<32;i++)
{
Write_order(0x80 + i); //SET 垂直地址 VERTICAL ADD
Write_order(0x88); //SET 水平地址 HORIZONTAL ADD
for(j=0;j<16;j++)
{
Write_Data(*img);
img++;
}
}

主程序(略)------------

段1:为这些引脚号起个有实际含义别名,有助于阅读程序,可以理解为#define Name P2^4

段2:检测液晶是否正忙,能否接受指令,等待液晶不忙时退出函数,下面就可以发送指令了

段3:命令是用来控制液晶的,例如清除显示内容,查询液晶状态等等,数据是用来显示的编码,类似于数码管的显示码,具体字符的编码要查手册。准确地说,数据也是通过命令的形式传进液晶的。

段4:通过各种指令进行初始化。液晶“模块”相当于单片机+“屏幕”,类似于启动开机步骤。
包括:设置工作方式,如串行或并行方式
复位,先置复位脚低,再置高
选择指令集,告诉液晶如何把指令翻译正具体操作,具体指令手册上有
数据流,指令通过什么样的信号传输,如8位并行,4位并行,串行
开显示,打开屏幕,之前的操作在屏幕上都是看不到的,都是内部操作
清除显示,清显示缓冲区,就是模块内存放显示内容编码一内存
游标等,控制当标位置,类比于windows的文本编辑,那个闪烁的光标是可以用鼠标、键盘控制的

段5:模块本身内置了常用标准字符的编码,就是字符格式,或称之为字库。平时使用只要输入比如说ascii码至模块,模块会自动转换为具体的点阵编码;此外还可以自定义部分非标准编码,其字符格式(即点阵)需要自己编,比如一个8*16点阵共128点,哪些点亮哪些点灭由1bit二进制数表示,共16字节,16*16点阵就是32字节,按照液晶模块规定的顺序,发送至模块自定义区(有专用指令),之后就可以像使用内置字库一样使用了,而不用每次传输16或32字节。

段6:x y不能理解为坐标。编写者懒得命名了。具体要看怎么调用的,x应该是把一个大区域分成小区域的编号,y是小区域内部的编号

段7:好像是由液晶内部地址排列规则决定的。从地址上看,12864应该是两组6464拼起来的,所以水平地址不同,相当于片选信号不同。
温馨提示:内容为网友见解,仅供参考
第1个回答  2012-03-16
1,位定义是因为单片机头文件内之定义了如P1的形式,而为定义P1^1的形式,如果不定义,程序中无法使用P1^1,
2忙检测主要是因为芯片的速度低于单片机,如单片机发送abc,有可能芯片只接收到a,所以要先判忙,不忙时再给值
3写命令是写寄存器,写数据当然就是写数据啦
至于你所说的为何要分屏,这是因为12864本身就是这样设计的,他有两个引脚用于分屏,
初始化你要参考芯片资料了,看看哪些位置高,哪些位拉低,或者哪些位需要上升沿或下降沿
相似回答
大家正在搜