⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 液晶控制器t6963的c语言驱动程序.txt

📁 C51的红外控制源程序
💻 TXT
字号:
系转载,液晶控制器T6963的C语言驱动程序,T6963应用广泛,特别是240×128的液晶基本上都是用这个芯片。

#include "absacc.h"
#include "math.h"
#include "ASCII816.h" //字符点阵库 0x20--0x7F
#include "HZTable.h" //汉字点阵库(自做)
#include "menu.h" //汉字点阵库(自做)

//set following data by user according to LCD
#define ComPort 0xB101
#define DataPort 0xB000
#define GraphAddr 0x0000 //head of graph

//以8*8字符计算,显示屏横向、纵向可以显示的字符个数
//以240*128为例:
#define LineChar 30 //一行16个字符(8*8)
#define ColumnChar 16 //总共16列


//指令,数据 读写状态检查
#define RWCheck() { unsigned char sta; do{ sta=XBYTE[ComPort] & 0x03; } while(sta!=0x03); }
//数据自动读 状态检查
#define AutoRCheck() { unsigned char sta; do{ sta=XBYTE[ComPort] & 0x04; } while(sta!=0x04); }
//数据自动写 状态检查
#define AutoWCheck() { unsigned char sta; do{ sta=XBYTE[ComPort] & 0x08; } while(sta!=0x08); }

/*------输入/出函数,与T6963通讯------------------------------------------------*/
/*------------------------------------------------------------------------*/

// 向数据口发Data
#define OutPortData(dat ) { RWCheck(); XBYTE[DataPort]=dat; }

//写有 1 个参数命令
#define OutPortCom1(command) { RWCheck(); XBYTE[ComPort]= 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[DataPort]); }

/*-----------------------------------------------------------------------------------*/
//显示8*16字符
//lin:行(0-7), column: 列(0-15)
//ch:字符代码(标准ASCII码)
void ShowChar(unsigned char lin,unsigned char column,unsigned char ch)
{
unsigned char i;
unsigned char dat;
unsigned int StartAddr;

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

for(i=0;i<16;i++)
{
dat=ASCII816[ ch-0x20 ][i];
OutPortCom3( (unsigned char)(StartAddr), (unsigned char)(StartAddr>>8), 0x24); //set address
OutPortCom2( dat, 0xc4);

StartAddr=StartAddr + LineChar;
}
}

/*----------------------------------------------------------------------------------------------*/
//显示一个汉字(16*16点阵)
//lin:行(0-7), column: 列(0-7)
//hzcode: 汉字代码(自定义的)
void ShowHZ(unsigned char lin,unsigned char column,unsigned int hzcode)
{
unsigned char i;
unsigned int StartAddr;

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

for(i=0;i<16;i++)
{
OutPortCom3( (unsigned char)(StartAddr), (unsigned char)(StartAddr>>8), 0x24);
OutPortCom2( HZTable[hzcode][i*2], 0xc0); //左半部 地址加一
OutPortCom2( HZTable[hzcode][i*2+1], 0xc4); //右半部 字模地址加一

StartAddr=StartAddr + LineChar;
}
}
/////////////////////////////////////////////////////////////////////////////////////////////
//显示一个汉字(16*16点阵)
//lin:行(0-7), column: 列(0-7)
//hzcode: 汉字代码(自定义的)
void ShowHZD(unsigned char lin,unsigned char column,unsigned int hzcode)
{
unsigned char i,j;
unsigned int StartAddr;

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

for(i=0;i<35;i++)
{
OutPortCom3( (unsigned char)(StartAddr), (unsigned char)(StartAddr>>8), 0x24); //定位当前操作位置
for(j=0;j<5;j++) OutPortCom2( HZTable[hzcode][i*5+j], 0xc0); //显示当前一行

StartAddr=StartAddr + LineChar;
}
}

////////////////////////////////////////////////////////////////////////////////////////////
/*-----------------------------------------------------------------------------------*/
//显示一行字符串(汉字,字母混排,一行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[j];
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[j+1]; //加低8位,组合成整型数地址
ShowHZ( lin,i,hzcode);
i=i+2;j=j+2;
}
}
}

/*-----------------------------------------------------------------------------------*/
//显示一屏汉字
//pageheadaddr:此屏汉字代码地址区首地址
void ShowPage(unsigned char lin,unsigned char column1,unsigned char pagehead[][14])
{
unsigned char i;
for(i=0;i< 4 ;i++)
ShowLine((lin+i*20),column1,pagehead[i]); //1行8个汉字,16字节
}

