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