ilan2003 发表于 2004-12-3 19:09:17

我整理的T6963控制芯片的液晶驱动的函数 (在51环境中可一运行,AVR没有试,应该可以

/********************************************************************************

                                 [文件名]T6963.c

                                 [功能] 240X128液晶驱动程序

                                 [修改时间]:2004-8-18

********************************************************************************/

#include <reg52.h>

#include <math.h>

#include <ctype.h>

#include <stdlib.h>

#include <stdio.h>

#include <absacc.h>





************************************************************



                     数据类型定义



************************************************************/



#defineucharunsigned char

#defineuint        unsigned int







/********************************************************************************

                        以8*8字符计算,显示屏横向、纵向可以显示的字符个数

                                  以240*128为例:

********************************************************************************/

#define LineChar 30                     //一行30个字符(8*8)

#define ColumnChar 16                   //总共16列





//指令,数据 读写状态检查

#define RWCheck() { unsigned char sta; do{ sta=XBYTE & 0x03; } while(sta!=0x03); }

//数据自动读 状态检查

#define AutoRCheck() { unsigned char sta; do{ sta=XBYTE & 0x04; } while(sta!=0x04); }

//数据自动写 状态检查

#define AutoWCheck() { unsigned char sta; do{ sta=XBYTE & 0x08; } while(sta!=0x08); }





/********************************************************************************



                  设置液晶显示器数据地址和指令地址



********************************************************************************/

#define ComPort                 0xfc01

#define DataPort                 0xfc00

#define GraphAddrL                 0xF0                    //图形首地址低8位

#define GraphAddrH                0x01                        //图形首地址高8位

#define GraphicStartAddr        0x01F0                        //图形首地址

#define TextAddrL                 0x00                    //文本首地址低8位

#define TextAddrH                 0x00                    //文本首地址高8位

#define        TextStartAddr                0x00                        //文本首地址





/************************************************************



                      指令代码定义



************************************************************/

#defineCursorPointer 0x21    //光标地址设置

#defineOffsetReg   0x22    //CGRAM偏移地址设置

#defineAddPointer    0x24    //显示地址设置

#defineTextHomeAdd   0x40    //文本首地址

#defineTextArea      0x41    //文本宽度设置

#defineGraHomeAdd    0x42    //图形首地址设置

#defineGraArea       0x43    //图形宽度设置

#defineOrMode      0x80    //或模式显示

#defineExorMode      0x81    //异或模式显示

#defineAndMode       0x83    //与模式显示

#defineTextAttMode   0x84    //文本属性模式

#defineInterCGROME   0       //内部CGROM

#defineExCGRAM       0x08    //外部CGRAM

#defineDisplayOff    0x90    //显示关闭

#defineCursorOn      0x92    //光标显示,但不闪烁

#defineCursorBlink   0x93    //光标闪烁

#defineTextOn      0x94    //文本模式打开

#defineGraOn         0x98    //图形模式打开

#defineTGAllOn       0x9c    //文本图形模式都打开

#defineCursor1       0xa0    //光标形状一行显示

#defineCursor2       0xa1    //光标形状二行显示

#defineCursor3       0xa2    //光标形状三行显示

#defineCursor4       0xa3    //光标形状四行显示

#defineCursor5       0xa4    //光标形状五行显示

#defineCursor6       0xa5    //光标形状六行显示

#defineCursor7       0xa6    //光标形状七行显示

#defineCursor8       0xa7    //光标形状八行显示

#defineDataAutoWrite 0xb0    //数据自动写

#defineDataAutoRead0xb1    //数据自动读

#defineExitAutoRW    0xb2    //退出数据自动读写模式

#defineDataWAddI   0xc0    //数据写,地址加1

#defineDataWAddD   0xc2    //数据写,地址减1

#defineDataWAddNV    0xc4    //数据写,地址不变

#defineDataRAddI   0xc1    //数据读,地址加1

#defineDataRAddD   0xc3    //数据读,地址减1

#defineDataRAddNV    0xc5    //数据读,地址不变

#defineScreenPeek    0xe0    //屏读

#defineScreenCopy    0xe1    //屏拷贝



















/********************************************************************************



                            输入/出函数,与T6963通讯



********************************************************************************/

/*自动写状态时向发送数据*/

#define AutoOutPortData(dat){AutoWCheck();XBYTE=dat;}

/*自动写状态时向发送数据*/

#define AutoInPortData(){AutoRCheck();return(XBYTE);}

// 向数据口发Data

#define OutPortData(dat ) { RWCheck(); XBYTE=dat; }



//写有 1 个参数命令

#define OutPortCom1(command) { RWCheck(); XBYTE= command; }



//写有 2 个参数命令

#define OutPortCom2(dat, command) { OutPortData(dat); OutPortCom1(command); }



//写有 3 个参数命令

#define OutPortCom3(data1, data2, command) { OutPortData(data1); OutPortData(data2); OutPortCom1(command);}



//从外部读数据

unsigned char InPortData()

{

       RWCheck(); return(XBYTE);

}





unsigned char Cursor_X,Cursor_Y;                                    //光标的坐标

uchar CtrlData=0;





/********************************************************************************

                     显示8*16字符

                     lin:行(0-29), column: 列(0-111)

                     ch:字符代码(标准ASCII码)

********************************************************************************/

void ShowChar(unsigned char lin,unsigned char column,unsigned char ch)

{

    unsigned char i;

    unsigned char dat;

    unsigned int StartAddr;



   StartAddr=column*LineChar + lin+GraphicStartAddr;                   //定位起始行



    for(i=0;i<16;i++)

    {

      dat=ASCII816[ ch-0x20 ];

      OutPortCom3( (unsigned char)(StartAddr), (unsigned char)(StartAddr>>8), 0x24);

      OutPortCom2( dat, 0xc4);



      StartAddr=StartAddr + LineChar;

    }

}





/********************************************************************************

函数名:ShowText(unsigned char lin,unsigned char column,unsigned char *ch)

函数功能:显示一字符串

********************************************************************************/

void ShowText(unsigned char lin,unsigned char column,unsigned char *ch)

{

    unsigned char i;

    unsigned char dat;

    unsigned int StartAddr;

    while(*ch)

    {

      ShowChar(lin,column,*ch);

      lin++;

      ch++;

    }



}



/********************************************************************************

函数名:ShowNumber(unsigned char lin,unsigned char column,unsigned char Number)

函数功能:显示一个数字;用CGRAM,暂时不用

********************************************************************************/

/*void ShowNumber(unsigned char lin,unsigned char column,unsigned char Number)

{

        unsigned int         Addr;

        unsigned char        NumberCode;

        NumberCode=0x80+Number*2;

        Addr=column*LineChar+lin;

        OutPortCom3((uchar)Addr,(uchar)(Addr>>8),0x24);

        OutPortCom2(NumberCode,DataWAddNV);

        Addr+=LineChar;

        OutPortCom3((uchar)Addr,(uchar)(Addr>>8),0x24);

        OutPortCom2(NumberCode+1,DataWAddNV);

}*/





/********************************************************************************

函数名: ShowHZ(unsigned char lin,unsigned char column,unsigned int hzcode)

函数功能:显示一个汉字(16*12点阵),lin:行(0-7), column: 列(0-7),汉字代码(自定义的)

********************************************************************************/

void ShowHZ(unsigned char lin,unsigned char column,unsigned int hzcode)

{

    unsigned char i,temp1,temp2;

    unsigned int StartAddr;



    StartAddr=column*LineChar + lin+GraphicStartAddr;                                 //定位起始行



    for(i=0;i<12;i++)

    {

      OutPortCom3( (unsigned char)(StartAddr), (unsigned char)(StartAddr>>8), 0x24);

      temp1=HZTable;

    //temp1=HZTable;

      OutPortCom2(temp1, 0xc0);                                 //左半部 地址加一

      temp2=HZTable;

    //temp2=HZTable;

      OutPortCom2(temp2, 0xc4);                                 //右半部 字模地址加一



      StartAddr=StartAddr + LineChar;

    }

}





/********************************************************************************

函数名:void ShowHZ1(unsigned char lin,unsigned char column,unsigned int hzcode)

函数功能:显示一个汉字(16*14点阵),lin:行(0-7), column: 列(0-7hzcode: 汉字代码(自定义的)

********************************************************************************/

void ShowHZ1(unsigned char lin,unsigned char column,unsigned int hzcode)

{

    unsigned char i,temp1,temp2;

    unsigned int StartAddr;



    StartAddr=column*LineChar + lin+GraphicStartAddr;                 //定位起始行



    for(i=0;i<14;i++)

    {

      OutPortCom3( (unsigned char)(StartAddr), (unsigned char)(StartAddr>>8), 0x24);

      temp1=HZTable1;

      OutPortCom2(temp1, 0xc0);                                 //左半部 地址加一

      temp2=HZTable1;

      OutPortCom2(temp2, 0xc4);                                 //右半部 字模地址加一



      StartAddr=StartAddr + LineChar;

    }

}









/********************************************************************************

函数名:void ShowHZ1(unsigned char lin,unsigned char column,unsigned int hzcode)

函数功能:显示一个汉字(16*16点阵),lin:行(0-7), column: 列(0-7hzcode: 汉字代码(自定义的)

********************************************************************************/

void ShowHZ2(unsigned char lin,unsigned char column,unsigned int hzcode)

{

    unsigned char i,temp1,temp2;

    unsigned int StartAddr;



    StartAddr=column*LineChar + lin+GraphicStartAddr;                 //定位起始行



    for(i=0;i<16;i++)

    {

      OutPortCom3( (unsigned char)(StartAddr), (unsigned char)(StartAddr>>8), 0x24);

      temp1=HZTable2;

      OutPortCom2(temp1, 0xc0);                                 //左半部 地址加一

      temp2=HZTable2;

      OutPortCom2(temp2, 0xc4);                                 //右半部 字模地址加一

      StartAddr=StartAddr + LineChar;

    }

}



/********************************************************************************

函数名: ShowHZWord(uchar lin,uchar colum,uchar code,uchar num)

函数功能:显示连续编码的几个汉字

code 汉字编码,num,汉字个数

********************************************************************************/

void ShowHZWord(uchar lin,uchar col,uchar num,uchar coding)

{

        uchar i;

        for(i=0;i<num;i++)

        {

                ShowHZ1(i*2+lin,col,coding+i);



        }

}



/********************************************************************************

函数名: void ShowLine(unsigned char lin,unsigned char column,unsigned char linehead[])

函数功能:显示一行字符串(汉字,字母混排,一行16字节)

lin:行

lineheadaddr: 此行汉字代码区首地址

********************************************************************************/



/*void ShowLine(unsigned char lin,unsigned char column,unsigned char linehead[])

{

   unsigned char i,j;

   unsigned char byte;

   unsigned int hzcode;



   for( i= column,j=0; i< column+14 ; )

   {

   byte=linehead;

   if(byte < 0x80)                                                 //字母

   {

       ShowChar(lin, i , byte);

       i=i+1;j=j+1;

   }

   else                                                        // byte >= 0x80(汉字)

   {

       byte=byte & 0x7f;                                        //最高位置0,即:减去0x8000

       hzcode=byte*256 + linehead;                         //加低8位,组合成整型数地址

       ShowHZ( lin,i,hzcode);

       i=i+2;j=j+2;

   }

   }

}*/





/********************************************************************************

函数名:ShowPage(unsigned char lin,unsigned char column1,unsigned char pagehead[])

函数功能:显示一屏汉字ageheadaddr:此屏汉字代码地址区首地址?

********************************************************************************/

/*void ShowPage(unsigned char lin,unsigned char column1,unsigned char pagehead[])

{

   unsigned char i;

   for(i=0;i< 4 ;i++)

   ShowLine((lin+i*20),column1,pagehead);                         //1行8个汉字,16字节

}*/





/********************************************************************************

函数名: ReverseShowChar(unsigned char lin,unsigned char column)

函数功能: 反显一个字符 ,lin:行(0-7), column: 列(0-15)

********************************************************************************/

void ReverseShowChar(unsigned char lin,unsigned char column)

{

   unsigned char i;

   unsigned char dat;

   unsigned int StartAddr;



   StartAddr=lin*LineChar +column+GraphicStartAddr;               //定位起始行



   for(i=0;i<16;i++)

   {

   OutPortCom3( (unsigned char)(StartAddr), (unsigned char)(StartAddr>>8), 0x24); //set address

   OutPortCom1( 0xc5 );                                         //数据一次读,地址不变

   dat=InPortData();                                                 //读入数据

   dat=~dat;                                                         //取反

   OutPortCom2( dat, 0xc4);                                         //送回



   StartAddr=StartAddr+ LineChar;

   }

}





/********************************************************************************

函数名: ReverseShowHZ(unsigned char lin,unsigned char column)

函数功能:反显一个汉字 ,lin:行(0-7), column: 列(0-15)

********************************************************************************/

void ReverseShowHZ(unsigned char lin,unsigned char column)

{

   ReverseShowChar(lin,column);

   ReverseShowChar(lin,column+1);

}



/********************************************************************************

函数名: ReverseShowLine(unsigned char lin)

函数功能:反显一行汉字,lin:行(0-7)

********************************************************************************/

void ReverseShowLine(unsigned char lin)

{

   unsigned char column;

   for(column=0; column< ColumnChar; column++) ReverseShowChar(lin,column);

}





/********************************************************************************

函数名:ShowPicture(unsigned char Startline,unsigned char Startcolumn,unsigned char LineWidth,unsigned char ColumnWidth,unsigned int address)

函数功能:

********************************************************************************/

/*void ShowPicture(unsigned char Startline,unsigned char Startcolumn,unsigned char LineWidth,unsigned char ColumnWidth,unsigned int address)

{

   unsigned char i,j;

   unsigned int StartAddr;



   StartAddr=Startline*LineChar + Startcolumn+GraphicStartAddr;                                          //定位起始位置



   for(i=0;i<ColumnWidth;i++)

   {

   OutPortCom3( (unsigned char)(StartAddr), (unsigned char)(StartAddr>>8), 0x24);   //set address

   for(j=0;j<LineWidth;j++)

   {

       OutPortCom2( CBYTE, 0xc0);

   }

   StartAddr=StartAddr + LineChar;

   }

}*/



/********************************************************************************

函数名: Pixel(unsigned char PointX,unsigned char PointY, bit Mode)

函数功能:图形函数,用于描点画图,在指定位置显示一个点;

如果显示屏超过了256*256,请修改这个函数 PointX,PointY的类型;

Mode 1:显示 0:清除该点

********************************************************************************/

Pixel(unsigned char PointX,unsigned char PointY, bit Mode)

{

   unsigned int StartAddr=GraphicStartAddr;

   unsigned char dat;

   StartAddr+=PointY*LineChar + PointX/8;

// StartAddr=PointY*240 + PointX;

   dat=0xf0+7-PointX%8;

// dat=0xf0;

   if(Mode) dat=dat|0x08;



   OutPortCom3( (unsigned char)(StartAddr),(unsigned char)(StartAddr>>8),0x24 );

   //设置该点所在单元地址

   OutPortCom1(dat);

}





/********************************************************************************

函数名:Lcd_Line( unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2, bit Mode)

函数功能: 画两点的直线

********************************************************************************/

void Lcd_Line( unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2, bit Mode)

{

   unsigned char x,y;

   float k,b;

      y1=128-y1;

      y2=128-y2;

   if( abs(y1-y2) <= abs(x1-x2) ) // |k|<=1

   {

   k=(y2*1.0-y1*1.0) / (x2*1.0-x1*1.0) ;

   b=y1-k*x1;



   if( x1 <= x2 )

   {

       for(x=x1;x<=x2;x++)

       {

         y=k*x+b;

         Pixel(x, y, Mode);

       }

   }

   else

   {

       for(x=x2;x<=x1;x++)

       {

         y=k*x+b;

         Pixel(x, y, Mode);

       }

   }

   }

   else // abs(y1-y2) > abs(x1-x2) |K|>1

   {

   k=(float)(x2-x1) / (float)(y2-y1) ;

   b=x1-k*y1;



   if( y1 <= y2 )

   {

       for(y=y1;y<=y2;y++)

       { x=k*y+b;

         Pixel( x , y,Mode);

       }

   }

   else

   {

      for(y=y2;y<=y1;y++)

      { x=k*y+b;

          Pixel( x , y,Mode);

      }

   }

   }

}









/********************************************************************************

函数名:Lcd_Box(unsigned char X1, unsigned char Y1, unsigned char X2, unsigned char Y2, bit SetReset)

函数功能:画矩形外框

********************************************************************************/

/*void Lcd_Box(unsigned char X1, unsigned char Y1, unsigned char X2, unsigned char Y2, bit SetReset)

{

   Lcd_Line(X1,Y1,X1,Y2, SetReset);

   Lcd_Line(X1,Y2,X2,Y2, SetReset);

   Lcd_Line(X2,Y2,X2,Y1, SetReset);

   Lcd_Line(X2,Y1,X1,Y1, SetReset);

}*/











/********************************************************************************

函数名: ClearScreen()

函数功能:函数功能:清除整个屏幕

********************************************************************************/

void ClearScreen(uint ram)

{

    unsigned int i;

                                                                //清显示 RAM 区 0000h--2000h (8k)

    OutPortCom3(0x00,0x00,0x24);                              //设置指针地址0000H

    OutPortCom1(0xb0);                                          //设置自动写状态

    for(i=0x00;i<ram;i++) OutPortData(0x00);               // data=0;

    OutPortCom1(0xb2);                                          // 自动写结束



}





/********************************************************************************

函数名: uchar ReadCGROMChar(uchar lin, uchar column)

函数功能:返回指定显示地址的ASCII码值;lin代表行,column代表列

********************************************************************************/

/*uchar ReadCGROMChar(uchar lin, uchar column)

{

        uchar Addr;

        Addr=lin*LineChar+column;

        OutPortCom3(Addr, 0x00,AddPointer);

        return(InPortData()+0x20);

}*/



/********************************************************************************

函数名:ShowCGRAMChar(uchar lin, uchar column,uchar ch )

函数功能:显示CGRAOM中的ASCII字符

********************************************************************************/

/*void ShowCGRAMChar(uchar lin, uchar column,uchar ch)

{

    uchar Addr;

    Addr=lin*LineChar+column;

    OutPortCom3(Addr, 0x00,AddPointer);

    OutPortCom2( ch-0x20,DataWAddI);

}*/





/********************************************************************************

函数名:ShowString(uchar lin, uchar column,*ch )

函数功能:显示CGRAM中的ASCII字符串

********************************************************************************/

/*void ShowString(uchar lin, uchar column,uchar *ch)

{

        uchar StartAddr;

        StartAddr=lin*LineChar+column;

        OutPortCom3(StartAddr, 0x00,AddPointer);

        while(*ch)

        {

                OutPortCom2( ch-0x20,DataWAddI);

                ch++;

        }

} */







/********************************************************************************

函数名: Void CursorPosSet(uchar X,uchar Y)

函数功能:光标位置设置

********************************************************************************/

void CursorPosSet(unsigned char x,unsigned char y)

{

        OutPortCom3(x,y,CursorPointer);                        //X的取值范围0-29;Y的取值范围0-15;

        }

/********************************************************************************

函数名: Void CursorUp()

函数功能:光标向上移动一格

********************************************************************************/

void CursorUp()

{

      if(Cursor_Y>0)Cursor_Y-=1;

      OutPortCom3(Cursor_X,Cursor_Y,CursorPointer);

}



/********************************************************************************

函数名: Void CursorDown()

函数功能:光标向下移动一格

********************************************************************************/

void CursorDown()

{

      if(Cursor_Y<15)Cursor_Y+=1;

      OutPortCom3(Cursor_X,Cursor_Y,CursorPointer);

}



/********************************************************************************

函数名: Void CursorRight()

函数功能:光标向右移动一格

********************************************************************************/

void CursorRight()

{

      if(Cursor_X<29)Cursor_X+=1;

      OutPortCom3(Cursor_X,Cursor_Y,CursorPointer);

}



/********************************************************************************

函数名: Void CursorLeft()

函数功能:光标向左移动一格

********************************************************************************/

void CursorLeft()

{

      if(Cursor_X>0)Cursor_X-=1;

      OutPortCom3(Cursor_X,Cursor_Y,CursorPointer);

}



/********************************************************************************

函数名: Void CursorEnter()

函数功能:光标向左移动一格

********************************************************************************/

void CursorEnter()

{

        Cursor_X=0;

        Cursor_Y+=1;

      OutPortCom3(Cursor_X,Cursor_Y,CursorPointer);

}





/********************************************************************************

函数名:void LoadASCII()

函数功能:把8*16点阵的字模顺序写到起始地位为0x1100的外部地址中去;字符代码从0x20开始

********************************************************************************/

/*void LoadASCII()

{

        unsigned char i,j;

        OutPortCom3( 0x00,0x1C,AddPointer);

        for(j=16;j<26;j++)

        {

                for(i=0;i<16;i++)

                {

                        OutPortCom2(ASCII816,DataWAddI);

                }

        }

} */













/********************************************************************************

函数名:OutPortCom1(TGAllOn|CursorBlink)

函数功能:关闭光标

********************************************************************************/

void CurOff()

{

        OutPortCom1(TGAllOn);

}



/********************************************************************************

函数名:OutPortCom1(TGAllOn|CursorBlink)

函数功能:打开光标

********************************************************************************/

void CurOn()

{

        OutPortCom1(TGAllOn|CursorBlink);

}







/********************************************************************************

函数名:void InitLCD()

函数功能:初始化LCD ,需要手动设置;

在初始化的时候把字模写到偏置地址开始的RAM中去;

********************************************************************************/



void InitLCD()

{

    OutPortCom3( GraphAddrL,GraphAddrH,0x42 );          //设置图形显示区域首地址

    OutPortCom3( LineChar,0x00,GraArea );               //设置图形显示区域宽度 : LineChar

    OutPortCom3(0x00,0x00,TextHomeAdd);                   //设置文本显示区域首地址GraphAddr

    OutPortCom3( LineChar,0x00,TextArea );            //设置文本显示区域宽度 : LineChar

    OutPortCom1(Cursor8);                               //设置光标形状 cursor size 8x8

    OutPortCom1(OrMode|ExCGRAM);                             //设置显示方式: 外部CGRAM方式 文本\图形 或

    OutPortCom3(0x03,0x00,OffsetReg);                        //偏址地址设在0x02

    OutPortCom1(TGAllOn|CursorBlink);                          //设置显示开关: 1001 1011 图形

    Cursor_X=Cursor_Y=0x00;

    CursorPosSet(Cursor_X,Cursor_Y);

    ClearScreen(0x2000);

    //LoadASCII();

}








-----此内容被ilan2003于2004-12-03,19:11:51编辑过

ldqmoon 发表于 2005-1-13 13:52:29

请问lcd和mcu是什么方式连接?直接连还是间接连

firstelec 发表于 2005-1-13 14:36:11

用了XBYTE宏,应该是直接连接。

ldqmoon 发表于 2005-1-13 14:54:57

那就是了,看来有些函数要改改才能用了,

本想偷懒,直接拿过来用的.....

firstelec 发表于 2005-1-13 16:19:49

//指令,数据 读写状态检查

#define RWCheck() { unsigned char sta; do{ sta=XBYTE & 0x03; } while(sta!=0x03); }

//数据自动读 状态检查

#define AutoRCheck() { unsigned char sta; do{ sta=XBYTE & 0x04; } while(sta!=0x04); }

//数据自动写 状态检查

#define AutoWCheck() { unsigned char sta; do{ sta=XBYTE & 0x08; } while(sta!=0x08); }

将以上三个宏根据51的时序用AVR的IO模拟就OK了。

gxy508 发表于 2009-11-13 16:36:24

mark

lv998127 发表于 2009-11-13 20:33:26

很不错

liuzhijun 发表于 2010-11-27 13:52:36

很不错谢谢

zuoyou 发表于 2010-11-27 15:18:41

mark

smartmeter 发表于 2010-11-27 16:10:02

工整,是用心的

qth 发表于 2012-9-10 22:56:46

不错啊!

糖烧熊 发表于 2013-1-25 12:56:44

{:smile:}{:smile:}{:smile:}
页: [1]
查看完整版本: 我整理的T6963控制芯片的液晶驱动的函数 (在51环境中可一运行,AVR没有试,应该可以