您的位置 首页 观点

我的12864学习笔记_3—操控12864液晶显示曲线

三,液晶显示曲线要想使用12864实现曲线的显示,必须先实现能够自由控制12864中的任意一个像素点的亮灭,而不能影响到相邻其他点的状态。因

三,液晶显现曲线

要想运用12864完成曲线的显现,有必要先完成能够自在操控12864中的恣意一个像素点的亮灭,而不能影响到相邻其他点的状况。

由于对12874液晶进行写操作的话,写入数据的最小单位也是一个16进制数,是8位的,能够操控8个像素点,所以,对液晶进行操作时,能够一次操控液晶的最少像素点数为8个。

所以要想操控液晶中的某一个点的亮灭,有必要找到一种办法,使这一个点的数据的写入由写入这个16进制数来完成,而根本原则是不能影响其他7位数据的状况。所以要想完成操控某一个像素点,有必要先知道现在液晶中在这个像素点左右其他7位的现在数据,然后把该点的数据按位加到这个数据上,而不能影响其他7位数据的状况。

完成知道现在显现的数据的办法有两种:1,完成液晶的读操作,把GDRAM中的对应的数据读出来,就能够了;2,人工构建一个虚拟的缓存寄存器(其实也便是一个二维数组),保存液晶GDRAM最终一次写入的数据,便是现在液晶显现的数据,由于保存的是8位的16进制数,所以128*64个像素点只需要16*64的数组就能够存储完了。在写12864的一起写虚拟寄存器,写之前读出虚拟寄存器的值与点方位相或,这样才不会掩盖之前的点。

由于msp430g2553的IO管脚有限,所以我的12864是串行衔接的。而并行衔接的话,液晶的读操作并不难完成。现在串行的,尽管比较复杂一些,但很类似于串行的读操作,主要是看懂时序,然后严厉依照时序就能够写出。我现已能够完成了液晶的读,写操作。读写操作的函数如下,其间注释的也比较具体:

//12864串行衔接写数据,写指令函数依照手册上的时序进行编程

voidwr_lcd(uchardat_comm,ucharcontent)//

{//要写的数据

uchara,i,j;

delay_us(50);

a=content;

LCD_SCLK0;//en=0;

LCD_SID1;//wr=1

for(i=0;i<5;i++)//数据时序*****************8前5个高电平的同步码

{

LCD_SCLK1;

LCD_SCLK0;

}

LCD_SID0;//wr=0写操作

LCD_SCLK1;//en=1来一个时钟

LCD_SCLK0;//en=0

if(dat_comm)

LCD_SID1;//RS=1写数据

else

LCD_SID0;//RS=0写指令

LCD_SCLK1;//来一个时钟

LCD_SCLK0;

LCD_SID0;//操控字的最终一位为0

LCD_SCLK1;//来一个时钟

LCD_SCLK0;

for(j=0;j<2;j++)//

{

uchari,j;

uchara=0;//a寄存读取的数据

delay_us(50);

LCD_SCLK0;//en=0;

LCD_SID1;//wr=1

for(i=0;i<5;i++)//数据时序*****************8前5个高电平的同步码

{

LCD_SCLK1;

LCD_SCLK0;

}

LCD_SID1;//wr=1读操作

LCD_SCLK1;//en=1来一个时钟

LCD_SCLK0;//en=0

LCD_SID1;//RS=1读数据

LCD_SCLK1;//来一个时钟

LCD_SCLK0;

LCD_SID0;//操控字的最终一位为0

LCD_SCLK1;//来一个时钟

LCD_SCLK0;

for(j=0;j<2;j++)/

voidDraw_Point(unsignedcharx,unsignedchary0,unsignedcharcolor)

{

unsignedcharrow,collum,cbite;

unsignedchartempH,tempL;

wr_lcd(comm,0x34);//翻开扩展指令集

wr_lcd(comm,0x36);//翻开绘图显现

//uchary_Byte,y_bit,x_Byte,x_bit;

//y_Byte=y/32;//0:上半屏幕1:下半屏幕

//y_bit=y2;//y的行号

//x_Byte=x/16;//x的列号

//x_bit=x;//x的位

//Write_Cmd(0x34);//翻开扩展指令集

//Write_Cmd(0x36);//翻开绘图显现

//Write_Cmd(0x80+31-y_bit);

//Write_Cmd(0x80+x_Byte+(1-y_Byte)*8);

collum=x>>4;//右移4位相当于除以16取整,得到的是x的地点大列的列号

cbite=x&0x0f;

if(y0<32)

row=y0;

else

{

row=y0-32;

collum+=8;

}

wr_lcd(comm,0x80+row);//先设定笔直方位

wr_lcd(comm,0x80+collum);//再设定水平方位

//上面两句指定了地址,下面先读出现在的数据,然后再写入新的数据

rd_lcd();//读操作要先履行一次空读指令

tempH=rd_lcd();//两次读操作

tempL=rd_lcd();

//由于没进行一次读或写操作,地址指针AC都会自加1,所以下面要从头输入地址相同仍是先输入笔直地址,然后再输入水平地址

wr_lcd(comm,0x80+row);

wr_lcd(comm,0x80+collum);

if(color)//color=1,点亮;color=0,擦除

{

if(cbite<8)

{

tempH|=(1<<(7-cbite));

//tempL=(1<<(7-cbite));

}

else

{

//tempH=(1<<(15-cbite));

tempL|=(1<<(15-cbite));

}

}

else

{

if(cbite<8)

{

tempH&=~(1<<(7-cbite));

//tempL=(1<<(7-cbite));

}

else

{

//tempH=(1<<(15-cbite));

tempL&=~(1<<(15-cbite));

}

}

wr_lcd(dat,tempH);//写入数据

wr_lcd(dat,tempL);

wr_lcd(comm,0x30);//回到根本指令集

}

运用上面的函数,就能够完成对恣意一个像素点的亮灭操控了。有了上面的函数,然后就能够完成操控液晶显现恣意曲线或恣意形状的图画了。下面就贴一个显现坐标轴的函数吧,函数完成的功用是在液晶屏上显现X,Y坐标轴,而且把坐标轴按每10个点进行分段,函数如下:

未完待续。。。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/news/guandian/256246.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部