超薄显示屏OLED在陀螺经纬仪中的应用
在与计算机连接方面,SSD1303的接口,包括数据输入缓存器、数据输出锁存器,指令寄存器及译码器,忙状态触发器以及时序控制电路等,具有高性能的接口控制电路。计算机可以随时访问SSD1303而不需要判断其当前状态,与以前用的以T6963C控制器不同,SSD1303判断忙状态在操作上不是那么重要,因为SSD1303的接口部能够适时地接收计算机的访问。只是在计算机对显示存储器大量的数据传输时与控制部向驱动部传输显示数据相冲突,会在显示屏上出现"雪花"。但是由于这个间隙时间很短,加上人眼在视觉上的惰性而看不出"雪花"现象,有时判断忙标志再进行显示数据传输时,忙标志已经消失了。正是由于这些,计算机访问SSD1303的操作流程非常简单。但要注意的是SSD1303的接口控制电路内有几套时序电路以适配不同计算机操作时序的要求。时序适配电路的设置端为BS0,BS1,BS2。在P09703中选择BS1和BS2不同的连接,以确定选择Intel8080时序还是M6800时序。在P09702中由于没有BS1和BS2的选择,出厂时已经设置为Intel8080时序,所以下面的程序为Intel8080时序。
#define AD0_PIN_NUM 8 //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); //屏幕显示,全亮
}
}
陀螺经纬仪 SSD1303 OLED技术 ARM 相关文章:
- 基于AT89C51控制的OLED显示屏设计方案(06-16)
- 柔性OLED显示技术让未来电子产品充满无限可能(09-22)
- 浅析移动显示技术未来发展(06-15)
- iPhone8也可能用的OLED面板如何从不受青睐到炙手可热(11-12)
- OLED之父邓青云为你揭开OLED的秘密(06-27)
- OLED与PDP等离子技术的优缺点比较(06-11)