点带驱动芯片OLED 屏 例程
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
以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] );