原创 基于LPC2138的VGS12864E程序设计

2008-8-5 23:30 3956 9 6 分类: MCU/ 嵌入式
引言


  ARM处理器凭借其强大的功能、极低的功耗、较小的封装广泛应用于门禁、无线抄表、智能温控等小型系统中,在这些系统中人机交互界面一般由LCD完成,但是通常LCD在显示亮度、环境适应等方面存在缺陷,所以越来越多新技术新产品逐渐出现,OLED就是一种。本文介绍了一种基于OLED的显示器VGS12864E的结构原理,给出了其在ARM7微处理器LPC2138系统应用中的硬件连接和具体程序设计。



系统简述


LPC2138简介


  LPC2138是基于支持实时仿真和嵌入式跟踪的32/16 位ARM7TDMI-S CPU 的微控制器,带有512 KB高速Flash和32KB的SRAM。128位宽度的存储器接口和独特的加速结构使32 位代码能够在最大时钟速率下运行。对代码规模有严格控制的应用可使用16 位Thumb模式将代码规模降低超过30%,而性能的损失却很小。



  LPC2138内含2个32位定时器、2个10位8路ADC、10位DAC、PWM通道和47个GPIO以及多达9个边沿或电平触发的外部中断,它还具有多个串口,包括2个16C550工业标准UART、2个高速I 2 C接口(400kbit/s)、SPITM和SSP(具有缓冲功能,数据长度可变)。



  较小的封装和极低的功耗使LPC2138可理想地用于工业控制和医疗等小型系统中,如访问控制和POS机、通信网关、协议转换器、软modem、声音辨别和低端成像等等。


VGS12864E结构原理


  VGS12864E是128列×64行点阵单色OLED图形字符显示模块,由于其采用有机发光技术,无需背光源,所以与传统LCD相比在阳光照射下更能呈现清晰的图像和数据,另外它还具有高亮度、高对比度、宽视角、低驱动电压和高发光效率等优越的特性,较宽的温度范围(存储温度:?30℃~80℃,工作温度:?20℃~70℃)也能适应更恶劣的环境。


VGS12864E使用两片列驱动控制器,分别驱动1-64列和65-128列和一片有64行输出的行驱动器,内藏64×64显示数据RAM,RAM中每位数据对应屏上一个点的亮、暗,其结构如图1所示:它把一个半屏分成了按行的八页,因为每个字节的数据按低位(LSB)在上,高 位(MSB)在下的结构排列,所以在提取字库的时候,需要设置取字模的方式为:纵向取模,字节倒序。



系统硬件结构


  VGS12864E共有20个引脚,功能定义如表2,它与LPC2138的连接如图2所示。尽管LPC2138的I/O口可以承受5V的输入电压,但是其输出的高电平电压不能驱动VGS12864,所以在它们中间需要加一个电平转换芯片。本系统电平转换采用IDT74FCT164245T芯片,它是基于高速CMOS技术的16位3.3V到5V的双向转换口(其中P1.28口负责数据方向的控制)。




程序设计


  对VGS12864E的各种操作都是通过其指令系统完成的,通过控制脚的高低电平和数据口的数据来完成各种操作。显示时一般需要设置列地址和页地址,然后进行相应的读写操作(在写操作前都要读“忙”状态),最后根据需要进行相应的循环。在同页内,列地址在执行完读写操作后自动加一。


本文程序有如下宏定义:


#define uint32 unsigned int


#define uint16 unsigned short


#define uchar unsigned char



#define DIS_DIR 1<<24 //P1.24


#define DIS_DI1<<28 //P0.28


#define DIS_RW1<<29 //P0.29


#define DIS_E1<<30 //P0.30


#define DIS_CS21<<31 //P0.31


#define DIS_CS11<<16 //P1.16


读“忙”状子程序


  在对VGS12864E的各种写操作执行之前都需要进行读“忙”操作,防止在“忙”状态下“写”操作的不正确执行,程序代码如下:


void read_status()


{ uchar busy;


uchar temp;



IOCLR0 = DIS_DI; //选择"指令"寄存器


IOSET0 = DIS_RW; //选择"读"操作


IOCLR1 = DIS_DIR; //控制电平转换方向


do


{ IOPIN0 = (IOPIN0 & 0xFFFFFF00) | 0xff;


IOSET0 = DIS_E;


busy=(IOPIN0 & 0xff);


IOCLR0 = DIS_E; //使能操作


temp=busy & 0x80;


}while(temp!=0); //忙则继续循环


IOSET1 = DIS_DIR; //控制电平转换方向


}


