关键词:OLED SSD1303 ARM 陀螺仪 陀螺经纬仪通过敏感地球自转的水平分量来测定仪器架设点真北方位的精密仪器,工作情况类似于电子经纬仪,所不同的是电子经纬仪只能测定两个目标的相对夹角,而陀螺经纬仪不仅可以测定目标之间的相对夹角,而且可以测定目标与地理北或真北方位之间的夹角。仪器工作通常在野外进行,环境条件较为恶劣。以前显示部分用液晶实现,带来的问题是除重量和体积外,低温靠加热实现,功耗大,野外作业对电池要求较高。另一个问题是采取任何措施,都无法解决太阳照射下,液晶显示不清楚这个问题,这是由于液晶显示自身特性决定的。 OLED 在显示信息方面有许多吸引人的特点。OLED 无LCD 的视角问题,可提供全视角显示。由于OLED 具有能自发光的特点,在亮度上也比LCD 高得多,也不像LCD 需要背光源,所以不仅提高了电源的有效功率,功耗只有LCD 的一半,而且器件厚度也比LCD 薄。OLED 响应时间比典型LCD 快一千倍。所以,它具有高效率、高对比度、宽视角、工作电压低等优点[1 -2]。台湾铼宝公司生产的内嵌SSD1303驱动芯片的超薄OLED显示屏P09703点阵数128X64,厚度仅2.05毫米,重量仅11.1克,工作温度-40℃到+85℃。在陀螺经纬仪上选用该产品,很好的解决了显示问题。下面重点讨论电路设计的实现问题。 1 SSD1303简介 目前,主要有Solomon 公司和美国的Clare公司等几家公司生产OLED 驱动IC。Solomon 投入市场的SSD1303,是一枚把行驱动、列驱动和控制器集成为一体的OLED 驱动器芯片。这个驱动器为132 × 64点阵OLED 图形显示而设计的,包括行驱动器、列驱动器、电流参考发生器、对比度控制、振荡器和几个MCU 接口模式。工作逻辑电压2.4V~3.5V,具有丰富的软件功能,支持4种颜色选择和每种颜色64级控制,它的软件对比度具有256级控制,内嵌的132 × 64 bit 的图形动态随机存储器( GDDRAM),提供了行remapping、列remapping、垂直滚动和部分显示功能。使该驱动器适合于不同像素尺寸和颜色的多种OLED 显示。 2 P09703与LPC2131的硬件连接 LPC2100/lLPC2105/LPC2106 系列微控制器是飞利浦半导体推出的基于16/32 位ARM7TDMI-S CPU,并带有128/256 k字节(kB)嵌入的高速Flash存储器的微控制器,128位宽度的存储器接口和独特的加速结构使32位代码能够在最大时钟速率下运行。对代码规模有严格控制的应用可使用16 位Thumb 模式将代码规模降低超过30%,而性能的损失却很小。由于LPC2100/lLPC2105/LPC2106系列微控制器采用非常小的64脚封装、极低的功耗、多个32位定时器、4路10位ADC PWM 输出以及多达9个外部中断,这使它们特别适用于工业控制、医疗系统、访问控制和电子收款机(POS)等应用领域。因为LPC2100系列微控制器没有外部总线控制器,所以它们外接扩展芯片不是很方便。不过,因为它们的速度很快,所以即使使用软件模拟总线外接扩展芯片也比普通的80c51快得多,而丰富的片内资源也不是普通51能够比拟的。 鉴于P09703与P09702具有相同的图形显示控制器SSD1303,而P09702硬件接口适合试验连接,下面以P09702与LPC2131为例进行说明,由于OLED显示屏P09702的逻辑电平为2.4V - 3.5V,我们选用PHILIPS公司生产的基于ARM7TDMI-S、单电源供电的微控制器LPC2131作为控制器,图一给出了包括电源、时钟、复位等一个嵌入式处理系统正常工作的最小电路外,电源电路提供模拟3.3V和数字3.3V,以提高系统工作稳定性。同时绘制了P09702与LPC2131的硬件连接方式。 在与计算机连接方面,SSD1303的接口,包括数据输入缓存器、数据输出锁存器,指令寄存器及译码器,忙状态触发器以及时序控制电路等,具有高性能的接口控制电路。计算机可以随时访问SSD1303而不需要判断其当前状态,与以前用的以T6963C控制器不同,SSD1303判断忙状态在操作上不是那么重要,因为SSD1303的接口部能够适时地接收计算机的访问。只是在计算机对显示存储器大量的数据传输时与控制部向驱动部传输显示数据相冲突,会在显示屏上出现“雪花”。但是由于这个间隙时间很短,加上人眼在视觉上的惰性而看不出“雪花”现象,有时判断忙标志再进行显示数据传输时,忙标志已经消失了。正是由于这些,计算机访问SSD1303的操作流程非常简单。但要注意的是SSD1303的接口控制电路内有几套时序电路以适配不同计算机操作时序的要求。时序适配电路的设置端为BS0,BS1,BS2。在P09703中选择BS1和BS2不同的连接,以确定选择Intel8080时序还是M6800时序。在P09702中由于没有BS1和BS2的选择,出厂时已经设置为Intel8080时序,所以下面的程序为Intel8080时序。 #define AD0_PIN_NUM8 //8位数据总线 #define DC_PIN_NUM 5 //P0.5 数据/指令控制位,低电平—指令操作,高电平—数据操作 #define WR_PIN_NUM 6 //P0.6 写数据/指令控制位,高电平变低电平时写入 #define RD_PIN_NUM 7 //P0.7 读数据/指令控制位,低电平有效 #define CS_PIN_NUM 16 //P0.16 使能位,低电平有效 void ExBusInit(void)//初始化P09702OLED显示屏总线 {uint32 temp; // 设置引脚连接模块:DC_PIN_NUM、WR_PIN_NUM、RD_PIN_NUM、CS_PIN_NUM、 AD0_PIN_NUM为GPIO PINSEL0 &= ~(3 << (2 * DC_PIN_NUM)); PINSEL0 &= ~(3 << (2 * WR_PIN_NUM)); PINSEL0 &= ~(3 << (2 * RD_PIN_NUM)); PINSEL0 &= ~(3 << (2 * (CS_PIN_NUM-16))); for (temp= AD0_PIN_NUM; temp < 16; temp++){ PINSEL0 &= ~(3 << (2 *temp)); } // 设置引脚方向,所有相关引脚为输出 temp = 0xff << AD0_PIN_NUM; IODIR = IODIR | temp; IODIR = IODIR | (1 << WR_PIN_NUM) | (1 << RD_PIN_NUM) | (1 << DC_PIN_NUM) | (1 << CS_PIN_NUM); // 设置引脚输出值,除CS_PIN_NUM输出为低电平外,其余均为高电平 IOCLR = (1 << CS_PIN_NUM); IOSET = (1 << DC_PIN_NUM) | (1 << WR_PIN_NUM) | (1 << RD_PIN_NUM); temp = 0xff << AD0_PIN_NUM; IOSET = IOSET | temp; } uint8 ReadData(void) //从P09702OLED显示屏读取数据 { uint32 temp,temp1; temp1 = IODIR; IODIR = temp1 & (~(0xff << AD0_PIN_NUM)); // 设置AD0_PIN_NUM为输入 IOCLR = 1 << RD_PIN_NUM; temp = IOPIN; IOSET = 1 << RD_PIN_NUM; IODIR = temp1 | (0xff << AD0_PIN_NUM); temp = temp >> AD0_PIN_NUM; return (uint8) temp; } void WriteCommand(uint8 Data) //写指令代码到P09702OLED显示屏 { IOCLR = 1 << DC_PIN_NUM; IOSET = Data << AD0_PIN_NUM; Data = ~Data; IOCLR = Data << AD0_PIN_NUM; IOCLR = 1 << WR_PIN_NUM; IOSET = 1 << WR_PIN_NUM; IOSET = 1 << DC_PIN_NUM; } void WriteData(uint8 Data) //写参数及数据到P09702OLED显示屏 { IOSET = Data << AD0_PIN_NUM; Data = ~Data; IOCLR = Data << AD0_PIN_NUM; IOCLR = 1 << WR_PIN_NUM; IOSET = 1 << WR_PIN_NUM; } main(){ int j, i; ExBusInit(); //初始化P09702OLED显示屏总线 InitOled();//初始化P09702OLED显示屏,由于SSD1303软件控制指令非常丰富,该函数内容较长,在这里不做描述,详情见P09702应用笔记,这里要说明的是:InitOled()中的comm_out2()函数用WriteCommand()函数替代 for(i=0;i<8;i++) WriteCommand (0xB0+i);//设置显示位置—行 WriteCommand (0x02); //设置显示位置—列低地址 WriteCommand (0x10); //设置显示位置—列高地址 for(j=0;j<128;j++) WriteData((0xFF);//屏幕显示,全亮 } |