微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > LPC2134学习日志 -- LCD12864学习

LPC2134学习日志 -- LCD12864学习

时间:11-21 来源:互联网 点击:
由于项目所需,所以这段时间,抽空学了一下LPC2134,它是基于ARM7核的微处理器,内部有128K的flash与16k的RAM,所以一般的处理程序,内部空间就够用了,当然你要上想在上面跑跑操作系统什么的,那就另当别论了。关于这个处理器其它方面的内部资料,如果你想了解,建议你好好翻翻它的数据手册,如果你说英文太难啃,网上有大把中文的资料,当然懒猫还是建议你看英文原版,一它是厂家的资料,比较真实可靠一般不会有什么大错,二你还可以凑这个空档学学英语,真学好了这也是你要工资的筹码。

今天只是实验一下它的IO端口功能,如何实验,懒猫就不再从流水灯开始了,懒猫选择从LCD12864开始,说实在看着这么大一块屏,挺吓人的,其实LCD也没有那么可怕,处理好时序就能让它乖乖的显示,所以想写好LCD12864的驱动首先还是要好好翻看它的数据手册,这里懒猫就不再详述数据手册上的内容了。不过在这里懒猫要先啰嗦一句,想让LCD12864正确显示,一定要记住先清屏,其实也就是清它内部寄存器,否则初始化时它内部的RAM中不知道是什么乱七八糟的东东,一旦你没有清屏,很可能在显示时会出现乱码或显示不正常,如下图所示:




图1-1 初始化时没有加清屏函数


其实懒猫在上大学时就试着用51写LCD12864的驱动程序,所以这次使用还算顺利,记得当时初次使用LCD12864出现这种情况,懒猫非常郁闷,以为自己的驱动程序没有写好,于是使劲翻看数据手册,仔细的看时序,最后还单步调试,发现问题还是没有解决,最后懒猫看到LCD12864中RAM时,突然想到单片机的设置变量时,初值也是随机的,于是就想着清一下RAM,结果问题还真解决了,呵呵,当时那个兴奋呀,无以言表。现在想想那时真的有点傻的可爱,网上有好多现成的程序,自己却一个人死扣自己的程序。可惜时光如梭,转眼间懒猫毕业就要两年了,那些激情燃烧的岁月已渐渐远去,却永远无法抹去我美好的记忆……


好了,不费话,说一说这次测试的电路,外围电路很简单,没有接什么东东,就接了一块LCD12864,2134的晶振是12MHz的,实时时钟频率是32.768KHz,下面给出仿真电路图,上面省略了很多东东,这次仿真用的是proteus7.5的版本,仿真不能代替实物,懒猫的程序都是通过实物测试通过的,仿真只是为了调试之用,如果你真想学到真本领,做项目是最好的途径。




图2 电路仿真


注意,这是仿真电路图,实际设计中要加上电源,晶振,电位器等部件,这个电路图只说明一下LCD与LPC2134的数据接口。


说一下程序,程序包括main.c与display.c两个C源程序代码,只是简单的测试一下lpc2134与LCD12864为后面的实验做一个铺垫,以后的实验可能会用到这个驱动,由于程序东东比较多,所以就只贴出display.c这个源程序,其它的程序在附件中,如果有兴趣可以下载下来查看:



//文件名称:display.c


//功 能:LCD12864驱动函数


//作 者:懒猫爱飞


//备 注:MCU -- LPC2134


// Crystal -- 12MHz


// RTC -- 32.768KHz


// 开发环境 -- RealView MDK-ARM Verxion 4.12



#define IN_DISPLAY



#include "config.h"


#include "display.h"



//LCD12864引脚配置


#define LCD_CS1 4


#define LCD_CS2 3


#define LCD_RST 5


#define LCD_DI 21


#define LCD_RW 11


#define LCD_EN 10



//LCD12864操作宏定义


#define LCD_DE() IO0SET |= 1


#define LCD_IE() IO0CLR |= 1


#define LCD_RE() IO0SET |= 1


#define LCD_WE() IO0CLR |= 1


#define LCD_EH() IO0SET |= 1


#define LCD_EL() IO0CLR |= 1




//LCD12864命令宏定义


#define LCDSTARROW 0xC0


#define LCDPAGE 0xB8


#define LCDLINE 0x40




void delay_us(uint32 us)


{


while(us--);


}




void Out_Data(uint8 Odata)


{


IO1CLR |= (uint32)(0xFF<16); // 将输出端口置0


IO1SET |= (uint32)(Odata<16); // 输出要输出的数据Odata


}




void Write_Data(uint8 Wdata)


{


LCD_DE(); // 写数据使能


delay_us(1); // 延时等待端口电平稳定


LCD_WE(); // 写命令使能


delay_us(1); // 延时等待数据写进端口寄存器


Out_Data(Wdata); // 输出要写入LCD12864的数据


delay_us(1); // 延时等待端口电平稳定


LCD_EH(); // 数据在EN下降沿写入LCD12864中


delay_us(3); // 延时


LCD_EL(); // EN下降沿


delay_us(3); // 延时一下


}




void Write_Cmd(uint8 Wcmd)


{


LCD_IE(); // 写命令使能


delay_us(1);


LCD_WE(); // 写命令使能


delay_us(1);


Out_Data(Wcmd); // 写入命令


delay_us(1);


LCD_EH(); // 数据在EN下降沿写入LCD12864中


delay_us(3);


LCD_EL(); // EN下降沿


delay_us(3);


}




void Init_LCDIO(void)


{


IO0DIR |= (1 // 初始端口方向

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top