反白思想:
从使用手册上可知,扩展指令里的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); } |