初级会员

- 积分
- 92
- 金钱
- 92
- 注册时间
- 2012-2-7
- 在线时间
- 5 小时
|
//在指定位置显示一个字符
//x:0~234
//y:0~308
//num:要显示的字符:" "--->"~"
//size:字体大小 12/16
//mode:叠加方式(1)还是非叠加方式(0)
void LCD_ShowChar(u8 x,u16 y,u8 num,u8 size,u8 mode)
{
#define MAX_CHAR_POSX 232
#define MAX_CHAR_POSY 304
u8 temp;
u8 pos,t;
if(x>MAX_CHAR_POSX||y>MAX_CHAR_POSY)return;
//设置窗口
LCD_WriteReg(R80,x); //水平方向GRAM起始地址
LCD_WriteReg(R81,x+(size/2-1));//水平方向GRAM结束地址
LCD_WriteReg(R82,y); //垂直方向GRAM起始地址
LCD_WriteReg(R83,y+size-1); //垂直方向GRAM结束地址
LCD_SetCursor(x,y); //设置光标位置
LCD_WriteRAM_Prepare(); //开始写入GRAM
num=num-' ';//得到偏移后的值
if(!mode) //非叠加方式
{
for(pos=0;pos<size;pos++)
{
if(size==12)temp=asc2_1206[num][pos];//调用1206字体 (对应1206字体库中相应字符的那12个字节)
else temp=asc2_1608[num][pos]; //调用1608字体
for(t=0;t<size/2;t++) (因为字符宽度为汉字的一半,这里1206字体宽度一半即为6)
{
if(temp&0x01) (每个字节中如果位为1则显示此点的颜色,那这样t<6岂不是只判断temp中的6个位?对这点不是很理解)
{
LCD_WR_DATA(POINT_COLOR);
}else LCD_WR_DATA(BACK_COLOR);
temp>>=1;
}
}
}
else//叠加方式
{
for(pos=0;pos<size;pos++)
{
if(size==12)temp=asc2_1206[num][pos];//调用1206字体
else temp=asc2_1608[num][pos]; //调用1608字体
for(t=0;t<size/2;t++)
{
if(temp&0x01)LCD_DrawPoint(x+t,y+pos);//画一个点
temp>>=1;
}
}
}
//恢复窗体大小
LCD_WriteReg(R80, 0x0000); //水平方向GRAM起始地址
LCD_WriteReg(R81, (LCD_W-1)); //水平方向GRAM结束地址
LCD_WriteReg(R82, 0x0000); //垂直方向GRAM起始地址
LCD_WriteReg(R83, (LCD_H-1)); //垂直方向GRAM结束地址
程序中红色字体部分是有疑惑的程序,括号中蓝色的字体部分是我自己的理解以及不明白的地方,希望原子哥能指点一下。
|
|