您的位置:首页单片机MSP430单片机
内容搜索:
阅读内容
背景:#EDF0F5 #FAFBE6 #FFF2E2 #FDE6E0 #F3FFE1 #DAFAF3 #EAEAEF 默认  

MSP430单片机驱动T6963c液晶C程序

[日期:2008-08-09 ] [来源:东哥单片机学习网 www.picavr.com 作者:佚名] [字体: (投递新闻)
MSP430单片机控制T6963c驱动液晶LCD源代码。
T6963C是一款在仪表中使用得比较多的一种液晶显示控制器。提供文本和点阵两种输出方式,但点阵输出的速度比文本显示的速度要慢很多。在文本方式下,其CGROM控制128个英文ASCII码字符,CGRAM则可由用户自定义32个汉字或128个自定义图形。 

由于仪表中使用的汉字经常超过32个,因此,需要对汉字的显示作特别的处理。但由于汉字的处理有些特殊,因此,很多开发人员即偷懒,直接使用点阵需出。 

昨天,我到一家比较有名的电力企业参观,见其仪表的显示速度非常之慢,可以断定它的显示是采用点阵而不是采用文本方式,于是写了此文章。 

 

原理: 

利用液晶故有的CGRAM,将一个汉字作为四个字符,以文本方式显示汉字。 

方法: 

CGRAM中能显示的字符从80H到FFH,共128个。其中,每连续四个字符作为显示一个汉字。故能显示的汉字量为32个。但在系统中使用的汉字数可能会超过32个。所以,采用数据缓冲技术,在需要显示汉字时,临时构成字符显示码。 

汉字点阵是以表格形式ChineseTable保存在数据区中。 

建立一个长度为16的字符数组CharFlagTable,用来保存当前系统CGRAM中可显示的汉字编号。为了加快系统显示汉字的速度,将汉字分成两组:一级汉字;二级汉字,一级汉字永远保存在CGRAM中,不需要记录编号;而二级汉字在需要显示时,才调于到CGRAM中,需要CharFlagTable来记录编号。其中一级汉字为16个,规定在ChineseTable中前16个汉字为一级汉字,其余的汉字为二级汉字。 

程序初始化时,将一级汉字调入和前16个二级汉字同时调入CGRAM;并将CharFlagTable的内容清为0。 

WriteOneChin函数实现方法: 

根据需要显示的汉字的编号,计算此汉字对应的CharFlagTable编号Num和序列编号Offset,计算方法为:
/*************************************
读液晶状态字到STA
功能:用于往液晶写数据或命令之前判断忙闲
*************************************/
void read_sta(void)
{
   P4DIR = 0x00;          //P4数据输入
   P3OUT |=  P3_2_DATAIO; //4245(x1)数据传送方向选择为:由液晶到430
   P3OUT |=  P3_1_CD;     //命令方式
   P3OUT &= ~P3_0_RD;     //read
   STA = P4IN;            //读回状态
   P3OUT |= P3_0_RD;      //cancel read
   P4DIR = 0xff;          //P4口置为数据输出方式    
   P3OUT &= ~P3_2_DATAIO; //4245(x1)数据传送方向选择为:由430到液晶

}
/*********************
判状态位S1,S0 函数(读写指令和读写数据状态)
************************************/
void ST1( void )
    {
      do
        {
        read_sta();
        }
      while( (STA & 0x03) != 0x03 );

    }
/****************************************************
判状态位S2函数(数据自动读状态)
*****************************************/
void ST2( void )
   {
     do
     {
       read_sta();
     }
    while( (STA & 0x04) != 0x04);
   }
/-判状态位S3函数(数据自动写状态)-
**************************************************/
void ST3( void )
   {
     do
     {
       read_sta();
     }
     while( (STA & 0x08) != 0x08 );
   }
/****************************************************写入数据字节
*******************************************************/
void write_data(unsigned char Byte )
{
        ST1();
 P4OUT = Byte;
 P3OUT &= ~P3_1_CD;       //数据方式
 P2OUT &= ~P2_7_WR ;      // write
 P2OUT |=  P2_7_WR ;    
}
/*****************************************************************************
自动写入数据字节
******************************************************************************/
void autowrite_data(unsigned char Byte )
{
 P4OUT = Byte;
 P3OUT &= ~P3_1_CD;       //数据方式
 P2OUT &= ~P2_7_WR ;      // write
 P2OUT |=  P2_7_WR ;    
}

/*************************************
写入命令字
**************************************************/
void write_cmd(unsigned char cmd )
{
        ST1();
 P4OUT = cmd ;
 P3OUT |=  P3_1_CD  ;      //命令方式
 P2OUT &= ~P2_7_WR ;       // write
 P2OUT |=  P2_7_WR ;    
}
/***************************************************
写只有一个参数的命令
*********************************************************/
void write_onepara(unsigned char dat1,unsigned char command )
{

 write_data( dat1 );
 write_cmd( command );
 
}
/******************************************************
写含有双参数的命令
*********************************************************/
void write_doublepara(unsigned char dat1,unsigned char dat2,unsigned char command )
{

        write_data( dat1 );
 write_data( dat2 );
 write_cmd( command );
 
}
/**************************************************************
清显示缓冲的函数
****************************************************/
void CLEAR_RAM( void )
    {
    int i;
    write_doublepara( 0x00,0x00,0x24 );       /* 设置显示RAM 首地址 */
  
    write_cmd( 0xb0 );                        /* 设置自动写方式 */
 
    for(i=0;i<8200;i++)                       /* 清8K存储器 */
       {         
         ST3();                               /* 判状态位S3 */
         write_data(0x00);                    /* 写入数据 */            
        }
     write_cmd( 0xb2 );                       /* 设置自动写结束指令 */        
       
    }
/********************************************************
对液晶屏的一些初始设置函数
**************************************************/
void LcdIni( void )
    {
       write_doublepara(0x00,0x00,0x40);       /*设文本显示区域首地址*/
       write_doublepara(0x28,0x00,0x41);       /*设文本显示区域宽度*/
       write_doublepara(0x03,0x00,0x22);    /* 设置CGRAM偏置地址 */

       write_doublepara(0x00,0x08,0x42);       /*设图形显示区域首地址*/
       write_doublepara(0x1e,0x00,0x43);       /*设图形显示区域宽度*/
 //      write_cmd(0xa2);                        /*光标形状设置*/   
  //     write_doublepara(0x08,0x08,0x21);       /* 设置光标 位置*/ 
       write_cmd(0x80);                        /*显示方式设置逻辑"或"合成, 内部字符发生器有效*/
       write_cmd(0x98);                        /*显示开关设置 关文本和开图形显示*/
       CLEAR_RAM();
    } 

 
阅读:
录入:JETTA

推荐 】 【 打印
本文评论
      全部评论
发表评论


点评: 字数
姓名:
站长推荐