微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 128*64液晶采用“单片机内部显示缓冲“的程序

128*64液晶采用“单片机内部显示缓冲“的程序

时间:11-17 来源:互联网 点击:
/*

*
*文件名称:
*摘要:读写lcd显示缓冲区
*
*当前版本:v1.0
*作者:laoliu2008
*完成日期:2008年4月12日

*/

#i nclude
#i nclude全局变量.h>

unsignedcharxx,yy;//全局插入点坐标

externconstunsignedcharcharacter_tab[][17];//显示数据库
externconstunsignedcharChinese_characters_tab[][34];//显示数据库

unsignedcharlcd_bit_buffer[8][128];//显示缓冲区

//************************************
//lcd初始化
//7___________________________
//|||
//|||
///|\|||
//||||
//||||
//||||
//Y|_____________|_____________|
//|
//0----------->数学坐标:x127
//
//文字坐标:0_____
//||
//||
//|-----|
//||
//|_____|
//可以在任意点显示汉字字符
//首先调用w_xx_yy();写入要显示的字符在屏幕位置坐标(文字坐标为左上角)调用dis_buffer();显示一个汉字或英文
//dis_lcd_buffer()显示字符串Y地址自动右移8或16显示字符串可以自动保持一行
//坐标自动循环例如你在右下角x=119y=7的地方显示一个汉字这个汉字的3/4将会出现在屏幕的左上角
//字库16*16英文16*8文字的坐标参考点选则左上角即所说的在x=119y=7所说的是字符的左上角坐标
//************************************
//***********************************
//初始化缓冲区
//***********************************
voidlcd_buffer_ini()
{
unsignedcharx,y;
unsignedchartemp;

for(y=8;y>0;y--)//清零缓冲区
for(x=128;x>0;x--)
lcd_bit_buffer[y-1][x-1]=0;

xx=0;
yy=0;

}
//*******************************
//显示输出
//*******************************
voiddis_out_lcd()
{

unsignedcharx0,y0;
unsignedchartemp;
for(y0=8;y0>0;y0--)
{
w_lcd_address(y0-1,0);
for(x0=128;x0>0;x0--)
{

w_lcd_data(lcd_bit_buffer[y0-1][x0-1]);//调用显示函数
}
}

}

