标题:
128*64液晶采用"单片机内部显示缓冲"的程序
[打印本页]
作者:
luoman
时间:
2010-8-20 09:28
标题:
128*64液晶采用"单片机内部显示缓冲"的程序
128*64液晶采用"单片机内部显示缓冲"的程序
/*
*
* 文件名称:
* 摘 要 : 读写lcd显示缓冲区
*
* 当前版本:v1.0
* 作 者 :laoliu2008
* 完成日期:2008年4月12日
*/
#i nclude <pcb.h>
#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_data(lcd_bit_buffer[y0-1][x0-1]);//调用显示函数
}
}
}
//********************************
// 到 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<<y1);
lcd_bit_buffer[y2][xx]=temp;
}
}
//********************************
// 到 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<<y1);
lcd_bit_buffer[y2][xx]=temp;
}
//********************************
// 写显示地址 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<<y1);
lcd_bit_buffer[y2][xx]=temp;
}
作者:
luoman
时间:
2010-8-20 09:29
//*******************************
// 取反一个 英文字符
//*******************************
void cpl_asc()
{
unsigned char i,j;
unsigned char x_x,y_y;
unsigned char temp_data,y;
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<<y1);
lcd_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-7 bie
y2=yy>>3; //0-7 行
temp=lcd_bit_buffer[y2][xx];
temp^=(1<<y1);
lcd_bit_buffer[y2][xx]=temp;
// 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_data,y;
unsigned char temp;
unsigned char y1,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-7 bie
y2=yy>>3; //0-7 行
temp=lcd_bit_buffer[y2][xx];
if(temp_data&0x80)//写点
temp|=(1<<y1);
else
temp&=~(1<<y1);
lcd_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-7 bie
y2=yy>>3; //0-7 行
temp=lcd_bit_buffer[y2][xx];
if(temp_data&0x80)//写点
temp|=(1<<y1);
else
temp&=~(1<<y1);
lcd_bit_buffer[y2][xx]=temp;
temp_data<<=1;
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_data,y;
unsigned char temp;
unsigned char y1,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-7 bie
y2=yy>>3; //0-7 行
temp=lcd_bit_buffer[y2][xx];
if(temp_data&0x80)
temp|=(1<<y1); //写点
else
temp&=~(1<<y1); //擦点
lcd_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-7 bie
y2=yy>>3; //0-7 行
temp=lcd_bit_buffer[y2][xx];
if(temp_data&0x80)//写点
temp|=(1<<y1);
else
temp&=~(1<<y1);
lcd_bit_buffer[y2][xx]=temp;
temp_data<<=1;
yy=(yy+64-1)%64;//修正y地址
}
//-------------------------------------------------
xx=(xx+1)%128;
}
yy=y_y; // 恢复原y轴
}
//*********************************
// 显示一个汉字 字符
// 包含自动查字库
//*********************************
void dis_buffer(unsigned int data)
{
unsigned char temp,data_temp;
unsigned char temp_h,temp_l;
unsigned char a_temp;
unsigned char i;
if((data>>8)>128)
{
//汉字
i=0;
temp_h=( unsigned char)(data>>8);
temp_l=( unsigned char)(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=(unsigned char)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中
//****************************
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 data[32];
} 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,
};
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/)
Powered by Discuz! 7.0.0