中级会员
 
- 积分
- 491
- 金钱
- 491
- 注册时间
- 2012-2-11
- 在线时间
- 8 小时
|
发表于 2013-1-11 15:50:08
|
显示全部楼层
回复【楼主位】xly0907:
---------------------------------
因为我们是开窗口写数据,设置一个窗口,然后设置开始位地址,然后写数据,而地址自动加一;
又因为我们字符取模取的就是一些点的数据(0和1),
所以要画字符,无非将字符的对应的0和1扫描出来;
所以先扫描数据的第一位是否为1,是——就画笔颜色,否——就画背景颜色
看我的程序:
/**********************************************************
* 函数名称:LCD_ShowChar
* 函数功能:在指定位置显示一个字符
* 入口参数: x: 0~234
* y: 0~308
* num: 要显示的字符:" "--->"~"
* size: 字体大小 12/16
* mode: 叠加方式(1)还是非叠加方式(0)
* c: 字体颜色
* 出口参数:无
***********************************************************/
void LCD_ShowChar(u8 x,u16 y,u8 num,u8 size,u8 mode, u16 c )
{
#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_WriteCom( R34 ); //开始写入GRAM
num=num-' ';//得到偏移后的值
if(!mode) //非叠加方式
{
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_WriteData( c );
}else LCD_WriteData(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,c);//画一个点
temp>>=1;
}
}
}
//恢复窗体大小
LCD_WriteREG(R80, 0x0000); //水平方向GRAM起始地址
LCD_WriteREG(R81, 0x00EF); //水平方向GRAM结束地址
LCD_WriteREG(R82, 0x0000); //垂直方向GRAM起始地址
LCD_WriteREG(R83, 0x013F); //垂直方向GRAM结束地址
}
希望对你有帮助~~ |
|