看了许多网上文章,没有清楚介绍12864液晶反白显示的。不才拙见呈给众码友以博一洒;
反白常用的手法是读出液晶屏内存储器的相应数据,然后按位取反,再写入液晶相应内存;12864读取液晶内存的手法比较特别,直接按照时序图写数据不行,它要求使能信号至少完成两次反转才行。
首先命令给予地址,使能信号给予低电平,延时半个周期约200ns
然后,rs,rw,置位。
再延时200ns;
使能信号置位;至此完成一次虚读,不把总线数据读入变量;
再延时450ns,
使能变低;
再延时450ns;
使能变高,这时正确的数据就放到数据总线上了
给P0口高电平0x00;
读数据到变量;然后处理;按位取反;
再写入相同地址就行了;
如此循环64次,完成左半屏的反白,换屏选信号,选择右半屏,重复上面的动作就行了;
附上写屏代码:
/*******************************************************************************
* 函 数 名 : Lcd2864WriteData
* 函数功能 : 写入一个数据到12864
* 输 入 : dat
* 输 出 : 无
*******************************************************************************/
void lcd12864_writedat(dat)
{
unsigned char xh;
LCD12864_RS = 1; //select command,选择数据
LCD12864_RW = 0; //select write,选择写模式
LCD12864_E = 0;
xh=10; //延时140ns以上;5指令周期;;
while(xh--);
LCD12864_E = 1; //使能变高450us;
DATA_PORT = dat; //put command,总线放上命令数据
xh=50;
while(xh--); //再延时450us18指令周期;;
LCD12864_E = 0; //下降沿写入数据;
_nop_(); //延时10us
}
附上读数据代码
/*******************************************************************************
* 函 数 名 : Lcd2864ReadData
* 函数功能 : 从12864的数据区读数据,处理后用;
* 输 入 : 无
* 输 出 : 读到的一个字节,这种液晶要求虚读一次。也就是E使能信号完成两次反转;
*******************************************************************************/
unsigned char lcd12864_Readdat()
{
unsigned char xh,dat;
DATA_PORT=0xff; //这句很重要,在要读入数据之前必须把P0口写入0xff;
LCD12864_E = 0;
xh=5; //保证rs和rw在E信号的低电平
while(xh--);
LCD12864_RS = 1; //选择数据
LCD12864_RW = 1; //选择读模式
xh=15; //保证E低电平450ns以上;两次延时共20指令周期;;
while(xh--);
LCD12864_E = 1; //使能变高450us;第一次虚读完成
xh=20;
while(xh--); //保持E高电平450nm;
LCD12864_E = 0; //然后E低电平
xh=20; //保持E低电平450nm
while(xh--);
LCD12864_E = 1; //使能变高锁存12864数据到数据总线;
xh=5; //稳定150nm
while(xh--); //再延时450us18指令周期;;
dat = DATA_PORT; //读总线上的数据
LCD12864_E = 0; //给E为低电平准备下次操作;
return dat; //返回读数;
}