微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > T6963C的51单片机驱动程序

T6963C的51单片机驱动程序

时间:12-02 来源:互联网 点击:
#include
#include   #include #include #include #include #include "Test.h"/*   地址定义   */#define  d_c_add XBYTE[0x00] //数据口  命令口/*   常数定义   */#define  uchar unsigned char#define  uint unsigned  int/* T6963C 命令定义 */#define  LCD_CUR_POS  0x21      /* 光标位置设置(只有设置到有效显示地址并打开显示时才看到) */#define  LCD_CGR_POS  0x22      /* CGRAM偏置地址设置(可以增加自已的符号) */#define  LCD_ADR_POS  0x24      /* 地址指针位置(设置读写操作指针) */#define  LCD_TXT_STP  0x40      /* 文本区首址(从此地址开始向屏幕左上角显示字符) */#define  LCD_TXT_WID  0x41      /* 文本区宽度(设置显示宽度,N/6或N/8,其中N为x轴的点数) */#define  LCD_GRH_STP  0x42      /* 图形区首址(从此地址开始向屏幕左上角显示点) */#define  LCD_GRH_WID  0x43      /* 图形区宽度(设置显示宽度,N/6或N/8,其中N为x轴的点数) */#define  LCD_MOD_OR         0x80                        /* 显示方式:逻辑或 */#define  LCD_MOD_XOR  0x81      /* 显示方式:逻辑异或 */#define  LCD_MOD_AND  0x82      /* 显示方式:逻辑与 */#define  LCD_MOD_TCH  0x83      /* 显示方式:文本特征 */#define  LCD_DIS_SW      0x90      /* 显示开关:D0=1/0,光标闪烁启用/禁用 *// *        D1=1/0,光标显示启用/禁用 *//*        D2=1/0,文本显示启用/禁用(打开后再使用) *//*        D3=1/0,图形显示启用/禁用(打开后再使用) */#define  LCD_CUR_SHP  0xA0      /* 光标形状选择:0xA0-0xA7表示光标占的行数 */#define  LCD_AUT_WR      0xB0      /* 自动写设置 */#define  LCD_AUT_RD      0xB1      /* 自动读设置 */#define  LCD_AUT_OVR  0xB2      /* 自动读/写结束 */#define  LCD_INC_WR      0xC0      /* 数据一次写,地址加1 */#define  LCD_INC_RD      0xC1      /* 数据一次读,地址加1 */#define  LCD_DEC_WR   0xC2      /* 数据一次写,地址减1 */#define  LCD_DEC_RD   0xC3      /* 数据一次读,地址减1 */#define  LCD_NOC_WR   0xC4      /* 数据一次写,地址不变 */#define  LCD_NOC_RD   0xC5      /* 数据一次读,地址不变 */#define  LCD_SCN_RD   0xE0      /* 屏读 */#define  LCD_SCN_CP   0xE8      /* 屏拷贝 */#define  LCD_BIT_OP   0xF0      /* 位操作:D0-D2--定义D0-D7位,D3--1为置位,0为清除 *//*  定义标志位  */sbit CD    = P1^0;sbit CE    = P1^1;sbit light = P1^2;extern uchar code HZTable[ ][32];extern uchar code ASCII_DOT_LIB[][16];/********************************************************************************************************//************************************************************************ 名称:LCD_TestStaBit01()* 功能:判断读写指令和读写数据是否允许。* 入口参数:无* 出口参数:返回0表示禁止,否则表示允许***********************************************************************/uchar   LCD_TestStaBit01(void){  uchar i;CD=1;for(i=100; i>0; i--){  if( (d_c_add&0x03)==0x03 ) break;}return(i);}/************************************************************************ 名称:LCD_TestStaBit02()* 功能:查询是否可数据自动读状态* 入口参数:无* 出口参数:返回0表示禁止,否则表示允许***********************************************************************/uchar   LCD_TestStaBit02(void){  uchar i;CD=1;for(i=100; i>0; i--){  if( (d_c_add&0x04)==0x04 ) break;}return(i);}/************************************************************************ 名称:LCD_TestStaBit03()* 功能:数据自动写状态是否允许。* 入口参数:无* 出口参数:返回0表示禁止,否则表示允许***********************************************************************/uchar LCD_TestStaBit03(void){  uchar i;CD=1;for(i=100; i>0; i--){  if( (d_c_add&0x08)==0x08 ) break;}return(i);}/********************************************************************************************************//************************************************************************ 名称:LCD_ReadState()* 功能:读取状态字子程序。* 入口参数:无* 出口参数:返回值即为读出的状态字* 说明:函数会设置LCM数据总线为输入方式***********************************************************************/LCD_WriteCommand(uchar command){CD=1;d_c_add=command;}/********************************************************************************************************//************************************************************************ 名称:LCD_WriteData()* 功能:写数据子程序。(发送数据前,不检查液晶模块的状态)* 入口参数:dat   要写入LCM的数据* 出口参数:无* 说明:函数会设置LCM数据总线为输出方式***********************************************************************/LCD_WriteData(uchar dat){CD=0;d_c_add=dat;}/********************************************************************************************************//************************************************************************ 名称:LCD_ReadData()* 功能:读取数据子程序。* 入口参数:无* 出口参数:返回值即为读出的数据* 说明:函数会设置LCM数据总线为输入方式***********************************************************************/uchar LCD_ReadData(void){uchar dat;CD=0;dat=d_c_add;return dat;}				   /**************************************LCD_WriteTCommand1******************************************************************//************************************************************************ 名称:LCD_WriteTCommand1()* 功能:写无参数命令子程序。会先判断LCM状态字。* 入口参数:command    要写入LCM的命令字* 出口参数:操作出错返回0,否则返回1***********************************************************************/uchar  LCD_WriteTCommand1(uchar command){  if( LCD_TestStaBit01()==0 )return(0);LCD_WriteCommand(command);  // 发送命令字return(1);}/********************************LCD_WriteTCommand2************************************************************************//************************************************************************ 名称:LCD_WriteTCommand2()* 功能:写单参数命令子程序。会先判断LCM状态字。* 入口参数:command   要写入LCM的命令字*          dat1  参数1* 出口参数:操作出错返回0,否则返回1* 说明:先发送参数据数据,再发送命令字***********************************************************************/uchar LCD_WriteTCommand2(uchar command, uchar dat1){  if( LCD_TestStaBit01()==0 ) return(0);LCD_WriteData(dat1);    // 发送数据1if( LCD_TestStaBit01()==0 ) return(0);LCD_WriteCommand(command);  // 发送命令字return(1);}/********************************LCD_WriteTCommand3************************************************************************//************************************************************************ 名称:LCD_WriteTCommand3()* 功能:写双参数命令子程序。会先判断LCM状态字。* 入口参数:command   要写入LCM的命令字*          dat1  参数1*          dat2  参数2* 出口参数:操作出错返回0,否则返回1* 说明:先发送两字节参数据数据,再发送命令字***********************************************************************/uchar  LCD_WriteTCommand3(uchar command, uchar dat1, uchar dat2){  if( LCD_TestStaBit01()==0 ) return(0);LCD_WriteData(dat1);    // 发送数据1if( LCD_TestStaBit01()==0 ) return(0);LCD_WriteData(dat2);    // 发送数据2if( LCD_TestStaBit01()==0 ) return(0);LCD_WriteCommand(command);  // 发送命令字return(1);}/******************************LCD_WriteTData1**************************************************************************//************************************************************************ 名称:LCD_WriteTData1()* 功能:写1字节数据子程序。会先判断状态字。* 入口参数:dat    要写入LCM的数据* 出口参数:操作出错返回0,否则返回1***********************************************************************/uchar  LCD_WriteTData1(uchar dat){  if( LCD_TestStaBit03()==0 ) {return(0);}LCD_WriteData(dat);    // 发送命令字return(1);}/*******************************LCD_Initialize*************************************************************************/void  LCD_Initialize(void){  LCD_WriteTCommand3(LCD_TXT_STP, 0x00, 0x00);   // 设置文本方式RAM起始地址LCD_WriteTCommand3(LCD_TXT_WID, 30, 0x00);   // 设置文本模式的宽度,宽度为N/6或N/8,N为宽度点数,如240LCD_WriteTCommand3(LCD_GRH_STP, 0x00, 0x00);   // 设置图形方式RAM起始地址LCD_WriteTCommand3(LCD_GRH_WID, 30, 0x00);   // 设置图形模式的宽度,宽度为N/6或N/8,N为宽度点数,如240LCD_WriteTCommand1(LCD_MOD_OR);      // 设置显示方式为"或"LCD_WriteTCommand1(LCD_DIS_SW|0x08);     // 设置纯图形显示模式LCD_WriteTCommand1(LCD_CUR_SHP|0x07);    // 光标形状}/*********************************LCD_FillAll**********************************************************************/void  LCD_FillAll(uchar dat){  uint  i;LCD_WriteTCommand3(LCD_ADR_POS, 0x00, 0x00);   // 置地址指针LCD_WriteTCommand1(LCD_AUT_WR);      // 自动写for(i=0;i<128*30;i++){  LCD_WriteTData1(dat);        // 写数据}LCD_WriteTCommand1(LCD_AUT_OVR);      // 自动写结束LCD_WriteTCommand3(LCD_ADR_POS,0x00,0x00);   // 重置地址指针}/********************************************************************************************************/void Write_Hz(uchar x,uchar y,uchar datah){uchar i;uint StartAddr;StartAddr=x*480+y;     for(i=0;i<16;i++){ LCD_WriteTCommand3(LCD_ADR_POS,StartAddr,((StartAddr)/256));LCD_WriteTCommand2(LCD_INC_WR,HZTable[datah][i*2] );LCD_WriteTCommand2(LCD_NOC_WR,HZTable[datah][i*2+1]);StartAddr=StartAddr + 30;}}/********************************************************************************************************///显示数字void Write_No(uchar x,uchar y,uchar ch){uchar i, dat;uint StartAddr;StartAddr=x*480+y; for(i=0;i<16;i++){dat=ASCII_DOT_LIB[ch][i];LCD_WriteTCommand3(LCD_ADR_POS,StartAddr,StartAddr>>8);LCD_WriteTCommand2(LCD_NOC_WR,dat);StartAddr=StartAddr + 30;}}/********************************************************************************************************///显示字母,纵向写字,取模方式:纵向取模,字节正序void Write_Char(uchar x,uchar y,uchar ch){uchar i, dat;uint StartAddr,StartAddr1;StartAddr=x*240+y;StartAddr1=x*240+y+1;for(i=0;i<8;i++){ dat=ASCII_DOT_LIB[ch][i];LCD_WriteTCommand3(LCD_ADR_POS,StartAddr,StartAddr>>8);LCD_WriteTCommand2(LCD_NOC_WR,dat);StartAddr=StartAddr+30;} for(i=0;i<8;i++){ dat=ASCII_DOT_LIB[ch][i+8];LCD_WriteTCommand3(LCD_ADR_POS,StartAddr1,StartAddr1>>8);LCD_WriteTCommand2(LCD_NOC_WR,dat);StartAddr1=StartAddr1+30;} }/********************************************************************************************************/void Charline(uchar x,uchar y ,uchar n,uchar m){uchar i;for(i=0;i>8);//LCD_WriteTCommand1(0xc5); //数据一次读,地址不变//dat=LCD_ReadData(); //读入数据dat=ASCII_DOT_LIB[ch][i];dat=(0xff-dat); //取反//LCD_WriteTCommand2( dat, 0xc4); //送回LCD_WriteTCommand2(LCD_NOC_WR,dat);StartAddr=StartAddr+30;}for(i=0;i<8;i++){LCD_WriteTCommand3(LCD_ADR_POS,StartAddr1,StartAddr1>>8);//LCD_WriteTCommand1(0xc5); //数据一次读,地址不变// dat=LCD_ReadData(); //读入数据dat=ASCII_DOT_LIB[ch][i+8];dat=(0xff-dat); //取反// LCD_WriteTCommand2(dat, 0xc4); //送回LCD_WriteTCommand2(LCD_NOC_WR,dat);StartAddr1=StartAddr1+30;}}/**********************************//= 函数原型: 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;uchar StartAddrL,StartAddrH;unsigned char dat;StartAddr=(uint)((uint)PointX*30 + PointY/8 );//grhomeStartAddrL=StartAddr&0xFF;StartAddrH=StartAddr>>8;dat=LCD_BIT_OP+7-PointY%8; //生产位操作命令画点的数据if(Mode) dat=dat|0x08;LCD_WriteTCommand3(LCD_ADR_POS,StartAddrL,StartAddrH);//设置该点所在单元地址LCD_WriteTCommand1(dat); // 利用位操作命令画点}/**********************************//= 函数原型: void line( unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2, bit Mode)//= 功    能: 划线函数//= 参    数: 坐标1,坐标2,显示点或清除点//= 返 回 值://= 函数性质:私有函数//= 其它:显示点阵不超过255*255/**********************************/void line( unsigned char y1,unsigned char x1, unsigned char y2,unsigned char x2,  bit Mode){unsigned char x,y;float 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=(uchar)(k*x+b);Pixel(x, y, Mode);}}else{for(x=x2;x<=x1;x++){y=(uchar)(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=(uchar)(k*y+b);Pixel( x , y,Mode );}}else{for(y=y2;y<=y1;y++){x=(uchar)(k*y+b);Pixel( x , y,Mode );}}}}/********************************************************************************************************/uchar code HZTable[ ][32]={{0x40,0x02,0x27,0xC2,0x24,0x42,0x84,0x52,0x45,0x52,0x55,0x52,0x15,0x52,0x25,0x52,0x25,0x52,0x25,0x52,0xC5,0x52,0x41,0x02,0x42,0x82,0x42,0x42,0x44,0x4A,0x48,0x04},/*"测",0*/{0x00,0x20,0x40,0x28,0x20,0x24,0x30,0x24,0x27,0xFE,0x00,0x20,0xE0,0x20,0x27,0xE0,0x21,0x20,0x21,0x10,0x21,0x10,0x21,0x0A,0x29,0xCA,0x36,0x06,0x20,0x02,0x00,0x00},/*"试",1*/{0x0D,0xF8,0x71,0x08,0x11,0x08,0x11,0x08,0xFD,0x08,0x11,0xF8,0x30,0x00,0x3B,0xFC,0x54,0x40,0x50,0x40,0x93,0xFC,0x10,0x40,0x10,0x40,0x10,0x40,0x17,0xFE,0x10,0x00},/*"程",2*/{0x01,0x00,0x00,0x80,0x3F,0xFE,0x20,0x00,0x27,0xF8,0x21,0x10,0x20,0xA0,0x20,0x40,0x2F,0xFE,0x20,0x44,0x20,0x40,0x20,0x40,0x20,0x40,0x40,0x40,0x41,0x40,0x80,0x80},/*"序",0*/{0x06,0x40,0x38,0x50,0x08,0x48,0x08,0x48,0x08,0x40,0xFF,0xFE,0x08,0x40,0x08,0x48,0x0E,0x28,0x38,0x30,0xC8,0x20,0x08,0x50,0x09,0x92,0x08,0x0A,0x28,0x06,0x10,0x02},/*"我",1*/};unsigned char code ASCII_DOT_LIB[][16]={//正确的,纵向取模,字节正序0x00,0x10,0x18,0x14,0x03,0x11,0x1F,0x10,0x00,0x04,0x1C,0x64,0x80,0x04,0xFC,0x04,0x00,0x08,0x10,0x17,0x11,0x11,0x1F,0x10,0x00,0x18,0x04,0xC4,0x04,0x04,0xFC,0x04,0x00,0x10,0x1C,0x13,0x00,0x13,0x1C,0x10,0x00,0x00,0x00,0x04,0xFC,0x04,0x00,0x00,0x00,0x07,0x08,0x10,0x10,0x08,0x07,0x00,0x00,0xF0,0x08,0x04,0x04,0x08,0xF0,0x00,  // -0-0x00,0x00,0x00,0x00,0x1F,0x08,0x08,0x00,0x00,0x00,0x04,0x04,0xFC,0x04,0x04,0x00,  // -1-0x00,0x0E,0x11,0x10,0x10,0x10,0x0E,0x00,0x00,0x0C,0x84,0x44,0x24,0x14,0x0C,0x00,  // -2-0x00,0x0C,0x12,0x11,0x11,0x10,0x0C,0x00,0x00,0x70,0x88,0x04,0x04,0x04,0x18,0x00,  // -3-0x00,0x00,0x1F,0x08,0x04,0x03,0x00,0x00,0x00,0x24,0xFC,0x24,0x24,0x20,0xE0,0x00,  // -4-0x00,0x10,0x10,0x11,0x11,0x10,0x1F,0x00,0x00,0x70,0x88,0x04,0x04,0x84,0x98,0x00,  // -5-0x00,0x00,0x18,0x11,0x11,0x08,0x07,0x00,0x00,0x70,0x88,0x04,0x04,0x88,0xF0,0x00,  // -6-};

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top