/*----------------------------------------------------------------------------------------------------*/
//反显一个字符
//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; //定位起始行

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;
}
}


/*----------------------------------------------------------------------------------------------------*/
//反显一个汉字
//lin:行(0-7), column: 列(0-15)
void ReverseShowHZ(unsigned char lin,unsigned char column)
{
ReverseShowChar(lin,column);
ReverseShowChar(lin,column+1);
}
/*----------------------------------------------------------------------------------------------------*/
//反显一行汉字
//lin:行(0-7)
void ReverseShowLine(unsigned char lin)
{
unsigned char column;
for(column=0; column< ColumnChar; column++) ReverseShowChar(lin,column);
}


//////////////////////////////////////////////////////////////////////////////////////
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; //定位起始位置

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[address + i*LineWidth+ j ], 0xc0);
}
StartAddr=StartAddr + LineChar;
}
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
//图形函数,用于描点画图
//---------------------------------------------------------------------------
//在指定位置显示一个点
//如果显示屏超过了256*256,请修改这个函数 PointX,PointY的类型
//Mode 1:显示 0:清除该点
Pixel(unsigned char PointX,unsigned char PointY, bit Mode)
{
unsigned int StartAddr=0;
unsigned char dat;

StartAddr=PointX*LineChar + PointY/8;
dat=0xf0+7-PointY%8;
if(Mode) dat=dat|0x08;

OutPortCom3( (unsigned char)(StartAddr),(unsigned char)(StartAddr>>8),0x24 ); //设置该点所在单元地址
OutPortCom1(dat);
}

//-------------------------------------------------------------------------------
//划线函数
void Line( unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2, bit Mode)
{
unsigned char x,y;
double k,b;

if( abs(y1-y2) <= abs(x1-x2) ) // |k|<=1
{
k=(float)(y2-y1) / (float)(x2-x1) ;
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 );
}
}
}
}

/*---------------------------------------------------------------------------------------------------*/
void ClearScreen()
{

unsigned int i;
///////// 清显示 RAM 区 0000h--2000h (8k)
OutPortCom3(0x00,0x00,0x24); //设置指针地址0000H

OutPortCom1(0xb0); //设置自动写状态
for(i=0x00;i<0x2000;i++) OutPortData(0x00); // data=0;
OutPortCom1(0xb2); // 自动写结束
}

//初始化LCD
//需要手动设置
void InitLCD()
{
OutPortCom3( 0x00,0x00,0x42 ); //设置图形显示区域首地址GraphAddr
OutPortCom3( 30,0x00,0x43 ); //设置图形显示区域宽度 : LineChar

// OutPortCom3( 0x00,0x00,0x42 ); //设置图形显示区域首地址GraphAddr
// OutPortCom3( 0x10,0x00,0x43); //设置图形显示区域宽度:10H

OutPortCom1(0xa7); //设置光标形状 cursor size 8x8
OutPortCom1(0x80); //设置显示方式: CGROM方式 文本\图形 "或"
OutPortCom1(0x98); //设置显示开关: 1001 1100 图形

ClearScreen();
}










T6963C液晶控制器快速显示汉字的实现方案 序 
发布时间:2006年3月19日 
点击次数:133 
 
详细内容:T6963C液晶控制器快速显示汉字的实现方案 序


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,计算方法为:

 

              if (汉字的编号>=16) 

{

Num=(汉字的编号-16)%16;

                     Offset=(汉字的编号-16)/16;

              }

 

再判断对应Num编号的CharFlagTable中的序列编号,如果两者相等,则直接显示该汉字字符,否则,将对应汉字字模调入CGRAM中后,再显示该汉字。

为了提高显示速度,可以将整个显示模式改为非图形模式。

 

定义全局静态数组:

static signed char CharFlagTable[16];

 

定义如下函数:

void InitCGRAM(void);

//功能:完成初始化CGRAM字符显示区,初始化CharFlagTable表格,程序逻辑如下:

{

       for (I=0;I<16;I++) CharFlagTable[I]=0;

       for (I=0;I<32;I++)WriteCGRAM(I);

}

 

void WriteCGRAM(unsigned int ChinNo);

//功能:完成将对应编号的汉字的字模点阵信息写入到对应的CGRAM内存区,程序逻辑如下:

{

       if (ChinNo<16) Num=ChinNo;

       else Num=(ChinNo-16)%16+16;

       Num*=4;

Num+=0x80;  ////得到对应编号汉字的四个字符中第一个字符编号;

{将编号为ChinNo的汉字数组送入到Num到Num+3四个字符中}

}





 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -