LCD12864串行与并行的比较分析

LCD12864的通讯方式是串行、并口可选的,那么这两种有什么区别呢?

1)串行有查忙,需要加延时,否则会出现乱码;并行没有查忙,可以不用延时,但是反应慢。

2)串行速度相对较慢,但是占用的I/O口少;并行相对速度快,但是占用的I/O口多,需要8+3条I/O口。

3)串行CS要特殊处理一下.控制起来比较耗时占用单片机资源多,当然也有些小技巧解决,如在CS拉低以后要重新工作必须执行0x30指令(默认第一次上电是执行基本指令集的,在片选为0,以后再次选中则需要执行这个指令所以我的光标闪烁指令才能生效),以及在使用总线对其进行驱动的时候,并不是每次通信结束后都需要让CS置零。而并口读写快,特别适合图形方式。
因为我偏好用串行的方法,所以我就写出串行的相关功能代码:

/*****************************************
*文件名:LCD12864.c
*描述:该程序实现了LCD12864以串行的方式进行通信
*创建人:Echo
******************************************/
#include "LCD12864.h"

/******************************************
*名称:LCD12864_Send_Byte()
*功能:按照液晶的串口通信协议,发送数据
*输入:zdata
*输出:无
*******************************************/

void LCD12864_Send_Byte(unsigned char zdata)
{
	  unsigned int i;
	  for(i = 0;i < 8;i++)
    {
			  if((zdata << i) & 0x80)
				{
					  SID = 1;
				}
				else
				{
					  SID = 0;
				}
				SCLK = 0;
				SCLK = 1;
		}
}

/****************************************
*名称:LCD12864_Write_Com()
*功能:写串口指令
*输入:cmdcode
*输出:无
******************************************/

void LCD12864_Write_Com(unsigned char cmdcode)
{
	  CS = 1;
	  LCD12864_Send_Byte(0xf8);
	  LCD12864_Send_Byte(cmdcode & 0xf0);
	  LCD12864_Send_Byte((cmdcode << 4) & 0xf0);
	  delay_us(200);
}

/*****************************************
*功能:lcdinit()
*功能:初始化函数
*输入:cmdcode
*输出:无
*****************************************/

void lcdinit()
{
	  RST = 0;
	  delay_ms(20);
	  RST = 1;
	  delay_s(4);
	  LCD12864_Write_Com(0x30);
	  delay_ms(10);
	  LCD12864_Write_Com(0x0c);
	  delay_ms(10);
}


/****************************************
*名称:LCD12864_Write_Data()
*功能:写数据
*输入:cmdcode
*输出:无
******************************************/

void LCD12864_Write_Data(unsigned char Dispdata)
{
	  CS = 1;
	  LCD12864_Send_Byte(0xfa);
	  LCD12864_Send_Byte(Dispdata & 0xf0);
	  LCD12864_Send_Byte((Dispdata << 4) & 0xf0);
	  delay_us(200);
}

/****************************************
*名称:LCD12864_Dis_String()
*功能:显示字符串
*输入:*s
*输出:无
*****************************************/

void LCD12864_Dis_String(unsigned char code *s)
{
	  while(*s > 0)
		{
			  LCD12864_Write_Data(*s);
			  s++;
			  delay_ms(10);
		}
}

/******************************************
*名称:LCD12864_Dis_Err()
*功能:显示错误提示
*输入:无
*输出:无
******************************************/

void LCD12864_Dis_Err(void)
{
	  LCD12864_Write_Com(0x03);
	  delay_ms(10);
	  LCD12864_Write_Com(0x81);
	  LCD12864_Dis_String("Err");
}


你可能感兴趣的:(LCD12864,串行,并行,区别,代码,C51)