Board logo

标题: 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