*
* 文件名称:
* 摘 要 : 读写lcd显示缓冲区
*
* 当前版本:v1.0
* 作 者 :laoliu2008
* 完成日期:2008年4月12日
*/
#i nclude
#i nclude <全局变量.h>
unsigned char xx,yy;//全局插入点坐标
extern const unsigned char character_tab[][17]; //显示数据库
extern const unsigned char Chinese_characters_tab[][34];//显示数据库
unsigned char lcd_bit_buffer[8][128];//显示缓冲区
//************************************
// lcd 初始化
// 7 ___________________________
// | | |
// | | |
// /|\| | |
// | | | |
// | | | |
// | | | |
// Y |_____________|_____________|
// |
// 0 -----------> 数学坐标:x 127
//
// 文字坐标: 0 _____
// | |
// | |
// |-----|
// | |
// |_____|
// 可以在任意点显示汉字字符
// 首先调用 w_xx_yy();写入要显示的字符在屏幕位置坐标 (文字坐标为左上角) 调用dis_buffer();显示一个汉字或英文
// dis_lcd_buffer() 显示字符串 Y地址自动右移8 或16 显示字符串可以自动保持一行
// 坐标自动循环 例如你在右下角x=119 y=7 的地方显示一个汉字 这个汉字的3/4将会出现在屏幕的左上角
// 字库 16*16 英文 16*8 文字的坐标参考点选则左上角 即所说的在x=119 y=7 所说的是字符的左上角坐标
//************************************
//***********************************
// 初始化缓冲区
//***********************************
void lcd_buffer_ini()
{
unsigned char x,y;
unsigned char temp;
for(y=8;y>0;y--)//清零缓冲区
for(x=128;x>0;x--)
lcd_bit_buffer[y-1][x-1]=0;
xx=0;
yy=0;
}
//*******************************
// 显示输出
//*******************************
void dis_out_lcd()
{
unsigned char x0,y0;
unsigned char temp;
for(y0=8;y0>0;y0--)
{
w_lcd_address(y0-1,0);
for(x0=128;x0>0;x0--)
{
w_lcd_da
}
}
}
//********************************
// 到 xx yy 写一点
//********************************
unsigned char wb_lcd_bit_buffer()
{
unsigned char temp;
unsigned char y1,y2;
// xx yy
{
y1=yy%8; // 0-7 bie
y2=yy>>3; //0-7 行
temp=lcd_bit_buffer[y2][xx];
temp|=(1<
}
}
//********************************
// 到 xx yy 擦一点
//********************************
unsigned char n_wb_lcd_bit_buffer()
{
unsigned char temp;
unsigned char y1,y2;
// xx yy
if((yy>63))
return 0;
y1=yy%8; // 0-7 bie
y2=yy>>3; //0-7 行
temp=lcd_bit_buffer[y2][xx];
temp&=~(1<
}
//********************************
// 写显示地址 xx yy
//********************************
void w_xx_yy(unsigned char x,unsigned char y)
{
xx=x%128;
yy=y%64;
}
//***********************************
// 取反一个点
//***********************************
void cpl_dian()
{
unsigned char temp;
unsigned char y1,y2;
// xx yy
y1=yy%8; // 0-7 bie
y2=yy>>3; //0-7 行
temp=lcd_bit_buffer[y2][xx];
temp^=(1<
}
//*******************************
// 取反一个 英文字符
//*******************************
void cpl_asc()
{
unsigned char i,j;
unsigned char x_x,y_y;
unsigned char temp_da
unsigned char temp;
unsigned char y1,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-7 bie
y2=yy>>3; //0-7 行
temp=lcd_bit_buffer[y2][xx];//写一个点 不调用函数减少调用浪费的系统时间
temp^=(1<
//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-7 bie
y2=yy>>3; //0-7 行
temp=lcd_bit_buffer[y2][xx];
temp^=(1<
// yy=(yy+64-1)%64;//修正y地址
yy=(yy+63)%64;//修正y地址
}
//-------------------------------------------------
xx=(xx+1)%128;
}
yy=y_y; // 恢复原y轴
}
//********************************
// 显示一个 英文字符
//********************************
void dis_char_buffer(const unsigned char *sp)
{
unsigned char i,j;
unsigned char x_x,y_y;
unsigned char temp_da
unsigned char temp;
unsigned char y1,y2;
x_x=xx;
y=y_y=yy; //保存 y轴
i=8;//显示 字模 8*16
while(i--)
{
temp_da
yy=y;
//------------写一个字节---------------------------
for(j=8;j>0;j--)
{
y1=yy%8; // 0-7 bie
y2=yy>>3; //0-7 行
temp=lcd_bit_buffer[y2][xx];
if(temp_da
temp|=(1<
else
temp&=~(1<
temp_da
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_da
yy=y;
//------------写一个字节---------------------------
for(j=8;j>0;j--)
{
y1=yy%8; // 0-7 bie
y2=yy>>3; //0-7 行
temp=lcd_bit_buffer[y2][xx];
if(temp_da
temp|=(1<
else
temp&=~(1<
temp_da
yy=(yy+64-1)%64;//修正y地址
}
//-------------------------------------------------
xx=(xx+1)%128;
}
yy=y_y; // 恢复原y轴
}
//********************************
// 显示一个 汉字
//********************************
void dis_hz_buffer(const unsigned char *sp)
{
unsigned char i,j;
unsigned char x_x,y_y;
unsigned char temp_da
unsigned char temp;
unsigned char y1,y2;
x_x=xx;
y=y_y=yy; //保存 y轴
i=16;//显示 字模 8*16
while(i--)
{
temp_da
yy=y;
//------------写一个字节---------------------------
for(j=8;j>0;j--)
{
y1=yy%8; // 0-7 bie
y2=yy>>3; //0-7 行
temp=lcd_bit_buffer[y2][xx];
if(temp_da
temp|=(1<
temp&=~(1<
temp_da
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_da
yy=y;
//------------写一个字节---------------------------
for(j=8;j>0;j--)
{
y1=yy%8; // 0-7 bie
y2=yy>>3; //0-7 行
temp=lcd_bit_buffer[y2][xx];
if(temp_da
temp|=(1<
temp&=~(1<
temp_da
yy=(yy+64-1)%64;//修正y地址
}
//-------------------------------------------------
xx=(xx+1)%128;
}
yy=y_y; // 恢复原y轴
}
//*********************************
// 显示一个汉字 字符
// 包含自动查字库
//*********************************
void dis_buffer(unsigned int da
{
unsigned char temp,da
unsigned char temp_h,temp_l;
unsigned char a_temp;
unsigned char i;
if((da
{
//汉字
i=0;
temp_h=( unsigned char)(da
temp_l=( unsigned char)(da
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;
da
while(1) //查字库
{
WDR();
if(character_tab[i][0]==0xff)//查找失败 失败显示黑色方块
break;
if(character_tab[i][0]==da
break;
i++;
}
dis_char_buffer(&character_tab[i][1]);
}
}
//****************************
// 显示字符串 ram中
//****************************
void dis_lcd_buffer(unsigned char *aa)
{
while(*aa)
{
if(*aa>128)
{
dis_buffer( ((*aa<<8)|*(aa+1)) );
aa+=2;
}
else
{
dis_buffer(*aa);
aa++;
}
}
}
//****************************
// 显示字符串 Rom中
//****************************
void dis_lcd_buffer_rom(const unsigned char *aa)
{
while(*aa)
{
if(*aa>128)
{
dis_buffer( ((*aa<<8)|*(aa+1)) );
aa+=2;
}
else
{
dis_buffer(*aa);
aa++;
}
}
}
//*********************************************************
-----------------------------------------------------------------------------------------------------------
//字库结构
// 汉字
typedef const struct{
const unsigned char cha[2];
const unsigned char da
} character_struct;
character_struct Chinese_characters_tab[]={
{
{"温"},
{0x08,0x84,0x61,0x0E,0x00,0x7E,0x52,0x52,0x52,0x52,0x52,0x7E,0x00,0x00,0x00,0x00,
0x40,0x7F,0x80,0x02,0xFE,0x82,0x82,0xFE,0x82,0x82,0xFE,0x82,0x82,0xFE,0x02,0x00},
},
{
{"度"},
{0x00,0x00,0x3F,0x20,0x24,0x24,0x3F,0xA5,0x65,0x25,0x3F,0x24,0x24,0x24,0x20,0x00,
0x01,0x06,0xF8,0x01,0x01,0x42,0x62,0x54,0x48,0x48,0x54,0x64,0x42,0x03,0x02,0x00,},
},
//.......................
//结束标志
{
{0xff,0xff},
{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, }
},
};
//英文
const unsigned char character_tab[][17]={
/*-- 文字: ! --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
'!',0x00,0x00,0x00,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xCC,0x0C,0x00,0x00,0x00,
//'!',0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
/*-- 文字: # --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
'#',0x02,0x03,0x1E,0x02,0x03,0x1E,0x02,0x00,0x20,0xFC,0x20,0x20,0xFC,0x20,0x20,0x00,
//'#',0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
/*-- 文字: % --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
'%',0x0F,0x10,0x0F,0x00,0x07,0x18,0x00,0x00,0x00,0x84,0x38,0xC0,0x78,0x84,0x78,0x00,
/*-- 文字: * --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
'*',0x02,0x02,0x01,0x0F,0x01,0x02,0x02,0x00,0x40,0x40,0x80,0xF0,0x80,0x40,0x40,0x00,
/*-- 文字: - --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
'-',0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
/*-- 文字: + --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
'+',0x00,0x00,0x00,0x0F,0x00,0x00,0x00,0x00,0x80,0x80,0x80,0xF8,0x80,0x80,0x80,0x00,
/*-- 文字: = --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
'=',0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,
/*-- 文字: [ --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
'[',0x00,0x00,0x00,0x7F,0x40,0x40,0x40,0x00,0x00,0x00,0x00,0xFE,0x02,0x02,0x02,0x00,
/*-- 文字: ] --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
']',0x00,0x40,0x40,0x40,0x7F,0x00,0x00,0x00,0x00,0x02,0x02,0x02,0xFE,0x00,0x00,0x00,
/*-- 文字: ? --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
'?',0x00,0x0E,0x12,0x10,0x10,0x10,0x0F,0x00,0x00,0x00,0x00,0x0C,0x6C,0x80,0x00,0x00,
/*-- 文字: / --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
'/',0x00,0x00,0x00,0x00,0x01,0x06,0x18,0x20,0x00,0x06,0x18,0x60,0x80,0x00,0x00,0x00,
/*-- 文字: \ --*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/
0x5c,0x00,0x30,0x0C,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x60,0x1C,0x03,0x00,
/*-- 文字: 空格 --*/
/*-- New Century Schoolbook12; 此字体下对应的点阵为:宽x高=8x16 --*/
' ',0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
//摄氏度符号
0xfe, 0x18,0x18,0x03,0x04,0x08,0x08,0x08,0x04,0x00,0x00,0xF0,0x08,0x04,0x04,0x04,0x08,
//结束标志
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
};
上一篇:一个51单片机实现数字时钟(1602显示)
下一篇:KEIL51调试时一些错误总结
推荐阅读最新更新时间:2024-03-16 15:11