写指令子程序


// 对左半屏写指令操作,右半屏操作只需要改变片选电平(DIS_CS1、DIS_CS2)


void wr_command1()


{


IOCLR1 = DIS_CS1; //选择左半屏


IOSET0 = DIS_CS2;


read_status(); //读"忙"状态


IOSET0 = DIS_DI; //选择"写"操作


IOCLR0 = DIS_RW; //选择"指令"寄存器


IOPIN0 = (IOPIN0 & 0xFFFFFF00) | com; //送指令


IOSET0 = DIS_E; //使能操作


IOCLR0 = DIS_E;


}


写数据子程序


//对左半屏写数据操作,右半屏操作只需要改变片选电平(DIS_CS1、DIS_CS2)


void wr_data1()


{


IOCLR1 = DIS_CS1; //选择左半屏


IOSET0 = DIS_CS2;


read_status(); //读"忙"状态


IOSET0 = DIS_DI; //选择"写"操作


IOCLR0 = DIS_RW; //选择"数据"寄存器


IOPIN0 = (IOPIN0 & 0xFFFFFF00) | dat;//送数据


IOSET0 = DIS_E; //使能操作


IOCLR0 = DIS_E;


}


其他子程序


//OLED初始化子程序


void init_OLED()


{


com =0xc0; //第"0"行开始显示


wr_command1();


wr_command2();


com =0x3f; //打开OLED显示


wr_command1();


wr_command2();


}


//清屏程序


void clear_prog(void)


{


for(i=0;i<8;i++)


{


com =(0xb8+i); //页面地址设置


wr_command1(); wr_command2();


com =0x40; //列地址设置


wr_command1();


wr_command2();


for(j=0;j<64;j++)//在一页内,列地址自动增加


{


dat=0x00;


wr_data1();//写RAM都为0,这样完成清屏


}


}


}



//汉字显示标准函数:把屏幕分成0,1,2,3四行和64列进行汉字的显示,每个汉字占两//行,字库数据通过指针进行传递


void display(uchar hang,uchar lie,uchar *p_dis_data)


{


for(page=hang;page<hang+2;page++)


{


uchar m;


com=(0xb8 + page); //页面地址设置


wr_command1();


com=0x40+lie; //列地址设置


wr_command1();


f or(m=0;m<64;m++)//显示大小根据实际情况 进行改变 {


dat=*p_dis_data;


wr_data1();


p_dis_data++;


}


}


}



 

文章评论1条评论)

登录后参与讨论

用户461316 2008-8-5 23:33

结束语   VGS12864E使用简单,而且相对LCD可以适应恶劣的环境,所以在工业控制、军事等方面都有广泛应用。由于需要通过字模软件设计界面,增强设计灵活性的同时也提高了设计复杂界面的难度,而且生成字库需要占用大量存储空间。而LPC2138是基于ARM7核心的微控制器,配合VGS12864E可以组成非常通用的小型显示控制系统。
相关推荐阅读
用户461316 2009-08-17 17:57
Zigbee星型网络组网程序段
最近一直在做Zigbee的星型网络的组网试验,由于时间的原因,现在只是在最高的应用层上来编写程序。即协议栈的程序是2430的开发商(无限龙)编写的,我只是调用相应的函数来完成组网的,星型网络组网部分的...
用户461316 2009-08-17 17:14
VB6的标题栏使用上真彩色图标
模块 ModIcon.Bas 代码: Option Explicit Private Declare Function DrawIcon Lib "user32" (ByVal hdc As Long...
用户461316 2009-08-17 16:58
AppendToLog一个API方式存取日志文件的模块
'**************************************' 模块名称: AppendToLog' 功能描述:一个很不错的日志文件写入模块,不同于'     open/print/...
用户461316 2009-08-17 16:57
(VB自定义函数)去除字符串中的空格
'去除字符串中的空格(方法一)Public Function DelBlank(SearchString As String)   DelBlank = Replace(SearchString, C...
用户461316 2009-08-17 16:56
(VB自定义函数)对任意输入的汉字,可以得到它的拼音的第一个字母
调用方法:Command1.Caption = getHzPy("你")'//函数入口为汉字串,返回值为该汉字的第一个字母Public Function getHzPy(hzStr As String...
用户461316 2009-08-17 16:54
VB_代码执行速度测试
'**************************************'Windows API/Global Declarations for :[ '     A Simple] code ...
我要评论
1
9
关闭 站长推荐上一条 /2 下一条