论坛元老
 
- 积分
- 3347
- 金钱
- 3347
- 注册时间
- 2013-4-10
- 在线时间
- 333 小时
|
发表于 2016-3-7 20:04:05
|
显示全部楼层
本帖最后由 likunxue 于 2016-3-7 20:59 编辑
显示效果不好, 且字体只能是12X12的, 在12864上显示不好看,
实现的方法用画点的方式, 不能用写字节的方法, 因为一般这个屏都是以字节写的,
以下代码是用于 19264的液晶显示屏的, 你自已看看
/*********************************************************************************************
函数名:PutPixel LCD描点函数
调 用:PutPixel(x,y,d);
参 数:x,y坐标, d清点或置点标志
返回值:无
结 果: 在LCD屏的指定坐标上绘一个点或清一个点
**********************************************************************************************/
void PutPixel(unsigned char x,unsigned char y,unsigned char d){
unsigned char const h[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
unsigned char const l[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned char temp,m;
temp = ReadData(x,y/8); //取当前坐标位置的LCD的显示参数
m=y&0x07; //取当前点在当前字节的位置
if(d)temp|=h[m];
else temp&=l[m];
WriteData(x,y/8,temp); //写入数据
}
/********************************************************************************************
函数名称: Write_Dot_LCD(x,y,d)图形绘制函数
功 能: 将图形数据写入到指定的显示坐标上
参 数: x列坐标,Y横坐标,m,真实的坐标点,GB_Dat要写入的数据
修改日期: 2012.11.18
编 写 人: likunxue
********************************************************************************************/
void Write_Dot_LCD(u8 x,u8 y,u8 GB_Dat){
u8 const h[]={0,0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff};
u8 const l[]={0xff,0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0};
u8 m,temp, temp1;
m=y&0x07; //取Y向坐标点除8的余数
y/=8; //计算显示Y坐标值
if(CharImageReverse!=0)GB_Dat=~GB_Dat; //如果是反显,数据取反
if(m==0)WriteData(x,y,GB_Dat);//直接写入字符参数
else{
temp = GB_Dat;
temp1 = ReadData(x,y); //读出数据
temp<<=m;
temp1&=h[m];
temp|=temp1; //合并数据
WriteData(x,y,temp); //写入上半字节
temp = GB_Dat;
temp1 = ReadData(x,y+1); //读出下半字节数据
temp>>=(8-m);
temp1&=l[m];
temp|=temp1; //合并数据
WriteData(x,y+1,temp);//写入下半字节
}
}
/*********************************************************************************************
函数名:任意位置显示单个汉字或字符函数
调 用:LCD_ZiFuXianShi(u8 x,u8 y,u8 size,u8 tem,u8 *str)
参 数:x,y 显示坐标
size 字体
tem 汉字或字符(1汉字,2字符)
*str 点陈数据
返回值:无
*********************************************************************************************/
void LCD_ZiFuXianShi(u8 x,u8 y,u8 size,u8 tem,u8 *str) //任意行写入一个汉字
{
u8 m,i,k,Cnt,SET,CLR;
if(CharImageReverse!=0){SET =0;CLR =1;} //如果是反显,数据取反
else{SET =1;CLR =0;}
Cnt = size/tem; //计算X向所需要的字节数
for(i=0;i<Cnt;i++){Write_Dot_LCD(x+i,y,*str);str++;}//上行
y+=8;
for(i=0;i<Cnt;i++) //下行
{
if(size ==16)Write_Dot_LCD(x+i,y,*str);
else{ //用描点的方式完成余下数据的写入
k= *str;//读取数据
for(m =0;m<4;m++)
{
if((k>>m)&0x01)PutPixel(x+i,y+m,SET);//画点
else PutPixel(x+i,y+m,CLR);//清定点
}
}
str++;
}
}
/*********************************************************************************************
函数名:LCD_word 任意位置汉字及字符显示函数
调 用:LCD_word(x,y,*s);
参 数:x轴座标,y轴座标,s 数据指针
返回值:无
结 果:显示数组指针处的汉字const char *BiaoTi
*********************************************************************************************/
void LCD_word (u8 x,u8 y,u8 size, const char *str) //任意行写入一个汉字
{
const unsigned char *SII;
u32 k,FoaSize; //汉字库字模存放地址及,ASCII字符字模存放地址
u8 tem,Br[32];
if(size ==12){FoaSize = ftinfo.f12addr;SII = ASII_12;}//字模首地址
else{FoaSize = ftinfo.f16addr;SII = ASII_16;}
while(*str>0)
{
tem = *str;//取高8位字形码
if(tem <0x7f)
{
k= (tem-32)* size;//计算了模地址
LCD_ZiFuXianShi(x,y,size,2,(u8*)SII+k);
tem = size/2; //ASCII 字符只主半个汉字宽
str ++;
}//如果是字符,计算字模地址,置字符标志位8
else{
GET_FONT((u8 *)str,Br,size*2,FoaSize); //得到字模点阵数据
str+=2; //字符串指针加2指向下一个汉字编码
tem = size; //置汉字标志位(汉字16位)
LCD_ZiFuXianShi(x,y,size,1,Br);
}
x += tem;//计算x坐标,
}
}
|
|