玩转12864液晶显示图片
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
玩转12864液晶显示图片,画点,画任意直线
通过上一篇的实验,相信大家都掌握了显示字符的基本用法。
下面我们来看一下12864液晶更高级的用法。
首先是它的绘图功能。
让我们先来显示一整副的图片吧,也就是128x64大小。
在使用绘图功能时,先要打开扩充指令集,然后再打开绘图功能。接着就是送数据显示了。这里我们首先要弄明白ST7920的显示坐标关系。其显示坐标如下。
从图中可以看出,X方向共有8个字(16个字节)Y方向共有0~31 行分为上下两个屏。
弄懂了之后我们就可以依照此坐标来显示一整屏的图片了。
随便用一个图片的提取转换软件,讲一副126X64大小的图片转换成字节数据,总共字节大小为128*64/8 = 1024个字节。
下面我们来看看这个显示整屏图像的函数
void v_Lcd12864DrawPicture_f( unsigned char code *pPicture )
{
unsigned char i, j, k ;
for( i = 0 ; i < 2 ; i++ )//分上下两屏写
{
for( j = 0 ; j < 32 ; j++ )
{
v_Lcd12864SendCmd_f( 0x80 + j ) ;//写Y坐标
if( i == 0 ) //写X坐标
{
v_Lcd12864SendCmd_f( 0x80 ) ;
}
else
{
v_Lcd12864SendCmd_f( 0x88 ) ;
}
for( k = 0 ; k < 16 ; k++ ) //写一整行数据
{
v_Lcd12864SendData_f( *pPicture++ ) ;
}
}
}
v_Lcd12864SendCmd_f( 0x30 ) ;
}
横向取模
for(i=0;i<2;i++)//分上下两屏写
{
for(j=0;j<32;j++)
{
wc51r(0x80+j);//写Y坐标
if(i==0) //写X坐标
{
wc51r(0x80);
for(k=0;k<16;k++) //写一整行数据
{
wc51ddr(xu[j][k]) ;
}
}
else
{
wc51r(0x88);
for(k=0;k<16;k++) //写一整行数据
{
wc51ddr(xu[j+32][k]) ;
}
}
}
}
看看效果图片如下:显示一个人的图像
下面来看看如何在任意一个位置显示或者是擦除一个点
对于12864这种二值显示屏来说,其显示状态无外乎显示和不显示一个点这两种状态。而在任意位置画点,是我们随心所欲的画线,画圆,画矩形的等GUI函数的基础。
为了让这个位置有一个参考点,我们有必要定义一个坐标系
在这里,我定义的坐标系如下
0,0------------------------------------127,0
| |
| |
| |
| |
0,63----------------------------------127,63
0,0代表屏幕的左上角,127,63代表屏幕的右下角。
对于屏幕上面任意一个点,如果我们想要点亮它,必须先读出此点的状态,然后再修改该点,最后送出去,即读----修改----写。按照这个步骤,然后再运用C语言中的位操作运算符可以很方便的完成画点的函数。
由于画点函数涉及到读ST7920内部RAM的操作,因此,我们必须先要完成这个读数据的函数
具体实现过程如下:
unsigned char u8_Lcd12864ReadByte_f( void )
{
unsigned char byReturnValue ;
v_Lcd12864CheckBusy_f() ;
io_LCD12864_DATAPORT = 0xff ;
SET_DATA
SET_READ
CLR_EN
SET_EN
byReturnValue = io_LCD12864_DATAPORT ;
CLR_EN
return byReturnValue ;
}
然后是画点的函数,其实现过程如下:
void v_Lcd12864DrawPoint_f( unsigned char X, unsigned char Y, unsigned char Color ) {
unsigned char Row , Tier , Tier_bit ;
unsigned char ReadOldH, ReadOldL ;
v_Lcd12864SendCmd_f( 0x34 ) ;
v_Lcd12864SendCmd_f( 0x36 ) ;
Tier = X >> 4 ;
Tier_bit = X & 0x0f ;
if( Y < 32 )
{
Row = Y ;
}
else
{
Row = Y - 32 ;
Tier += 8 ;
}
v_Lcd12864SendCmd_f( Row + 0x80 ) ;
v_Lcd12864SendCmd_f( Tier + 0x80 ) ;
u8_Lcd12864ReadByte_f() ;
ReadOldH = u8_Lcd12864ReadByte_f() ;