//********************************
//到xxyy写一点
//********************************
unsignedcharwb_lcd_bit_buffer()
{
unsignedchartemp;
unsignedchary1,y2;
//xxyy
{
y1=yy%8;//0-7bie
y2=yy>>3;//0-7行
temp=lcd_bit_buffer[y2][xx];
temp|=(1lcd_bit_buffer[y2][xx]=temp;
}
}
//********************************
//到xxyy擦一点
//********************************
unsignedcharn_wb_lcd_bit_buffer()
{
unsignedchartemp;
unsignedchary1,y2;
//xxyy
if((yy>63))
return0;
y1=yy%8;//0-7bie
y2=yy>>3;//0-7行
temp=lcd_bit_buffer[y2][xx];
temp&=~(1lcd_bit_buffer[y2][xx]=temp;

}
//********************************
//写显示地址xxyy
//********************************
voidw_xx_yy(unsignedcharx,unsignedchary)
{
xx=x%128;
yy=y%64;
}

//***********************************
//取反一个点
//***********************************
voidcpl_dian()
{

unsignedchartemp;
unsignedchary1,y2;
//xxyy

y1=yy%8;//0-7bie
y2=yy>>3;//0-7行
temp=lcd_bit_buffer[y2][xx];
temp^=(1lcd_bit_buffer[y2][xx]=temp;

}
//*******************************
//取反一个英文字符
//*******************************
voidcpl_asc()
{
unsignedchari,j;
unsignedcharx_x,y_y;
unsignedchartemp_data,y;

unsignedchartemp;
unsignedchary1,y2;
x_x=xx;
y=y_y=yy;//保存y轴

i=8;//显示字模8*16
while(i--)
{

yy=y;
//------------写一个字节---------------------------
for(j=8;j>0;j--)
{
y1=yy%8;//0-7bie
y2=yy>>3;//0-7行

temp=lcd_bit_buffer[y2][xx];//写一个点不调用函数减少调用浪费的系统时间
temp^=(1lcd_bit_buffer[y2][xx]=temp;

//yy=(yy+64-1)%64;//修正y地址
yy=(yy+63)%64;//修正y地址
}
//-------------------------------------------------
xx=(xx+1)%128;

}

y=yy;//显示下半个字

xx=x_x;//写x_x到xx
i=8;//显示字模8*16
while(i--)
{

yy=y;
//------------写一个字节---------------------------
for(j=8;j>0;j--)
{
y1=yy%8;//0-7bie
y2=yy>>3;//0-7行

temp=lcd_bit_buffer[y2][xx];
temp^=(1lcd_bit_buffer[y2][xx]=temp;

//yy=(yy+64-1)%64;//修正y地址
yy=(yy+63)%64;//修正y地址
}
//-------------------------------------------------
xx=(xx+1)%128;
}
yy=y_y;//恢复原y轴

}

//********************************
//显示一个英文字符
//********************************
voiddis_char_buffer(constunsignedchar*sp)
{
unsignedchari,j;
unsignedcharx_x,y_y;
unsignedchartemp_data,y;

unsignedchartemp;
unsignedchary1,y2;
x_x=xx;
y=y_y=yy;//保存y轴

i=8;//显示字模8*16
while(i--)
{
temp_data=*sp++;
yy=y;
//------------写一个字节---------------------------
for(j=8;j>0;j--)
{
y1=yy%8;//0-7bie
y2=yy>>3;//0-7行
temp=lcd_bit_buffer[y2][xx];
if(temp_data&0x80)//写点
temp|=(1
else
temp&=~(1lcd_bit_buffer[y2][xx]=temp;
temp_data<=1;
yy=(yy+64-1)%64;//修正y地址
}
//-------------------------------------------------
xx=(xx+1)%128;

}

y=yy;//显示下半个字

xx=x_x;//写x_x到xx
i=8;//显示字模8*16
while(i--)
{
temp_data=*sp++;
yy=y;
//------------写一个字节---------------------------
for(j=8;j>0;j--)
{
y1=yy%8;//0-7bie
y2=yy>>3;//0-7行
temp=lcd_bit_buffer[y2][xx];
if(temp_data&0x80)//写点
temp|=(1
else
temp&=~(1lcd_bit_buffer[y2][xx]=temp;
temp_data<=1;
yy=(yy+64-1)%64;//修正y地址
}
//-------------------------------------------------
xx=(xx+1)%128;
}
yy=y_y;//恢复原y轴

}
//********************************
//显示一个汉字
//********************************
voiddis_hz_buffer(constunsignedchar*sp)
{
unsignedchari,j;
unsignedcharx_x,y_y;
unsignedchartemp_data,y;

unsignedchartemp;
unsignedchary1,y2;
x_x=xx;
y=y_y=yy;//保存y轴

i=16;//显示字模8*16
while(i--)
{
temp_data=*sp++;
yy=y;
//------------写一个字节---------------------------
for(j=8;j>0;j--)
{
y1=yy%8;//0-7bie

y2=yy>>3;//0-7行
temp=lcd_bit_buffer[y2][xx];
if(temp_data&0x80)
temp|=(1else
temp&=~(1lcd_bit_buffer[y2][xx]=temp;
temp_data<=1;
yy=(yy+64-1)%64;//修正y地址
}
//-------------------------------------------------
xx=(xx+1)%128;
}

y=yy;//显示下半个字

xx=x_x;//写x_x到xx
i=16;//显示字模16*16
while(i--)
{
temp_data=*sp++;
yy=y;
//------------写一个字节---------------------------
for(j=8;j>0;j--)
{
y1=yy%8;//0-7bie
y2=yy>>3;//0-7行
temp=lcd_bit_buffer[y2][xx];
if(temp_data&0x80)//写点
temp|=(1else
temp&=~(1lcd_bit_buffer[y2][xx]=temp;
temp_data<=1;
yy=(yy+64-1)%64;//修正y地址
}
//-------------------------------------------------
xx=(xx+1)%128;
}
yy=y_y;//恢复原y轴
}
//*********************************
//显示一个汉字字符
//包含自动查字库
//*********************************
voiddis_buffer(unsignedintdata)
{
unsignedchartemp,data_temp;
unsignedchartemp_h,temp_l;
unsignedchara_temp;
unsignedchari;

if((data>>8)>128)
{
//汉字

i=0;
temp_h=(unsignedchar)(data>>8);
temp_l=(unsignedchar)(data&0x00ff);
while(1)
{
WDR();
if((Chinese_characters_tab[i][0]==0xff)&&(Chinese_characters_tab[i][1]==0xff))//查找失败失败显示黑色方块
break;

if((Chinese_characters_tab[i][0]==temp_h)&&(Chinese_characters_tab[i][1]==temp_l))//查找成功
break;
i++;
}

dis_hz_buffer(&Chinese_characters_tab[i][2]);

}
else//英文
{
i=0;
data_temp=(unsignedchar)data;
while(1)//查字库
{
WDR();
if(character_tab[i][0]==0xff)//查找失败失败显示黑色方块
break;

if(character_tab[i][0]==data_temp)//查找成功
break;
i++;
}

dis_char_buffer(&character_tab[i][1]);
}

}
//****************************
//显示字符串ram中
//****************************
voiddis_lcd_buffer(unsignedchar*aa)
{
while(*aa)
{

if(*aa>128)
{
dis_buffer(((*aa<8)|*(aa+1)));
aa+=2;
}
else
{
dis_buffer(*aa);
aa++;
}
}
}
//****************************
//显示字符串Rom中
//****************************
voiddis_lcd_buffer_rom(constunsignedchar*aa)
{
while(*aa)
{

if(*aa>128)
{
dis_buffer(((*aa<8)|*(aa+1)));
aa+=2;
}
else
{
dis_buffer(*aa);
aa++;
}
}
}
//*********************************************************

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top