原创 以RA8835为控制器的液晶的页面切换的操作

2011-6-5 18:19 2990 7 7 分类: MCU/ 嵌入式
   前些时,用到了一款以RA8835为控制的320*240的液晶,一共要显示6个页面,6个页面进行循环显示,每个页面之间有10秒的间隔,起初在页面切换时,先刷屏,把用到的显存中的所有数据清0,这样就有个缺点,在每页切换时,会看到页面的切换,显示效果不好,今天偶然又看到了RA8835的数据手册,发现其显示有64k,又大概看了下数据手册,发现可通过操作第一区的显存地址来进行页面的切换。
    思路如下:先将显示数据写入显存,地址定在0x0000,然后将第一区的显存地址定义在0x0000,则第一页显示出来了,在此页与下面的空闲时间内,将光标地址定义在0x2580,光标地址也即要写入缓存的地址,将待显示信息写入,为什么是0x2580呢,因为在图形显示模式下,每一页所需要的缓存为240*(320/8)=9600=0x2580,在时间间隔到了之后将,第一区显存设置为0x2580,这样第二页便显示出来了,依次累推即可。
RA8835的驱动程序贴出来:
uchar TempDisRow=0;
uchar TempDisCol=0;
void LCM_WriteData(uchar dat)
{
SFRPAGE   = CONFIG_PAGE;
LCD_CD=0;
_nop_();
SFRPAGE   = CONFIG_PAGE;
LCD_WR=0;
_nop_();
SFRPAGE   = CONFIG_PAGE;
cData=dat;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
 
SFRPAGE   = CONFIG_PAGE;
LCD_WR=1;
SFRPAGE   = CONFIG_PAGE;
LCD_CD=1;
}
void LCM_WriteCMD(uchar cmd)
{  
SFRPAGE   = CONFIG_PAGE;
LCD_CD=1;
_nop_();
SFRPAGE   = CONFIG_PAGE;
LCD_WR=0;
_nop_();
SFRPAGE   = CONFIG_PAGE;
cData=cmd;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
 
SFRPAGE   = CONFIG_PAGE;
LCD_WR=1;
SFRPAGE   = CONFIG_PAGE;
LCD_CD=0;
}
/*此显示程序比较万能,可以任意大小的汉字,字母,图片*******************************************
//DisRow:待显示的行****************************************************************************
//DisCol:待显示的列****************************************************************************
//DisSeq:在字模数组中的序列,从0开始***********************************************************
//DisNum:从字模数组的第DisSeq个字开始,要显示的字数********************************************
//FontRow:待显示图形所占行数*******************************************************************
//FontSize:待显示图形所占列数/8+1,例如要显示一个18*20的字体,则FontRow=20,FontSize=20/8+1=3***
//FontCode:待显示图形的字模数组名**************************************************************
//dCon_F;反向显示标志**************************************************************************
//disaddress:要写入的显存的地址****************************************************************/
void LCM_WriteFontEx(uchar DisRow,uchar DisCol,uchar DisSeq,uchar DisNum,uchar FontRow,char FontSize,uchar *FontCode,uchar dCon_F,uint disaddress)      
{                                                  
uchar i,j,k;
uint TempAddr;
uint FontCodeNum;
uchar temprow,tempcol;
uchar addl,addh;
if(DisCol!=0xFF)
{
TempDisRow=DisRow;
TempDisCol=DisCol;
}
else
{
DisRow=TempDisRow;
DisCol=TempDisCol;
}
 
FontCodeNum=FontRow*FontSize;
FontCode+=DisSeq*FontCodeNum;

for(i=0;i<DisNum;i++)
{
tempcol=DisCol+i*FontSize;
for(k=0;k<FontRow;k++)
{
temprow=DisRow+k;
TempAddr=0+temprow*40+tempcol;        //加上显示一区的起始地址
TempAddr+=disaddress;
addl=TempAddr;
addh=TempAddr>>8;

 
LCM_WriteCMD(0x46); //设置光标指针
LCM_WriteData(addl);
LCM_WriteData(addh);
LCM_WriteCMD(0x42);
for(j=0;j<FontSize;j++)
{
 
if(dCon_F==0)
LCM_WriteData(FontCode[i*FontCodeNum+FontSize*k+j]);
else
LCM_WriteData(255-FontCode[i*FontCodeNum+FontSize*k+j]);
}
}
}
TempDisCol+=FontSize*DisNum;

}
PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
7
关闭 站长推荐上一条 /3 下一条