本帖最后由 飞宇 于 2016-9-13 23:24 编辑
1. 开发板和硬件模块硬件连接 解释程序之前,先说明一下开发板和LCD12864液晶模块之间的连接,这样方便我们理解程序。 开发板和LCD12864液晶模块之间的接口使用8位并行接口,可读、可写、处理速度也快。详细的描述如下表所示: 2. 读写程序编写
2.1. 读写时序
编写液晶模块驱动之前,需要先了解一下液晶模块的读写时序,下图是液晶模块的8位并行读写时序,从时序图中,可以看到读写液晶模块时对各个信号的要求。
图1:液晶模块8位并行时序
2.2. 读/写液晶模块
液晶模块的驱动程序中,有3种最基本的操作:
1) 读。
2) 写。写分为写数据和写指令,可以用两个函数来实现,也可以放在一个函数中实现,本文中是使用两个函数实现的。
3) 判忙。
其他的如显示字符、图形等函数都以此为基础。
判忙函数程序清单:
- /********************************************************************
- * 描 述 : LCD12864液晶判忙程序。如LCD为“忙”状态,一直等待直到LCD空闲
- * 参 数 : 无
- * 返回值 : 无
- ********************************************************************/
- void Busy(void)
- {
- uchar busy;
-
- do
- {
- RW = 1; RS = 0; //读
- E = 1; //使能液晶模块.0=关闭使能端,1=打开使能端
- P2M0=0x00;
- P2M1=0x00; //设置P2.0~P2.7为准双向口
- busy=P2; //读取P2状态
- delay(1);
- E = 0; //关闭液晶模块使能端.0=关闭使能端,1=打开使能端
- }while(busy&0x80); //判断BUSY位是否工作:1=内部在工作,0=空闲
- }
复制代码
- /********************************************************************
- * 描 述 : LCD12864液晶模块从当前地址读RAM数据。
- * 参 数 : 无
- * 返回值 : Dat:读取的数据
- ********************************************************************/
- uchar ReadDat(void)
- {
- uchar Dat;
-
- P2 = 0xff;
- Busy(); //判忙
-
- RW = 1;RS = 1; //读
- E = 1; //使能液晶模块.0=关闭使能端,1=打开使能端
- Dat=P2; //保存读取的数据
- delay(1);
- E = 0; //关闭液晶模块使能端.0=关闭使能端,1=打开使能端
- return Dat;
- }
复制代码
- /***************************************************************************
- * 描 述 : LCD12864液晶命令写入
- * 参 数 : cmd[in]:写入的命令
- * 返回值 : 无
- **************************************************************************/
- void Write_Cmd(uchar cmd)
- {
- Busy(); //判忙
-
- RW=0; RS=0; //写指令
- P2M1 = 0;
- P2M0 = 0xff; //设置P2.0~P2.7为推挽输出
- P2=cmd; //写入命令
-
- E=1; //使能液晶模块.0=关闭使能端,1=打开使能端
- delay(1);
- E=0; //关闭液晶模块使能端.0=关闭使能端,1=打开使能端
- }
复制代码
- /***************************************************************************
- * 描 述 : LCD12864液晶数据写入
- * 参 数 : dat[in]:写入的数据
- * 返回值 : 无
- **************************************************************************/
- void Write_Data(uchar dat)
- {
- Busy(); //判忙
- RW=0;RS=1; //写数据
-
- P2M1 = 0;
- P2M0 = 0xff; //设置P2.0~P2.7为推挽输出
- P2=dat; //写入数据
-
- E =1; //使能液晶模块
- delay(1);
- E =0; //关闭液晶模块使能端
- }
复制代码 |