//图片模式清屏函数:
void Clear12864Screen()
{
unsigned char i,j;
Write12864Command(0x34);//功能设定:8位控制方式,使用扩充指令
Write12864Command(0x36);//使用扩充指令,绘图显示控制
for(i=0;i<32;i++)
//ST7920可控制256*32点阵(32行256列),而12864液晶实际的行地址只有0-31行,
//12864液晶的32-63行的行是0-31行地址从第128列划分一半出来的,所以分为上下两半屏,
//也就是说第0行和第32行同属一行,行地址相同;第1行和第33行同属一行,以此类推
{
Write12864Command(0x80|i);//写行地址(垂直地址)
Write12864Command(0x80);//写列地址(水平地址)
for(j=0;j<32;j++)
Write12864Data(0x00);//清屏
}
}
//在任意位置显示任意大小的图片函数:
void LCD12864DisplayPictrue(unsigned char y,unsigned char x,
unsigned char px,unsigned char py, unsigned char *pp)
//y-起始行(数值0-63),x-起始列(16位宽,数值0-7),
//px-图片宽度,py-图片高度,pp-指针指向图片数组
//因为上下屏的地址不连续,要在任意位置显示完整的图像,处理起来比较繁琐
{
unsigned char i,j,k;
Clear12864Screen();//清屏
if(y<32)//如果起始行在上半屏
{
k=32-y;//算出上半屏的行数
for(i=0;i<k;i++,y++)//上半屏行数
{
Write12864Command(0x80|y);//写行地址(垂直地址)
Write12864Command(0x80|x);//写列地址(水平地址)
for(j=0;j<px/8;j++)
Write12864Data(pp[i*px/8+j]);//写图片数据
}
y=0;//下半屏起始行,接上半屏继续写数据
for(;i<py;i++,y++)//下半屏剩下的行数
{
Write12864Command(0x80|y);//写行地址(垂直地址)
Write12864Command(0x80|(8+x));//写列地址(水平地址)
for(j=0;j<px/8;j++)
Write12864Data(pp[i*px/8+j]);//写图片数据
}
}
else //如果起始行在下半屏
{
for(i=0;i<py;i++,y++)//行数
{
Write12864Command(0x80|(y-32));//写行地址(垂直地址)
Write12864Command(0x80|(8+x));//写列地址(水平地址)
for(j=0;j<px/8;j++)
Write12864Data(pp[i*px/8+j]);//写图片数据
}
}
} |