ST7920LCD12864反白显示

反白思想: 
从使用手册上可知,扩展指令里的0x03+行号即可实现反白对应行。但是ST7920 控制器的128×64 点阵液晶其实原理上等同256×32 点阵,第三行对应的DDRAM 地址紧接第一行;第四行对应的DDRAM 地址紧接第二行。所以128×64 点阵的液晶执行反白功能时实用意义不大,因为用户对第一行执行反白显示操作时,第三行必然也反白显示;第二行反白,第四行也必然反白。

        其实我们还是有办法做到单行反白的,解决方法就是混用图形显示和字符显示。其理论支持在于:在ST7920中,字符显示的CGRAM和图形的GGRAM是相互独立的,而最后显示到液晶上的结果,是两个RAM中数据的异或。

        具体来说:假如某个点上,绘图RAM的没有绘图(数据为0),而字符RAM上有点阵(数据为1),那么异或的结果就是1,也就是说正常显示字符;当字符上RAM没有点阵的时候,异或的结果是0,自然也就不显示了。假如该点上绘图RAM绘图了(数据为1),当字符RAM上有点阵(数据为1时),异或的结果为0,效果就是反白显示;如果字符RAM没有点阵(数据为0时),异或结果为1,效果就是显示绘图的背景。

        所以,如果要在某个地方反白显示,那么就在该点绘图并且写字,如果要取消反白,就重新用全0擦掉那个地方的绘图!这样一来可以实现任何地方、任意大小的反白显示,反而比原指令中的单行反白的功能更好更强大咯
12864驱动程序(反白部份)



void Disp_black()   //在反白之前先清绘图存储区,将绘图存储区的参数全设为不反白0x00.
{
unsigned char i,j;
lcm_w_test(0,0x36); //图形方式
for(i=0;i<32;i++){
    lcm_w_test(0,0x80+i);
    lcm_w_test(0,0x80);
     for(j=0;j<16;j++) {
    lcm_w_test(1,0x00);
    }
      }
    for(i=0;i<32;i++){
    lcm_w_test(0,0x80+i);
    lcm_w_test(0,0x88);
    for(j=0;j<16;j++) {
     lcm_w_test(1,0x00);
    }
}
}


void convertChar (unsigned char CX, CY, width,YN,f)
{
unsigned char halfLineCnt, basicBlock,lcdPosX,lcdPosY;
     if(f==1)
    Disp_black(); //清绘图区
lcdPosY = 0x80;

if (CX == 0)
{
    CX = 0x80;
    halfLineCnt = 16;
}
else if (CX == 1)
{
    CX = 0x80;
    halfLineCnt = 32;
}
else if (CX == 2)
{
    CX = 0x88;
    halfLineCnt = 16;
}
else if (CX == 3)
{
    CX = 0x88;
    halfLineCnt = 32;
}
lcdPosX = CX + CY;

     for (; halfLineCnt != 0; halfLineCnt--)
{
    basicBlock = width;
    write_com(0x34);
    write_com(lcdPosY);
    write_com(lcdPosX);
    write_com(0x30);

    for (;basicBlock != 0; basicBlock--)
    {
     if (halfLineCnt > 16)
     {
      write_data(0x00);
     }
     else
     {
       if(YN==1) write_data(0xff);
       else   write_data(0x00);
     }
    }
    lcdPosY++;
}

write_com(0x36);
write_com(0x30);
}

你可能感兴趣的:(C51)