点带驱动芯片OLED 屏 例程
- 格式:doc
- 大小:45.50 KB
- 文档页数:4
以430为例:
1. 系统初始化,必不可少。主要功能:确定时钟
void sysinit()
{
unsigned char i;
WDTCTL=WDTPW+WDTHOLD; //关看门狗,视情况而定,如果不关,去
//掉WDTHOLD
BCSCTL1 &= ~XT2OFF; //配置时钟 ACLK XT2 = HF XTA/*L
do //wait for XT2 stable
{
IFG1 &= ~OFIFG;
for (i = 0xFF; i > 0; i--);
}
while ((IFG1 & OFIFG) != 0);
BCSCTL2 |= SELM1+SELS; //配置时钟 MCLK = SCLK = XT2 (safe);
}
430中
BCSCTL2置 MCLK(主时钟) SMCLK(子系统时钟),并进行分频
BCSCTL1设置ACLK(辅助时钟)及其分频
2. I/O初始化
设置各I/O口的方向和初始值,根据你用到的I/O口而定,主要包括色度信号,驱动芯
片控制信号,供电信号。
可能用到寄存器:
PnDIR--------I/O口方向,1为输出,0为输入
PnIN ---------输入值
PnOUT-------输出值
PnIE----------终端允许 eg: P1IE | = 0x80;
PnIES--------中断边沿选择
PnIFG--------中断标志位
3. 设置写命令、写数据函数,此处为驱动液晶屏,写数据作准备。
一般驱动芯片都会有一个命令和数据控制引脚,通过高低电平的变换,实现液晶屏的正
确显示。选择芯片,给写信号,通过事先确定的I/O口传送数据。结束后,将各控制引
脚复位。
4. 液晶IC初始化
为液晶屏供电后,先解锁液晶驱动IC,对驱动芯片复位,关显示(详细查看驱动芯片资
料);设置多少位彩色模式;显示起始行及显示偏移量的设置;设定桢频率(晶振分频),
显示频率;设置亮度及对比度;根据驱动具体芯片和液晶屏而定。
此处差别较大,故不举例;
先是前最好进行一次清屏操作;
液晶显示一般初始化过程
(1) 执行功能设置(Function set)
(2) 执行显示控制(Display control)
(3) 执行回原点(Return home)
(4) 执行清除显示(Clear display)
(5) 设置DDRAM地址或CGRAM地址
(6) 写数据到DDRAM和CGRAM
5. 此时便可显示你所需要的信息(液晶驱动芯片 SSD1351UR1)
显示时,首先要确定显示范围,发送写命令;
void wr_address(unsigned int xstart,unsigned int xend,unsigned int ystart,unsigned int yend)
{
comm_out(0x0015);
data_out(xstart); //Column start address
data_out(xend); //Column end address
comm_out(0x0075);
data_out(ystart); //row start address
data_out(yend); //rou end address
}
使用时,根据液晶屏的分辨率而定,不可大于分辨率值
特别注意,发数据或命令时,首先要确定驱动IC读有效
comm_out(0x005c); //为写RAM命令,此后只需不断向RAM写数据即可,
6. 几个函数举例
此款液晶屏分辨率为128*96,行值范围0~95,列值范围0~127
(1)显示一条水平直线
wr_address(0,127,50,50); //在显示屏中间显示一条水平直线
comm_out(0x005c); //写RAM命令
for(int i =0 ; i<128 ; i++ )
{
data_out( 0x001f); //显示一条蓝色线
}
选择的是16位真彩色,RGB所占位数为5:6:5;16位数据依次分布;
即红色为:1111 1000 0000 0000B= 0Xf800;
绿色为 :0000 0111 1110 0000B = 0x07e0;
蓝色为 :0000 0000 0001 1111B = 0x001f;
线条宽度可通过改变y的起始或终止坐标实现;
(2)显示垂直直线
wr_address(50, 50, 0, 95); //在显示屏中间显示一条垂直直线
comm_out(0x005c);
for(int i =0 ; i<96 ; i++ )
{
data_out( 0x001f); //显示一条蓝色线
}
同样,线条宽度可通过改变x的起始或终止坐标实现;
(3) 显示英文字母
可通过其ASCII码与其在数组中位置的对应关系,来显示一系列字符组合
通过字符取模工具,选择字符的分辨率
显示SETTINGS菜单,分辨率为6*12
void disp_setting( unsigned int fcolor , unsigned int bcolor)
{
for(int i=0;i<8;i++) //菜单行
{
for(int j=0;j<22;j++) //菜单列
{
unsigned int data=menu[i][j]; //需要显示的字符,
wr_address(1+j*6,6+j*6,84-i*12,95-i*12); //6*12
comm_out(0x005c);
for(unsigned int row=12; row>0 ; row-- ) //12行
{
unsigned int temp = 0x80;
unsigned int tempd = ascii[data-0x20][row]; //根据ASCII码与表中位置的关
//系确定要显示的字符,此程序中,字符位置与ASCII码差0x20
for(unsigned int col = 0; col < 6; col++ ) //6列
{
if(temp&tempd) //移位比较,为一的位显示前景色
{
data_out(fcolor);
}
Else //为0的位显示后景色
{
data_out(bcolor);
}
temp=temp>>1; //循环右移
}
}
}
}
}
显示小图片,通过Image2Lcd获得图像数据,确定显示区域,输出显示
假设图片分辨率微30*40:
wr_address( 21 , 50 , 11 , 50);
comm._out(0x005C);
for(int i =0; i<1200 ; i++) //此处根据获得的图片数据形式而定
{
data_out( photo[i] );
}
此处需注意,图片本身的分辨率需与要获得的分辨率一致,否则会造成图片扭曲,失
真等。
附录
1、 文件夹 code v3.0 为驱动芯片ssd1351,分辨率128*96,尺寸1.29寸的一款莱
宝oled屏程序
2、 文件夹 mycode v1.0为驱动芯片lgdp4216,分辨率160*128,尺寸1.8寸的一款
oled屏程序
王晓丽 完成于 2008年9月27日星期六