T6963模块中文使用说明书
- 格式:pdf
- 大小:724.07 KB
- 文档页数:29
6.2 LCD12864的原理与应用LCD12864为128х64绘图型点阵液晶模块,可以显示汉字、ASCII码字符和任意图形。
根据生产厂家不同,12864控制芯片有KS0108,T6963,ST7920等,其中KS0107(或KS0108)不带字库,ST7920带国标二级字库(8千多个汉字)。
T6963C带有ASC码字符库,并且完善的指令集和较简便的控制方式,所以本节以T6963C控制的12864为列,介绍12864的显示原理和程序设计方法,并通过项目实例介绍12864的一般应用。
6.2.1 12864点阵液晶显示模块的原理一、功能原理T6963C 是日本东芝公司专门为中等规模LCD模块设计的一款控制器,它通过外部MCU方便地实现对LCD驱动器和显示缓存的管理。
其内部有128个常用字符表,可管理外部扩展显示缓存64KB(12864模块为32KB),与单片机连接采用并行接口。
图6-2-1 12864液晶显示器12864液晶显示器除T6963控制器外,内部还包括行驱动器T6A40、列驱动器T6A39、液晶驱动偏压电路、显示存储器以及液晶屏,能够显示字符及图形,也可以显示8×4个16×16点阵的汉字。
12864外形见图6-2-1所示,与外部接口共有20个引脚,分显示器电源、表6-2-1 12864液晶引脚功能背光电源、并行数据接口、控制端口和对比度调节控制端口。
LCD正面时引脚在上,引脚编号从左依次为1~20。
二、12864的指令集T6963C的指令表见表6-2-2所示,分读状态字操作、设置指令、数据的读写操作指、令位操作指令四种。
(1)读状态字操作在T6963C中有一个一字节的状态字,单片机无论是向T6963C读写数据还是写入命令,都必需对状态字进行忙状态判断,以决定是否可以继续对T6963C进行操作;读状态字操作格式为/RD = 0;/WR = 1;/CE = 0;C/D = 1;此时数据端口D0~D7输出状态字,8为状态字从高到低分别为STA7~ STA0,其各位表示的状态描述见表6-2-3所示。
T6963C的使用(C语言)内置T6963C的128×128图形液晶显示模块从图1我们可以看出:(1)偏压电路的设计≈),电阻R1~R5组成了分压电液晶显示驱动电源采用了1/1313=≈)R。
路,其中:R1=R2=R4=R5=R,R38.319驱动负电源由接口V0提供。
(2)驱动电路的组成在液晶显示驱动控制系统中,由两片T6A39列驱动器和两片T6A40行驱动器组成驱动电路。
(3)T6963C工作参数的设置T6963C的工作参数设置如下:/DUAL=1 单屏结构SDSEL=0 一位串行数据传输MDS=1、MDl=MD0=0 N=16即1/128占空比系数MD2=MD3=1 M=32即256点列/行FS0=0 通过计算机选择6×8点阵字体或8×8点阵字体(4)晶振频率选择根据T6963的设置参数可以求得:Fosc= F R×64×2×M×N =60×64×2×32×16=3.932MHz。
通过查表6-32也可以得到频率值,大小也为3.932MHz。
这个时候,选用4MHz的晶振。
(5)显示存储器显示存储器为8K字节容量,存储器芯片为6264或其它SRAM。
图1 内置T6963C的128×128图形液晶显示模块的电原理图内置T6963C控制器的液晶显示模块的接口技术内置T6963C控制器的液晶显示模块与计算机的接口时序为Inter8080时序。
本节以常用的单片机AT89C51为实验样机,以模块128128为显示样片叙述计算机与内置T6963C控制器的液晶显示模块的接口技术。
1 直接访问方式直接访问方式是把内置T6963C控制器的液晶显示模块作为存储器或I/O设备直接挂在计算机的总线上。
模块的数据线接计算机的数据总线上,片选及寄存器选择信号线由计算机的地址总线提供,读和写操作由计算机的读写操作信号控制。
液晶显示模块的应用一、结构特点内藏T6963C 的液晶显示模块上已经实现了T6963C 与行、列驱动器及显示缓冲区RAM 的接口,同时也已用硬件设置了液晶屏的结构(单双屏、数据传输方式、显示窗口长度、宽度等等。
我们常用的液晶显示模块一般都是单屏结构,因此我们这里只讨论单屏结构的液晶显示模块。
内藏T6963C 的单屏结构点阵图形液晶显示模块的方框图如下:二、T6963C 的特点(1) T6963C 是点阵式液晶图形显示控制器它能直接与8 位微处理器接口;(2) T6963C 的字符字体可由硬件或软件设置,其字体有4 种5X8 、6X8、7X8、8X8;(3) T6963C 的占空比可从1/16 到1/128;(4) T6963C 可以图形方式、文本方式及图形和文本合成方式进行显示,以及文本方式下的特征显示,还可以实现图形拷贝操作等等;(5) T6963C 具有内部字符发生器CGROM,共有128 个字符。
T6963C 可管理64K显示缓冲区及字符发生器CGRAM,并允许MPU 随时访问显示缓冲区,甚至可以进行位操作。
三、该类液晶模块的管脚定义见下表:说明:对于单电源模块,标志为V0/POFF。
当该管脚为高或悬空时,内部DC/DC功能开启;为低时,内部DC/DC 功能关闭。
该功能可用作屏幕保护和休眠方式。
如果用其直接替代双电源模块,该管脚直接悬空即可。
四、液晶显示模块的供电说明1. 如果您所选用的液晶模块是双电源(VDD/V0)供电的就需要提供一个负电压(液晶驱动电压V0/VEE),用以调节对比度,接在液晶模块的V0 引脚上。
因为液晶材料的物理特性,液晶的对比度会随着温度的变化而相应变化,所以,您加的负电压值应该随温度作相应的调整,大致是温度变化10°C 电压变化1伏左右。
为满足这一要求您要选择较大值的负电源,然后做一个温度补偿电路,或者安排一个电位器调整负电压值。
例如对于QH12864T-HT-LED04,当室温(VDD=5V)时,V0=-10.5V,如果要用到-20°C,液晶驱动电压将要变到V0=-14.5V,再考虑到负载消耗所以您提供的负电源应该为-16V 左右。
T6963C TOSHIBA点阵LCD集成控制芯片2009-8-21 T6963C是一个用在LCD控制驱动集成电路(LSI)和数据显示存储器上的LCD控制器。
它有一个8位的并行数据总线和控制线与MPU接口进行读写操作,它可以直接与TMPZ-80相连接。
T6963C有一个128-word的字符生成ROM,可用来控制最大为64KB的外部显存RAM。
文本、图形和外部字符生成RAM的分配很简单,显示窗口能自由地在已分配存储器范围内移动。
通过编程输入引脚电平的不同组合,器件支持很宽范围的LCD显示尺寸。
它支持文本、图形以及文本与图像混合显示模式。
另外,还包括多种特性功能。
1.特性z显示模式(可通过选择引脚电平来设置)列:32、40、64、80行:2、4、6、8、10、12、14、16、20、24、28、32行列数的组合不能使频率超过5.5MHz(看图2)z字符字体(可通过选择引脚电平来设置)水平点数:5、6、7、8垂直点数:8(固定)和在文本模式中一样,在图形模式中也可以设置字符字体大小。
在选择字体大小时,晶振频率不会改变。
z显示占空比:1/16~1/128。
(duty = 1/8N,N表示行数)z内置一个128-word的字符生成ROM(T6963C-0101)z外部显存:最大支持64KB显存内文本区域大小、图形区域大小、外部字符生成区域大小可由软件编程设置。
z CPU的读写操作不影响LCD显示。
z内置晶体振荡电路,振荡频率可以根据显示大小进行调整。
如果使用外部时钟,XI 引脚作为时钟输入引脚(XO 断开)。
外接电容大小:晶体振荡器:20~30pF陶瓷振荡器:30~100pF内置反馈电阻: 900KΩz Toshiba LCD驱动集成电路(不带内置RAM)也可与T6963C连接。
z外部显存必须为静态RAM,因为T6963C不支持动态RAM的刷新功能。
z特性功能只支持文本模式,不能在图形或字符组合模式中使用。
//***************************************************************************** *****T6963驱动程序,已调试通过// LCM(OCM-240128)显示程序//***************************************************************************** *****//#include "stc12c5a56s2.h"#include "includes.h"#include "intrins.h"#include "math.h"#include "ZIMO.H"// T6963C 端口定义//#define LCMDW XBYTE[0x0000] //数据口0x8000//#define LCMDW XBYTE[0x0100] //命令口0x8100#define LCMDW P0#define LCMCW P0sbit LCMCD = P4^6; //命令数据通道选择sbit LCMWR = P4^2; //写sbit LCMRD = P1^0; //读sbit LCMRST = P1^4;sbit LCMCE = P1^1;sbit LCMFS = P1^5;#define End 0xff //结束项// T6963C 命令定义#define CUR_POS 0x21 // 光标位置设置#define CGR_POS 0x22 // CGRAM偏置地址设置#define ADD_POS 0x24 // +地址指针位置#define TXT_STP 0x40 // +文本区首址#define TXT_WID 0x41 // +文本区宽度#define GRH_STP 0x42 // +图形区首址#define GRH_WID 0x43 // +图形区宽度#define MOD_OR 0x80 // +显示方式:逻辑“或”#define MOD_XOR 0x81 // 显示方式:逻辑“异或”#define MOD_AND 0x82 // 显示方式:逻辑“与”#define MOD_TCH 0x83 // 显示方式:文本特征#define DIS_SW 0x90 // +显示开关:D0=1/0:光标闪烁启用/禁用;// D1=1/0:光标显示启用/禁用;// D2=1/0:文本显示启用/禁用;// D3=1/0:图形显示启用/禁用;#define CUR_SHP 0xA0 // +光标形状选择:0xA0-0xA7表示光标占的行数#define AUT_WR 0xB0 // +自动写设置#define AUT_RD 0xB1 // 自动读设置#define AUT_OVR 0xB2 // +自动读/写结束#define INC_WR 0xC0 // 数据一次写,地址加1#define INC_RD 0xC1 // 数据一次读,地址加1#define DEC_WR 0xC2 // 数据一次写,地址减1#define DEC_RD 0xC3 // 数据一次读,地址减1#define NOC_WR 0xC4 // 数据一次写,地址不变#define NOC_RD 0xC5 // 数据一次读,地址不变#define SCN_RD 0xE0 // 屏读#define SCN_CP 0xE8 // 屏拷贝#define BIT_OP 0xF0 // 位操作:D0-D2:定义D0-D7位;D3:1置位;0:清除/*******************************************************// 状态位STA1,STA0判断(读写指令和读写数据)********************************************************/unsigned char fnST1(void){unsigned char i;LCMCW = 0xff;LCMCD = 1; //打开指令通道LCMRD = 0; //允许读LCMWR = 1; //禁止写for( i = 10; i > 0; i-- ){if((LCMCW & 0x03) == 0x03)break;}LCMRD = 1;return i; //若返回零,说明错误}/*******************************************************// 状态位ST3判断(数据自动写状态)********************************************************/unsigned char fnST3(void){unsigned char i;LCMCW = 0xff;LCMCD = 1; //打开指令通道LCMRD = 0; //允许读LCMWR = 1; //禁止写for( i = 10; i > 0; i--){if((LCMCW & 0x08) == 0x08)break;}LCMRD = 1;return i; // 若返回零,说明错误}/*-------------------------------------------------------写数据,需要将LCMCD 置零---------------------------------------------------------*/void fnWrDat(unsigned char uDat){LCMCD = 0; //数据通道打开LCMRD = 1; //读数据无效LCMDW = uDat; //返回数据LCMWR = 0; //写数据有效_nop_();_nop_();LCMWR = 1; //写数据禁止,产生一个上升沿}/*-------------------------------------------------------写命令,需要将LCMCD 置1---------------------------------------------------------*/void fnWrCmd(unsigned char uDat){LCMCD = 1; //命令通道打开LCMRD = 1; //读数据无效LCMDW = uDat; //返回数据LCMWR = 0; //写数据有效_nop_();_nop_();LCMWR = 1; //写数据有效}/******************************************************// 写双参数的指令*******************************************************/void fnPR1(unsigned char uCmd,unsigned char uPar1,unsigned char uPar2) {if( fnST1() != 0 ) fnWrDat(uPar1);if( fnST1() != 0 ) fnWrDat(uPar2);if( fnST1() != 0 ) fnWrCmd(uCmd);//LCMCW = uCmd;}/*****************************************************// 写无参数的指令******************************************************/ void fnPR12(unsigned char uCmd){if( fnST1() != 0 ) fnWrCmd(uCmd);}/****************************************************// 写数据****************************************************/ void fnPR13(unsigned char uData){if( fnST3() != 0 ) fnWrDat(uData);}/************************************************** //30列*16,8行X:行Y:列***************************************************/ void fnSetPos(unsigned char X, unsigned char Y){unsigned int Z;Z = Y * 30 + X;fnPR1(ADD_POS,Z ,Z >> 8);//+以点阵为单位}/*************************************************// 清屏**************************************************/ void fnClrScreen(void){unsigned int i;EA = 0;fnPR1(ADD_POS,0x00,0x00); // 置地址指针fnPR12(AUT_WR); // 自动写for( i = 0; i <256*64; i++){fnPR13(0x00); // 0x00写数据}fnPR12(AUT_OVR); // 自动写结束fnPR1(ADD_POS,0x00,0x00); // 重置地址指针EA = 0;}//*************************************// LCM 初始化void INI240128(void){EA = 0;LCMFS = 0;LCMRST = 0;LCMCE = 0;LCMWR = 1;LCMRD = 1;LCMRST = 1;fnPR1( TXT_STP, 0x00, 0x10 ); // 1000H文本显示区首地址1000-11ffh fnPR1( TXT_WID, 0x1E, 0x00 ); // 文本显示区宽度:30fnPR1( GRH_STP, 0x00, 0x00 ); // 图形显示区首地址0000-0fffhfnPR1( GRH_WID, 0x1E, 0x00 ); // 图形显示区宽度:30 左上角的第一个8点列像素fnPR12( CUR_SHP | 0x01 ); // 光标形状,2行fnPR12( MOD_OR ); // 显示方式设置:文本与图形以"或"合成fnPR12( DIS_SW | 0x0f ); // 显示开关设置:启用图形显示EA = 1;}/*****************************************************显示ASCII字符输入参数:X:行Y:列N:显示的ASCII()Z:是否反显,1/0:反显/正常显示输出:无******************************************************/void DisAsc(unsigned char x,y,x1,y1,n,bit z){unsigned char i;if(z){y = y+y1;for(i=0;i<12;i++){fnSetPos(x+x1,y+i);fnPR12(AUT_WR); //自动写设置fnPR13(~ASC1212[n].OUT[i]);fnPR12(AUT_OVR); //自动写结束}}else{y = y+y1;for(i=0;i<12;i++){fnSetPos(x+x1,y+i);fnPR12(AUT_WR); //自动写设置fnPR13(ASC1212[n].OUT[i]);fnPR12(AUT_OVR); //自动写结束}}}/*****************************************************显示汉字字符输入参数:X:行Y:列N:显示的ASCII()Z:是否反显,1/0:反显/正常显示输出:无******************************************************/void DisHz(unsigned char x,unsigned char y ,unsigned char x1,unsigned char y1 ,unsigned char n,bit z){unsigned char i;if(z){y+=y1;for(i=0;i<12;i++){fnSetPos(x+x1,y+i);fnPR12(AUT_WR); //自动写设置fnPR13(~HZ1212[n].OUT[2*i]);fnPR13(~HZ1212[n].OUT[2*i+1]);fnPR12(AUT_OVR); //自动写结束}}else{y+=y1;for(i=0;i<12;i++){fnSetPos(x+x1,y+i);fnPR12(AUT_WR); //自动写设置fnPR13(HZ1212[n].OUT[2*i]);fnPR13(HZ1212[n].OUT[2*i+1]);fnPR12(AUT_OVR); //自动写结束}}}/*****************************************************显示ASCII字符、汉字字符输入参数:X:行Y:列x1: 行偏移几个点y1: 列偏移几个点Z:是否反显,1/0:反显/正常显示ptr:显示的字符串输出:无******************************************************/void Dis(unsigned char x,unsigned char y,unsigned char x1,unsigned char y1 ,bit z,unsigned char *ptr){unsigned char n;EA = 0;y *= 15;fnPR1(ADD_POS,y,x); /* 置地址指针*/while(*ptr!=0){if(*ptr<0xa0) //显示ASC字码{if( x > 30 ){y += 12;x = 0;}n=0;while(ASC1212[n].In != End && ASC1212[n].In != *ptr){ n++; }DisAsc(x,y,x1,y1,n,z); //DisAsc(0,0,0,3,1,0); DisAsc(0,0,0,3,1,0);//DisAsc(1,0,0,3,2,0);//DisAsc(2,0,0,3,3,0);x += 1;ptr += 1;}else //显示汉字{if(x/2>30){y += 12;x = 0;}n=0;while(HZ1212[n].In[0]!=End&&(HZ1212[n].In[0]!=*ptr||HZ1212[n].In[1]!=*(ptr+1))) { n++; }DisHz(x,y,x1,y1,n,z);x += 2;ptr += 2;}}EA = 1;}void DisAsc24(unsigned char x,y,x1,y1,n,bit z){unsigned char i;if(z){y = y+y1;for(i=0;i<16;i++){fnSetPos(x+x1,y+i);fnPR12(AUT_WR); //自动写设置fnPR13(~ASC[n].OUT[i]);fnPR12(AUT_OVR); //自动写结束}}else{y = y+y1;for(i=0;i<16;i++){fnSetPos(x+x1,y+i);fnPR12(AUT_WR); //自动写设置fnPR13(ASC[n].OUT[i]);fnPR12(AUT_OVR); //自动写结束}}}/*****************************************************显示ASCII字符、汉字字符输入参数:X:行Y:列Z:是否反显,1/0:反显/正常显示ptr:显示的字符串输出:无******************************************************/void DisASC1616(unsigned char x,unsigned char y,unsigned char x1,unsigned char y1 ,bit z,unsigned char *ptr){unsigned char n;EA = 0;y *= 19;fnPR1(ADD_POS,y,x); /* 置地址指针*/while(*ptr!=0){if(*ptr<0xa0) //显示ASC字码{if( x > 30 ){y += 16;x = 0;}n=0;while(ASC[n].In != End && ASC[n].In != *ptr){ n++; }DisAsc24(x,y,x1,y1,n,z); //DisAsc(0,0,0,3,1,0); DisAsc(0,0,0,3,1,0);//DisAsc(1,0,0,3,2,0);//DisAsc(2,0,0,3,3,0);x += 1;ptr += 1;}}EA = 1;}void delay1(int i){int j = 2000;while(i--){while(j--);}}/*x,y为坐标,l为长度,Bp为第几个点,Lm为横竖线*/void DrawLine(unsigned char x,y,l,char Bp,bit Lm){unsigned char i,j;EA = 0;if(Lm) //画横线{for( i = 0; i < l;i ++){fnSetPos(x+i, y);for(j = 0;j< 8;j++){if((Bp>>j)&0x01){fnPR12(0xf8 + j);}}/* fnPR12(0xf8 + ((Bp>>0)&0x01));fnPR12(0xf8 + ((Bp>>1)&0x01));fnPR12(0xf8 + ((Bp>>2)&0x01));fnPR12(0xf8 + ((Bp>>3)&0x01));fnPR12(0xf8 + ((Bp>>4)&0x01));fnPR12(0xf8 + ((Bp>>5)&0x01));fnPR12(0xf8 + ((Bp>>6)&0x01));fnPR12(0xf8 + ((Bp>>7)&0x01)); */}}else //画竖线{for( i = 0; i < l;i ++){fnSetPos(x, y+i);fnPR12(0xf8|(7-Bp%8));}}EA = 1;}/**/void DrawPont(unsigned char x,y,Bp) {unsigned char j;EA = 0;fnSetPos(x, y);for(j = 0;j< 8;j++){if((Bp>>j)&0x01){fnPR12(0xf8 + j);}}EA = 1;}。
使用内藏T6963C控制器的液晶显示模块的注意事项1.部分内藏T6963C控制器的液晶模块为含EL 场致发光背光器件在点背光时需用逆变器型号为PYE-D32-49 PYE-D32-50或可替换的其客观存在型号逆变器供电为5V直流电源输出交流电压接至液晶的背光引脚逆变器为配件损坏将无法修理也请注意使用2.常用负电源产生为法1 采用79系列三端集成稳压器可产生-18V 7918 -24V 7924 等电源2 采用DC-DC模块市场上常见的5D**系列型号可选择使用3 采用DC-DC集成电路制作负电源如MAX749 MAX680等3.相关液晶模块的工作负电压参考值(仅供参考负电源提供的负压范围尽可能宽例如下面的12864T及其背光型所需的V0=-5.4V 负电源提供的负压可在-10V左右这样可提供较大的调节余地因为液晶材料的物理特性液晶的对比度会随着温度的变化而相应变化所以您加的负电压值应该随温度作相应的调整大致是温度变化10 电压变化1伏为满足这一要求您可做一个温度补偿电路或者安排一个电位器测度环境温度T6963C液晶显示模块上以内藏控制器型然后详细叙述内藏T6963C控制器一T6963C的特点(1)T6963C是点阵(2)T6963C的字符(3)T6963C的占空(4)T6963C可以图特征显示还可以实现图形拷贝操(5)T6963C具有内字符发生器CGRAM并允许MPU随时二T6963C的引脚T6963C的QFP(1)D0-D7:T6963C与MPU接口的数据总线,三态(2)/RD /WR 读写选通信号低电平有效输入信号(3)/CE T6963C的片选信号低电平有效(4)C/D 通道选择信号1为指令通道0为数据通道(5)/RESET /HALT /RESET 为低电平有效的复位信号它将行列计数器和显示寄存器清零关显示/HALT具有/RESET的基本功能还将中止内部时钟振荡器的工作(6)DUAL SDSELDUAL=1为单屏结构DUAL=0为双屏结构SDDEL=0为一位串行数据传输方式(7)MD2,MD3:设置显示窗口长度,从而确定了列数据传输个数的最大值,其组合逻辑关系如下:MD3 1 1 0 0MD2 1 0 1 0每行字符数32 40 64 80(8)MDS,MD1,MD0:设置显示窗口宽度(行),从而确定T6963C的帧扫描信号的时序和显示驱动的占空比系数,当DUAL=1时,其组合功能如下:MDS 0 0 0 0 1 1 1 1MD1 1 1 0 0 1 1 0 0MD2 1 0 1 0 1 0 1 0 字符行 2 4 6 8 10 12 14 16 总行数16 32 48 64 80 96 112 128 占空比1/16 1/32 1/48 1/64 1/80 1/96 1/112 1/128 当DUAL=0时,以上设置中的字符行和总行数增至原来的2倍,其它都不变,这种情况下的液晶屏结构为双屏结构出端三T6963C指令集T6963C的初始化设置一般都由管脚设置完成因此其指令系统将集中于显示功能的设置上T6963C的指令可带一个或两个参数每条指令的执行都是先送入参数如果有的话再送入指令代码每次操作之前最好先进行状态字检测T6963C的状态字如下所示STA7 STA6 STA5 STA4 STA3 STA2 STA1 STA0STA0 指令读写状态 1 准备好 0 忙STA1 数据读写状态 1 准备好 0 忙STA2 数据自动读状态 1 准备好 0 忙STA3 数据自动写状态 1 准备好 0 忙STA4 未用STA5 控制器运行检测可能性 1 可能 0 不能STA6 屏读/拷贝出错状态 1 出错 0 正确STA7 闪烁状态检测 1 正常显示 0 关显示由于状态位作用不一亲友因此执行不同指令必须检测不同状态位在MPU一次读写指令和数据时STA0和STA1要同时有效—处于准备好状态当MPU读写数组时判断STA2和STA3状态屏读写拷贝指令使用STA6STA5和STA7反映T6963C内部运行状态字符代码: D7 D6 D5 D4 D3 D2 D1 D0行地址指针: +) R2 R1 R0实际地址: V15 V14 V13 V12 V11 V10 V9 V8 V7 V6 V5 V4 V3 V2 V1 V0(3)地址指针设置:设置将要进行操作的显示缓冲区(RAM)的一个单元地址,D1 D2为该单元地址的低位和高位地址2 显示区域位置指令格式为D1 D2 0 1 0 0 0 0 N1 N2根据N1 N0的不同取值该指令有四种指令功能形式N1 N0 D1 D2 指令代码功能0 0 低字节高字节40H 文本区首址0 1 字节数00H 41H 文本区宽度字节数/行1 0 低字节高字节42H 图形区首址1 1 字节数00H 43H 图形区宽度字节数/行文本区和图形区地址对应显示屏上左上角字符位或字节位修改该地址可以产生卷动效呆D1 D2分别为该地址的低位和高位字节文本区宽度字节数/行设置和图形区宽度字节数/行设置用于调整一行显示所占显示RAM的字节数从而确定显示屏与显示RAM单元的对应关系T6963C硬件设置的显示窗口宽度是指T6963C扫描驱动的有效列数需说明的是当硬件设置 6 8字位时图形显示区单元的低6位有效对应显示屏上 6 1显示位3N3字符代码时将自N2—当设区改为文示与不显征区内D3 字符闪烁控制位D3=1为闪烁D3=0为不闪烁D2—D0的组合如下D2 D1 D0 显示效果0 0 0 正常效果1 0 1 负向效果0 1 1 禁止显示空白启用文本特征方式时可在原有图形区和文本区外用图形区域设置指令另开一区作为文本特征区以保持原图形区的数据 显示缓冲区可划分如下单屏结构SAD1 SAD1ˊ SAD14 显示开关 指令格式如下无参数 1 0 0 1 N3 N2 N1 N0N0 1/0 光标N1 1/0 光标N2 1/0 文本N3 1/0 图形5 光标形状选光标开头为86 数据自动读该指令执行后动增 1 自动读 写结束时 必7 数据一次读 写方式 指令格式如下D1 1 1 0 0 0 N 2 N1 N0D1为需要写的数据 读时无此数据N2 N1 N0 指 令 代 码 功 能 0 0 0 C0H 数据写 地址加 1 0 0 1 C1H 数据读 地址加 1 0 1 0 C2H 数据写 地址减 1 0 1 1 C3H 数据读 地址减 1图形显示区文本特性区 文本显示区 CGRAM 2K显示缓冲区R A M1 0 0 C4H 数据写地址不变1 0 1 C5H 数据读地址不变8 屏读指令格式为无参数 1 1 1 0 0 0 0 0该指令将屏上地址指针处文本与图形合成后显示的一字节内容数据送到T6963C的数据栈内等待MPU读出地址指针应在图形区内设置9 屏拷贝指令格式为无参数 1 1 1 0 1 0 0 0该指令将屏上当前地址指针图形区内处开始的一行合成显示内容拷贝到相对应的图形显示区的一组单元内该指令不能用于文本特征方式下或双屏结构液晶显示器的应用上10 位操作该指令可将显示缓N3=1置 1 N3=0清N2—N0 操作位至此T6963C的指内藏T6963C的液晶同时也已用硬件设置了液晶的结液晶显示模块一般都是单屏结构阵图形液晶显示模块的方框图如下第法一接访问方式MPU可利用数据总线口电路以公司提供的演示板为例8031数据口P0口直接与液晶显示模块的数据连拉接由于T6963C接口适于8080系列和Z80系列MPU 所以可以直接用8031的RD /WR作为液晶显示模块的读写控制信号液晶显示模块/RESET /HALT挂在+5V 上/CE信号可由地址线译码产生C/D信号由8031地址线A8提供A8=1为指令口地址A8=0为数据口地址各驱动子程序如下DAT1 EQU 30H 第一参数单元DAT2 EQU 31H 第三参数/数据单元COM EQU 32H 指令代码单元C-ADD EQU 8100H 指令通道地址D-ADD EQU 8000H 数据通道地址1.读状态字子程序占用寄存器: DPTR,A 输出寄存器 A 存储标志字R-ST MOV DPTR #C-ADD 设置指令通道地址MOVX A @DPTRRET由此程序派生出判断有关标志位的子程序(1)判状态位STA1,STA0子程序(读写指令和读写数据状态),在写指令的读写数据之前这两个标志位必须同时为 1ST01 LCALL R-STJNB ACC.0,STO1JNB ACC.1,ST01RET(2)判状态位STA2子程序(数据自动读状态),该位在数据自动读操作过程中取代STA0和STA1有效在连续读过程中每读一次之前都要确认STA2=1ST2 LCALL R-STJNB ACC.2,ST2RET(3)判状态位STA3子程序(数据自动写状态)ST3: LCALL R-STJNB ACC.3,ST3RET(4)判状态位STA6子程序(屏读/屏拷贝状态)ST6: LCALL R-STJNB ACC.6,ST6RETERR: LJMP ST6 出错处理程序1.写指令和写数据子程序PR1: LCALL ST01 双字节参数指令写入入口MOV A DAT1 取第一参数单元数据LCALL PR13 写入参数PR11 LCALL ST01 单字节参数指令写入入口MOV A DAT2 取第二参数单元数据LCALL PR13 写入参数PR12 LCALL ST01 无参数指令写入入口MOV A COM 取指令代码单元数据LJMP PR14 写入指令代码PR13 MOV DPTR #D-ADD 设置数据通道地址/数据写入入口PR14 MOVX @DPTR A 写入操作RET此程序是通用程序当写入单参数指令时应把参数或数据送入DAT2内其子程序入口为PR11 无参数指令写入子程序入口为PR122.读数据子程序PR2 LCALL ST01 判状态位MOV DPTR #D-ADD 设置数据通道地址MOVX A @DPTR 读数据操作MOV DAT2 A 数据存入第二参数/数据单元RET一间接控制方式间接控制方式是MPU通过并行接口间接实现对液晶显示模块控制根据液晶显示模块的需要并行接口需要一个8位的并行接口和一个3位并行口由下图所示8031的P1口作为数据总线P3口中3位作为读写及寄存器选择信号由于并行接口只用于液晶显示模块所以/CE信号接地就行了MPU通过并行接口操纵液晶显示模块要对其时序关系有一个清楚的了解并在程序中应明确地反映出来间接控制方式的基本程序如下CD EQU P3.2 通道选择信号WR EQU P3.3 写操作信号RD EQU P3.4 读操作信号1 读状态字子程序R-ST MOV P1 #0FFH P1口置 1SETB CD CD=1CLR RD /RD=0MOV A P1 读操作SETB RD RD=1RET此程序可以直接调节器用直接访问方式中的ST01 ST2 ST3和ST6等子程序2 写指令和写数据子程序PR1 LCALL ST01 双字节参数指令写入入口MOV A DAT1 取第一参数单元数据LCALL PR13 写入参数PR11 LCALL ST01 单字节参数指令写入入口MOV A DAT2 取第二参数单元数据LCALL PR13 写入参数PR12 LCALL ST01 无参数指令写入入口MOV A COM 取指令代码单元数据LJMP PR14 写入指令代码PR13 CLR CD CD=0/数据写入入口PR14 MOV P1 A 设置数据CLR WR /WR=0SETB WR /WR=1RET3 读数据子程序PR2 LCALL ST01 判状态位CLR CD C/D=0MOV P1 1#0FFH P1口置 1CLR RD /RD=0MOV A P1 读取数据SETB RD /RD=0MOV DAT2 A 数据存入第二参数/数据单元RET第五章应用举例示例一初始化程序该程序为通用设置程序在240 128规模以内的液晶显示模块都适应1 始化设置子程序INT MOV DAT1 #00H 设置文本显示区域首地址MOV DAT2 #00HMOV COM #40HLCALL PR1MOV DAT1 #20H 设置文本显示区域宽度MOV DAT2 #00H 即一行显示年占字节数MOV COM #41HLCALL PR1MOV DAT1 #20H 设置图形显示区域首地址MOV DAT2 #08H 或为文本属性区域首地址MOV COM #42HLCALL PR1MOV DAT1 #20H 设置图形显示区域宽度MOV DAT2 #00H 或为文本属性区域宽度MOV COM #43H 即一行显示所占字节数LCALL PR1MOV COM #0A7H 光标形状设置LCALL PR12MOV COM #80H 显示方式设置逻辑或合成LCALL PR12MOV COM #9CH 显示开关设置LCALL PR12RET2 演示程序段MOV SP #60HORL P3 #1CH 间接控制方式控制线初始化LCALL INTLCALL CLEAR示例二清显示RAM区1 清显示RAM子程序CLEAR MOV DAT1 #00H 设置显示RAM首地址MOV DAT2 #00H 设置CGRAM偏置地址MOV COM #24HLCALL PR1MOV R3 #00H 设置循环量MOV R4 #20HMOV COM #0B0H 设置自动写方式LCALL PR12CLEAR1 LCALL ST3 判状态位S2MOV A #00H 置数据0LCALL PR13 写入数据DJNZ R3 CLEAR1 循环DJNZ R4 CLEAR1MOV COM #0B2H 设置自动写结束指令LCALL PR12RET示例三建立CGRAM程序1 建立CGRAM子程序地址设定在代码为80H起处COUNT EQU 34H 西文字符8 8点阵个数CGRAM MOV DAT1 #03H 设置CGRAM偏置地址MOV DAT2 #00HMOV COM #22HLCALL PR1MOV DAT1 #00H 设置RAM地址指针MOV DAT2 #1CHMOV COM #24HLCALL PR1MOV COM #0B0H 设置自动写方式LCALL R12MOV A COUNT 计算写入的字节数MOV B #08HMUL ABMOV COUNT A 计算器低8位数据INC B 计算器高8位数据MOV DPTR #CGTAB 取字符库首地址PUSH DPH 存字符库指针PUSH DPLCGRAM1 LCALL ST3 判自动写状态位POP DPL 取字符库指针POP DPHCLR AMOVC A @A+DPTR 取数据INC DPTR 字符库指针加一PUSH DPH 存字符库指针PUSH DPLLCALL PR13 写入数据DJNZ CONUT CGRAM1 计数循环DJNZ B CGRAM1MOV COM #0B2H 定入结束自动写指令LCALL PR12POP ACC 修正栈指针POP ACCRET2 汉字库(本字库由PICKHZB.EXE软件提取生成)CGTAB:DB 000H,040H,037H,010H,081H,061H,022H,00AH液DB 016H,02BH,0E2H,022H,022H,022H,023H,022HDB 080H,044H,0FEH,020H,020H,03CH,044H,064HDB 098H,048H,050H,020H,050H,08EH,004H,000HDB 00FH,008H,008H,00FH,008H,008H,00FH,008H晶DB 07EH,042H,042H,07EH,042H,042H,07EH,042HDB 0E0H,020H,020H,0E0H,020H,020H,0E0H,024HDB 0FEH,084H,084H,0FCH,0084,084H,0FCH,084H3 建立CGRAM步骤以汉字液晶为例(1)建立偏置寄存器内容(2)建立字符字模数据及定义该字符的字符代码;“液晶”的字模数据建立在CGTAB内其字符代码分别定义为80H和84H 因为一个汉字字模需要占用四个西文字模的空间所以汉字代码的定义方法如下以80H为例80H 汉字代码表示汉字左上半部字模代码81H 隐含代码表示汉字左下半部字模代码82H 隐含代码表示汉字右上半部字模代码83H 隐含代码表示汉字右下半部字模代码(3)定入CGRAM例如:将汉字“液晶”二字作为自定义字符建立程序如下MOV COUNT #08HLCALL CGRAMSJMP $示例四西文显示1 西文字符写入子程序文本属性显示方式的应用CODE EQU 33H 字符代码ATTR EQU 34H 字符属性码低4位有效O-Y EQU 35H Y坐标0-15O-X EQU 36H X坐标0-29WRI-C MOV A O-Y 计算文本显示RAM地址MOV B #20H 文本显示区宽度为20HMUL ABADD A O-XMOV DAT1 AMOV A BADDC A #00HMOV DAT2 APUSH ACC 存地址的高8位MOV COM #24H 设置地址指针LCALL PR1MOV DAT2 CODE 写入字符代码MOV COM #0C4HLCALL PR11POP ACC 取地址的高8位ADD A #08H 计算相应的属性区RAM地址MOV DAT2 AMOV COM #24H 设置地址指针LCALL PR1MOV DAT2 ATTR 写入属性参数MOV COM #0C4HLCALL PR11RET2 文本属性方式设置程序段MOV COM #84H 设置文本属性显示方式LCALL PR12MOV COM #9FH 开文本和图形显示LCALL PR123 文本属性方式显示演示程序段MOV DAT1 #0EHMOV DAT2 #01HMOV COM #21HLCALL PR1MOV R1 #00HLOOPA MOV R2 #00HMOV R3 #00HMOV R4 #01HLOOPB MOV A R2MOV DPTR #DTABMOVC A @A+DPTRMOV CODE AMOV O-X R3MOV O-Y R4LCALL WRI-CINC R2INC R3MOV A R2CJNE A #14 LOOPBLCALL DELAYINC R1LJMP LOOPADELAY MOV R5 #00HMOV R6 #00HDELAY1 NOPDJNZ R5 DELAY1DJNZ R6 DELAY1RETDTAB DB 37H 45H 4CH 43H 4FH 4DH 45H 00H 39H 4FH 55H WELCONE YOU 示例五汉字显示方式一文本方式下的汉字显示1 汉字写入子程序文本方式CODE EQU 33H 汉字字符代码O-Y EQU 35H Y坐标0-15O-X EQU 36H X坐标0-29WRI-CT MOV A O-Y 计算显示RAM地址MOV B #20HMUL ABADD A O-XMOV DAT1 AMOV A BADDC A #00H 文本显示区首地址为0000HMOV O-Y AMOV DAT2 A 设置显示RAM地址MOV COM #24HLCALL PR1MOV A CODE 取汉字代码MOV DAT2 A 写入左上半部汉字代码MOV COM #0C0HLCALL PR11MOV A CODEADD A #02HMOV DAT2 A 写入右上半部汉字代码LCALL PR11MOV A #20H 显示RAM地址修正ADD A O-XMOV DAT1 ACLR AADDC A O-YMOV COM #24H 设置显示RAM地址LCALL PR1MOV PR1MOV A CODEINC AMOV DAT2 A 写入左下半部汉字代码MOV COM #0C0HLCALL PR11MOV A CODEADD A #03HMOV DAT2 A 写入右下半部汉字代码LCALL PR11RET在示例三上我们已经提供CGRAM的方法并且作为示例建立了汉字液晶二字的字库在此以文本方式显示汉字液晶二字演示程序如下MOV CODE #80H 液MOV O-X #00HMOV O-Y #00HLCALL WRI-CTMOV CODE #84H 晶MOV O-X #07HMOV O-Y 02HLCALL WRI-CTSJMP $示例六汉字显示方式二形方式下的汉字显示软件PICKHZB.EXE建立的汉字库而编制的1 汉字写入子程序图形方式CODE EQU 33H 汉字字符代码O-Y EQU 35H Y坐标0-127O-X EQU 36H X坐标0-29COUNT EQU 34H 计数器WRI-CC MOV A O-Y 计算图形显示RAM地址MOV B #20H 图形显示A区宽度为20HMUL ABADD A O-XMOV O-X AMOV A BADDC A #80H 图形显示区首地址为0800HMOV O-Y AMOV DPTR #CCTAB 计算汉字库字符首地址MOV A CODEMOV B #20HMUL ABADD A DPLMOV DPL AMOV A BADDC A DPHMOV DPH APUSH DPH 存字库地址指针PUSH DPLMOV COUNT #10H 计数器设置为16次WRI-CC1 MOV DAT1 O-X 设置显示RAM地址MOV DAT2 O-YMOV COM #24HLCALL PR1POP DPL 取字库地址指针POP DPHCLR AMOVC A @A+DPTR 取左部字模数据MOV DAT2 A 设置数据MOV A #10H 偏置地址为16MOVC A @A+DPTR 取右部字模数据MOV DAT1 A 暂存数据INC DPTR 字库地址指加一PUSH DPH 存字库地址指针PUSH DPLMOV SOM #0C0H 设置一次写数据指令代码LCALL PR11 写入数据MOV DAT2 DAT1 设置右部数据LCALL PR11 写入数据MOV A #20H 显示RAM地址修正ADD A O-XMOV O-X ACLR AADDC A O-YMOV O-Y ADJNZ CONUT WRI-CC1 计数器循环POP ACC 修正栈指针POP ACCRET2 汉字库(PICKHZB.EXE软件提取生成)CCTAB: DB 004H,00EH,0F8H,008H,008H,0FEH,008H,01CH;科DB 01AH,029H,028H,048H,088H,008H,008H,008HDB 010H,010H,090H,050H,010H,090H,050H,014HDB 01EH,0F0H,010H,010H,010H,010H,010H,010HDB 001H,007H,07CH,004H,004H,005H,0FFH,00CH;利DB 00EH,015H,014H,024H,044H,004H,004H,004HDB 004H,084H,004H,024H,024H,024H,0A4H,024HDB 024H,0A4H,0A4H,024H,004H,004H,014H,008HDB 000H,040H,020H,020H,000H,00FH,0E0H,021H;达DB 021H,022H,022H,024H,028H,050H,08FH,000HDB 080H,080H,080H,080H,088H,0FCH,080H,000HDB 040H,020H,010H,018H,008H,006H,0FCH,000HDB 00/H,00/H,00/H,00/H,00/H,00/H,00/H,00/H;DB 00/H,00/H,00/H,00/H,00/H,00/H,00/H,00/HDB 00/H,00/H,00/H,00/H,00/H,00/H,00/H,00/HDB 00/H,00/H,00/H,00/H,00/H,00/H,00/H,00/H3 图形方式下汉字显示演示程序MOV CODE #00HMOV O-X #00HMOV O-Y #00HLCALL WRI-CCMOV CODE #01HMOV O-X #03HMOV O-Y #00HLCALL WRI-CCMOV O-X #06HMOV O-Y #00HLCALL WRI-CCMOV CODE #03HMOV O-X #09HMOV O-Y #00HLCALL WRI-CCRET附录一T6963C的内部字符集。
t6963c驱动程序藏控制器型图形液晶显示模块的形式出现。
评:系转载,液晶控制器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,即:减去0x8000hzcode=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 charLineWidth,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 <=1k=(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);elsefor(x=x2;x<=x1;x++)y=k*x+b;Pixel(x, y, Mode);else // abs(y1-y2) > abs(x1-x2) K >1k=(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 );elsefor(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); //设置指针地址0000HOutPortCom1(0xb0); //设置自动写状态for(i=0x00;i<0x2000;i++) OutPortData(0x00); // data=0;OutPortCom1(0xb2); //自动写结束//初始化LCD//需要手动设置void InitLCD()OutPortCom3( 0x00,0x00,0x42 ); //设置图形显示区域首地址GraphAddrOutPortCom3( 30,0x00,0x43 ); //设置图形显示区域宽度: LineChar// OutPortCom3( 0x00,0x00,0x42 ); //设置图形显示区域首地址GraphAddr// OutPortCom3( 0x10,0x00,0x43); //设置图形显示区域宽度:10HOutPortCom1(0xa7); //设置光标形状cursor size 8x8OutPortCom1(0x80); //设置显示方式:CGROM方式文本\图形"或"OutPortCom1(0x98); //设置显示开关:1001 1100图形ClearScreen();T6963C引脚说明T6963C的QFD封装共有67个引脚,各引脚说明如下:1、D0-D7:T6963C与MPU接口的数据总线,三态。