基于LPC2138的VGS12864E程序设计
发布时间:2008/5/27 0:00:00 访问次数:705
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_c
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_c