//*****************************************************************************************
//文件名称:LM4229.c
//*****************************************************************************************
#include
//*****************************************************************************************
//*****************************************************************************************
//功能:延时函数
//*****************************************************************************************
void delay_lcd(uchar t)
{
for(;t!=0; t--);
}
//*****************************************************************************************
//功能:写数据函数
//*****************************************************************************************
void write_data(uchar dat)
{
CD=0;//数据
CE=0;//LCD使能
WRIT=0; //写
DATA_PORT=dat; //把数据送到P口
delay_lcd(1); //当晶振较高时加延时
WRIT=1; //关写
CE=1;//关使能
}
//*****************************************************************************************
//功能:写命令函数
//*****************************************************************************************
void write_com(uchar com)
{
CD=1;//命令
CE=0;
WRIT=0;
DATA_PORT=com;
delay_lcd(1);//当晶振较高时加延时
WRIT=1;
CE=1;
}
//*****************************************************************************************
//功能:LM4229初始化函数
//*****************************************************************************************
void lcd_init(void)
{
// FS1 = 0; //fs1管脚高电平时表示字体为8*6;低电平时为8*8
// MD2 = 0;
// HALT = 0;
write_data(0);
write_data(0); //图形首地址
write_com(0x42); //图形首地址设置
write_data(30);
write_data(0);
write_com(0x43); //图形区域设置
write_com(0x80); //设置为OR模式
write_com(0x9a); //关闭文本显示,开图形显示
}
//*****************************************************************************************
//功能:指定位置、长度清屏
//*****************************************************************************************
void clr_lcd(uchar x,uchar y,uint length)
{
uint i,place;
place=x*30+y;
write_data(place&0xff);
write_data(place/256);
write_com(0x24);//设置
for(i=0;i
write_data(0xff); //写入空格,清屏
write_com(0xb2); //关闭自动写
}
//*****************************************************************************************
//功能:指定位置向LCD写入指定字符
//*****************************************************************************************
void write_lcd(uchar x,uchar y,char *cha)
{
uint place,i=0;
uchar length,c1,c2,j,k;
for(length=0;cha[length]!=0;length++);
do
{
c1=cha[i]; //取字符串的ASCII码
c2=cha[i+1];
place=x*30+y;
if(c1<=128)//小于128为字符,大于128为汉字
{
for(k=0;k<16;++k) //字符设置为16*8
{
write_data(place&0xff); //写入地址高位
write_data(place/256); //写入地址低位
write_com(0x24);//地址设置
write_com(0xb0);//设置数据自动写
write_data(ASC_MSK[(c1-0x20)*16+k]); //例如:0的ASCII码为0x30,在ASC_MSK中的位置为0x10*16 ---16字节字码依次写入LCD
write_com(0xb2); //自动复位
place=place+30;
}
if(y>28)//y>28时候需要换行
{
x=x+16;
y=0;
}
else //否则,不换行,继续写下一个字符
{
y++;
}
i++;
}
else //c1大于128为汉字
{
for(j=0;j
{
if(c1==GB_16[j].Index[0]&&c2==GB_16[j].Index[1])
{
break; //汉字找到则跳出
}
}
if(j
{
for(k=0;k<16;k++) //字符设置为16*8
{
write_data(place&0xff); //写入地址高位
write_data(place/256);//写入地址低位
write_com(0x24); //地址设置
write_com(0xb0); //设置数据自动写
write_data(GB_16[j].Msk[k*2]);
write_data(GB_16[j].Msk[k*2+1]); //16*16,每行2字节
write_com(0xb2); //自动复位
place=place+30; //下一行
}
}
else //没找到对应汉字则涂黑
{
for(k=0;k<16;k++) //字符设置为16*8
{
write_data(place&0xff); //写入地址高位
write_data(place/256);//写入地址低位
write_com(0x24); //地址设置
write_com(0xb0); //地址设置
write_data(0xff);
write_data(0xff);
write_com(0xb2); //自动复位
place=place+30; //下一行
}
}
if(y>27) //换行
{
x+=16;y=0;
}
else //不用换行,则下一个字
{
y+=2;
}
i+=2;
}
}
while(i
}
//--------------------------------------------
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………