小弟不才,想实现12864(分屏)菜单功能的改进。但驱动中的显示函数读不懂。
从 loc=string[j]-0x20;
//确定要显示的字符在asc表中的位置(乘上16)
起不知道是什么意思?asc怎么用?如何实现反白也没有看懂,望各位大虾指教。
最后附仿菜单真图一张。
//x:行0~7
//y:列0~127
//asc: 指向标准交换码
//string: 指向要显示的字符串
//flag: 0 反白显示
//n: the number of the string
void en_disp(unsigned char x,unsigned char y,unsigned char n,unsigned char code *asc,unsigned char *string,bit flag)
{
unsigned char i,j,loc;
for (j=0;j<n;j++)
{
loc=string[j]-0x20;
//确定要显示的字符在asc表中的位置(乘上16)
//显示上半个字母
for(i=0;i<8;i++)
{
//点的位置是在左还是右
if(y+8*j+i<64)
{
LCDSel(1);
WriteCmdToLCD12864(LCD_ON);
SetX(x);
SetZ(0);
SetY(y+8*j+i);
if(flag)
WriteDatToLCD12864(asc[16*loc+i]);
else
WriteDatToLCD12864(~asc[16*loc+i]);
}
else if(y+8*j+i<128)
{
LCDSel(2);
WriteCmdToLCD12864(LCD_ON);
SetX(x);
SetZ(0);
SetY(y+8*j+i-64);
if(flag)
WriteDatToLCD12864(asc[16*loc+i]);
else
WriteDatToLCD12864(~asc[16*loc+i]);
}
}
//显示下半个字母
for(i=8;i<16;i++)
{
//先判断点是在左还是在右
if(y+8*j+i-8<64)
{
if(x+1<8)
//最后一行
{
LCDSel(1);
WriteCmdToLCD12864(LCD_ON);
SetX(x+1);
SetZ(0);
SetY(y+8*j+i-8);
if(flag)
WriteDatToLCD12864(asc[16*loc+i]);
else
WriteDatToLCD12864(~asc[16*loc+i]);
}
}else if(y+8*j+i-8<128)
{
if(x+1<8)
//最后一行
{
LCDSel(2);
WriteCmdToLCD12864(LCD_ON);
SetX(x+1);
SetZ(0);
SetY(y+8*j+i-8-64);
if(flag)
WriteDatToLCD12864(asc[16*loc+i]);
else
WriteDatToLCD12864(~asc[16*loc+i]);
}
}
}
}
}
|