打印

【转】 LCD12864串行与并行的比较分析

[复制链接]
645|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主

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");  
  • }  



相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

51

主题

81

帖子

1

粉丝