打印

这个函数是向LCM12864的左右半屏各写入16X16的四个汉字,

[复制链接]
3794|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tdhlq|  楼主 | 2007-5-25 13:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/*---------------------------------------------------------------------------
*下面这个函数用于向液晶模块左右半屏写入汉字显示数据。
*函数入口参数:DisBuf-----向液晶模块写入的汉字显示数据
             Side_Num------液晶模块左右半屏的选择数
            Page_Num------开始显示页数(0----7),共八页
             Clm_Num------开始显示列数 (16的倍数),共64列
            Word_Num------每页显示的汉字个数(最多为4个)
---------------------------------------------------------------------------*/
void LCD_Play(uchar Page_Num,uchar Clm_Num,uchar Word_Num,uchar *DisBuf,uchar Side_Num)
{
  uchar i,k,COM;
                 
  COM=0xB8+Page_Num;
  LCD_WriteCommand(COM,Side_Num);    
  COM=0x40+Clm_Num;
  LCD_WriteCommand(COM,Side_Num);
  for(i=0;i<Word_Num;i++)       //每行显示汉字的个数
   {            
    for(k=0;k<16;k++)         //这个代表的是行还是列?
     {
      LCD_WriteData(DisBuf[k+32*i],Side_Num);//为什么是32,代表的是什么意思?我怎么觉得应该为16?
      }
    }

相关帖子

沙发
古道热肠| | 2007-5-25 16:24 | 只看该作者

把底层函数也贴出来,大家才好分析

   无头无尾,谁有精力整明白。

使用特权

评论回复
板凳
tdhlq|  楼主 | 2007-5-26 10:58 | 只看该作者

不知道斑竹说的底层函数指的哪些?我把相关的子程序都贴

code uchar Table[]=
{
/*--  文字:  欢  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x14,0x24,0x44,0x84,0x64,0x1C,0x20,0x18,0x0F,0xE8,0x08,0x08,0x28,0x18,0x08,0x00,
0x20,0x10,0x4C,0x43,0x43,0x2C,0x20,0x10,0x0C,0x03,0x06,0x18,0x30,0x60,0x20,0x00,

/*--  文字:  迎  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x40,0x41,0xCE,0x04,0x00,0xFC,0x04,0x02,0x02,0xFC,0x04,0x04,0x04,0xFC,0x00,0x00,
0x40,0x20,0x1F,0x20,0x40,0x47,0x42,0x41,0x40,0x5F,0x40,0x42,0x44,0x43,0x40,0x00,

/*--  文字:  光  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x40,0x42,0x44,0x5C,0xC8,0x40,0x7F,0x40,0xC0,0x50,0x4E,0x44,0x60,0x40,0x00,
0x00,0x80,0x40,0x20,0x18,0x07,0x00,0x00,0x00,0x3F,0x40,0x40,0x40,0x40,0x78,0x00,

/*--  文字:  临  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0xF8,0x00,0x00,0xFE,0x40,0x30,0x8F,0x0A,0x08,0x18,0x68,0x08,0x88,0x08,0x00,
0x00,0x1F,0x00,0x00,0x7F,0x00,0x00,0x7F,0x21,0x21,0x3F,0x21,0x21,0x7F,0x01,0x00
};
/*---------------------------------------------------------------------------- 
下面这个函数用于向液晶模块写入显示数据。 
函数入口参数:Data------ 向液晶模块写入的显示数据 。 
            CS_Num-------左右半屏的选数值 
----------------------------------------------------------------------------*/ 
void LCD_WriteData(uchar Data,uchar CS_Num) 

  LCD_Check_Busy();
  if(CS_Num==1)         /*选择左半屏*/
   {
     LCD_CS1 = 0;
     LCD_CS2 = 1;
    }
  else if(CS_Num==2)  /*选择右半屏*/
   {
     LCD_CS1 = 1;
     LCD_CS2 = 0;
    }
  LCD_EN = 0;
  LCD_RS = 1;       /* 置寄存器选择为H */ 
  LCD_RW = 0;       /* 置读/写选择为L */  
  LCD_PORT = Data;  /* 将显示数据输出到的数据端口 */ 
  LCD_EN = 1;       /* 使能信号为H */ 
  Delay_us(1);      /* 延时2us */ 
  LCD_EN = 0;       /* 使能信号为L */ 
  LCD_CS1= 1;       /* 置片选1为L */ 
  LCD_CS2= 1;       /* 置片选2为L */ 



/*---------------------------------------------------------------------------
*下面这个函数用于向液晶模块左右半屏写入汉字显示数据。
*函数入口参数:DisBuf-----向液晶模块写入的汉字显示数据
             Side_Num------液晶模块左右半屏的选择数
            Page_Num------开始显示页数(0----7),共八页
             Clm_Num------开始显示列数 (16的倍数),共64列
            Word_Num------每页显示的汉字个数(最多为4个)
---------------------------------------------------------------------------*/
void LCD_Play(uchar Page_Num,uchar Clm_Num,uchar Word_Num,uchar *DisBuf,uchar Side_Num)
{
  uchar i,k,COM;
                 
  COM=0xB8+Page_Num;
  LCD_WriteCommand(COM,Side_Num);    
  COM=0x40+Clm_Num;
  LCD_WriteCommand(COM,Side_Num);
  for(i=0;i<Word_Num;i++)       //每行显示汉字的个数
   {            
    for(k=0;k<16;k++)         
     {
      LCD_WriteData(DisBuf[k+32*i],Side_Num);//这句为什么是32?左半屏显示4个汉字应该为16呀?
      }
    }


  Page_Num++;
  COM=0xB8+Page_Num;
  LCD_WriteCommand(COM,Side_Num);    
  COM=0x40+Clm_Num;
  LCD_WriteCommand(COM,Side_Num);
  for(i=0;i<Word_Num;i++)
   {
    for(k=16;k<32;k++)
     {
      LCD_WriteData(DisBuf[k+32*i],Side_Num);//这句不明白为什么是32?而不是16?
      }
    }
  Delay_us(2);
}
/*---------------------------------------------------------------------------
下面这个函数为主函数,根据程序要实现的功能写相应的应用程序
---------------------------------------------------------------------------*/
void main(void) 


LCD_Initial(); 
while(1)
  {
  LCD_CLR(Left);
  LCD_CLR(Right);
  LCD_Play(2,0,4,Table,Left);
  LCD_Play(2,0,4,Table,Right);//有右半屏四个字略

  Delay_x10ms(250);
  Delay_x10ms(250);
  Delay_x10ms(250);
  Delay_x10ms(250);
 }
}

就是这句不明白 LCD_WriteData(DisBuf[k+32*i],Side_Num);我看了很多例子都是这样写LCD_WriteData(DisBuf[k+16*i],Side_Num);

使用特权

评论回复
地板
bin362422| | 2009-7-29 17:58 | 只看该作者

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

28

主题

47

帖子

0

粉丝