| LCD12864的通讯方式是串行、并口可选的,那么这两种有什么区别呢? 1)串行有查忙,需要加延时,否则会出现乱码;并行没有查忙,可以不用延时,但是反应慢。 2)串行速度相对较慢,但是占用的I/O口少;并行相对速度快,但是占用的I/O口多,需要8+3条I/O口。 3)串行CS要特殊处理一下.控制起来比较耗时占用单片机资源多,当然也有些小技巧解决,如在CS拉低以后要重新工作必须执行0x30指令(默认第一次上电是执行基本指令集的,在片选为0,以后再次选中则需要执行这个指令所以我的光标闪烁指令才能生效),以及在使用总线对其进行驱动的时候,并不是每次通信结束后都需要让CS置零。而并口读写快,特别适合图形方式。[objc] view plain copy因为我偏好用串行的方法,所以我就写出串行的相关功能代码:
 
   
 
 /***************************************** *文件名: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");  }  
 
 
 |