我整理的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编辑过 请问lcd和mcu是什么方式连接?直接连还是间接连 用了XBYTE宏,应该是直接连接。 那就是了,看来有些函数要改改才能用了,
本想偷懒,直接拿过来用的..... //指令,数据 读写状态检查
#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了。 mark 很不错 很不错谢谢 mark 工整,是用心的 不错啊! {:smile:}{:smile:}{:smile:}
页:
[1]