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

📄 t6963.h

📁 这是从51上移植过来T6963的源码和Proteus。用CodeVisionAVR编写的。
💻 H
字号:




// ASCII 字符控制代码解释定义
#define STX 0x02
#define ETX 0x03
#define EOT 0x04
#define ENQ 0x05
#define BS 0x08
#define CR 0x0D
#define LF 0x0A
#define DLE 0x10
#define ETB 0x17
#define SPACE 0x20
#define COMMA 0x2C
#define TRUE 1
#define FALSE 0
#define HIGH 1
#define LOW 0

#define LCD_OUT    PORTC
#define LCD_IN     PINC
#define dir_datap  DDRC

#define LCM PORTD.2  //数据寄存器、控制寄存器选择
#define RD PORTD.1
#define WR PORTD.0

// T6963C 命令定义
#define LC_CUR_POS 0x21 // 光标位置设置
#define LC_CGR_POS 0x22 // CGRAM 偏置地址设置
#define LC_ADD_POS 0x24 // 地址指针位置
#define LC_TXT_STP 0x40 // 文本区首址
#define LC_TXT_WID 0x41 // 文本区宽度
#define LC_GRH_STP 0x42 // 图形区首址
#define LC_GRH_WID 0x43 // 图形区宽度
#define LC_MOD_OR 0x80 // 显示方式逻辑或
#define LC_MOD_XOR 0x81 // 显示方式逻辑异或
#define LC_MOD_AND 0x82 // 显示方式逻辑与
#define LC_MOD_TCH 0x83 // 显示方式文本特征
#define LC_DIS_SW 0x90 // 显示开关D0=1/0:光标闪烁启用/禁用
// D1=1/0:光标显示启用/禁用
// D2=1/0:文本显示启用/禁用
// D3=1/0:图形显示启用/禁用
#define LC_CUR_SHP 0xA0 // 光标形状选择0xA0-0xA7表示光标占的行数
#define LC_AUT_WR 0xB0 // 自动写设置
#define LC_AUT_RD 0xB1 // 自动读设置
#define LC_AUT_OVR 0xB2 // 自动读/写结束
#define LC_INC_WR 0xC0 // 数据一次写地址加1






#define NOP() delay_us(1)
// D0-D2 定义D0-D7 位D3 1置位0 清除
// ASCII 字模宽度及高度定义
// ASCII 字模宽度及高度定义
#define ASC_CHR_WIDTH 8
#define ASC_CHR_HEIGHT 16
// ASCII 字模显示为8*16
flash unsigned char  turnf[8] = {7,6,5,4,3,2,1,0};
unsigned char cData;
unsigned char gCurRow,gCurCol; // 当前行列存储行高16 点列宽8点
/************************************************/
/* 取当前行数据*/
/************************************************/
unsigned char fnGetRow(void)
{
    return(gCurRow);
}
/************************************************/
/* 取当前列数据*/
/************************************************/
unsigned char fnGetCol(void)
{
    return(gCurCol);
}
/************************************************/
/* 读状态*/
/************************************************/
unsigned char RD_LCM(void)
{
    unsigned char temp;
    dir_datap=0x00;
    LCM=1; //LCM=LCMCW;
    RD=0;;  //RD=0;
    NOP();
    temp=LCD_IN;
    RD=1;     //RD=1;
    dir_datap = 0xff;
    return(temp);
}
/************************************************/
/* 读数据*/
/************************************************/

/************************************************/
/* 写数据*/
/************************************************/
void WR_DAT(unsigned char val)
{
    dir_datap = 0xff;
    LCM=0;     //LCM=LCMDW;
    LCD_OUT = val;
    WR=0;      //WR=0;
    NOP();
    NOP();
    WR=1;      //WR=1;
}
/************************************************/
/* 写命令*/
/************************************************/
void WR_CMD(unsigned char val)
{
    dir_datap = 0xff;
    LCM=1;    //LCM=LCMCW;
    LCD_OUT = val;
    WR=0;       //WR=0;
    NOP();
    NOP();
    WR=1;        //WR=1;
}
/************************************************/
/* 状态位STA1,STA0判断读写指令和读写数据*/
/* 在读写数据或者写入命令前必须保证均为1 */
/************************************************/
unsigned char fnSTA01(void)
{
    unsigned char i;
    for(i=10;i>0;i--)
    {
        if((RD_LCM() & 0x03) == 0x03) // 读取状态
        {
            break;
        }
    }
    return(i); // 若返回零说明错误
}

/***********************************************/
/* 状态位STA3 判断STA3 = 1 数据自动写状态*/
/***********************************************/
unsigned char fnSTA3(void)
{
    unsigned char i;
    for(i=10;i>0;i--)
    {
        if((RD_LCM() & 0x08) == 0x08)
        {
            break;
        }
    }
    return(i); // 若返回零说明错误
}
/************************************************/
/* 状态位STA6 判断STA6 =1 屏读/屏拷贝状态*/
/************************************************/

/************************/
/* 写双参数的指令*/
/************************/
unsigned char fnPR1(unsigned char uCmd,unsigned char uPar1,unsigned char uPar2)
{
    if(fnSTA01() == 0)
    {
        return 1;
    }
    WR_DAT(uPar1);
    if(fnSTA01() == 0)
    {
        return 2;
    }
    WR_DAT(uPar2);
    if(fnSTA01() == 0)
    {
        return 3;
    }
    WR_CMD(uCmd);
    return(0); // 返回0 成功
}

/************************/
/* 写无参数的指令*/
/************************/
unsigned char write_com(unsigned char uCmd)
{
    if(fnSTA01() == 0)
    {
        return 1;
    }
    WR_CMD(uCmd);
    return(0); // 返回0 成功
}
/************************/
/* 写数据*/
/************************/
unsigned char write_data(unsigned char uData)
{
    if(fnSTA3() == 0)
    {
        return 1;
    }
    WR_DAT(uData);
    return(0); // 返回0 成功
}

/************************/
/* 设置当前地址*/
/************************/
void fnSetPos(unsigned char urow, unsigned char ucol)
{
    unsigned int iPos;
    iPos = (unsigned int)urow * 30 + ucol;
    fnPR1(LC_ADD_POS,iPos & 0xFF,iPos / 256);
    gCurRow = urow;
    gCurCol = ucol;
}
/**********************/
/* 设置当前显示行列*/
/**********************/
void cursor(unsigned char uRow, unsigned char uCol)
{
    fnSetPos(uRow * 16, uCol);
}
/*********************/
/* 清屏*/
/*********************/
void cls(void)
{
    unsigned int i;
    fnPR1(LC_ADD_POS,0x00,0x00); // 置地址指针为从零开始
    write_com(LC_AUT_WR); // 自动写
    for(i=0;i<240*128/8;i++) // 清一屏
    {
        fnSTA3();
        write_data(0x0); // 写数据实际使用时请将0x55 改成0x0
    }
    write_com(LC_AUT_OVR); // 自动写结束
    fnPR1(LC_ADD_POS,0x00,0x00); // 重置地址指针
    gCurRow = 0; // 置地址指针存储变量
    gCurCol = 0;
}
/************************/
/* LCM 初始化*/
/************************/
char LCD_ini(void)
{
    if(fnPR1(LC_TXT_STP,0x00,0x00) != 0) // 文本显示区首地址
    {
        return (0xff);
    }
    fnPR1(LC_TXT_WID,0x1E,0x00); // 文本显示区宽度
    fnPR1(LC_GRH_STP,0x00,0x00); // 图形显示区首地址
    fnPR1(LC_GRH_WID,0x1E,0x00); // 图形显示区宽度
    write_com(LC_CUR_SHP | 0x01); // 光标形状
    write_com(LC_MOD_OR); // 显示方式设置
    write_com(LC_DIS_SW | 0x08); // 显示开关设置
    return(0);
}


//--------------------------------------------
//         指定位置向LCD写入指定字符
// 参数说明:x、y 坐标 cha字符串 flag 反白显示标志 1正常,0反白
//
//--------------------------------------------
unsigned char write_lcd(unsigned char x,unsigned char y, flash char *ptr)
{

    unsigned int c1,c2;
    unsigned int i,j,uLen,uRow,uCol;
    unsigned int  k;
    uLen=0;
    i=0;
    uRow = y;
    uCol = x;
    fnSetPos(uRow*16,uCol);      //起点定位
    while (ptr[uLen]!=0) //探测字串长度
    {
        uLen++;
    }
    while(i<uLen)
    {
        c1 = ptr[i];
        c2 = ptr[i+1];
        //ascii字符与汉字内码的区别在于128做分界,大于界线的为汉字码
        uRow = fnGetRow();
        uCol = fnGetCol();
        if(c1 <=128)    // ASCII
          {
            for(j=0;j<16;j++) //写16行
            {
            write_com(LC_AUT_WR);                // 写数据(命令)
            if (c1 >= 0x20)
              {
                write_data(ASC_MSK[(c1-0x20)*ASC_CHR_HEIGHT+j-(16-ASC_CHR_HEIGHT)]);
              }
            else
              {
                  write_data(cData);
              }
            write_com(LC_AUT_OVR);              //写数据结束
            fnSetPos(uRow+j+1,uCol);
             }
            if(c1 != BS)  	// 非退格
            {
                uCol++;   // 列数加1
            }

        }
    	else    	// 中文
      	{
            for(j=0;j<sizeof(GB_16)/sizeof(GB_16[0]);j++)  	// 查找定位
            {
                if(c1 == GB_16[j].Index[0] && c2 == GB_16[j].Index[1])
                {
                    break;
                }

            }
            for(k=0;k<sizeof(GB_16[0].Msk)/2;k++)
               {
                   fnSetPos(uRow+k,uCol);
        	       write_com(LC_AUT_WR);      		// 写数据
        	       if(j < sizeof(GB_16)/sizeof(GB_16[0]))
          	         {
                         write_data(GB_16[j].Msk[k*2]);
                         write_data(GB_16[j].Msk[k*2+1]); //16*16,每行2字节

          	         }
        	       else   		// 未找到该字
          	          {
          	           if(k < sizeof(GB_16[0].Msk)/4)
            	           {
                               write_data(0x00);
            		           write_data(0x00);
            	           }
         	           else
            	           {
            		           write_data(0xff);
			                   write_data(0xff);
            	           }
                      }
        	       write_com(LC_AUT_OVR);
               }
      	    uCol += 2;
      	    i++;
        };
    	if(uCol >= 30)      					// 光标后移
      	{
      	    uRow += 16;
            if(uRow < 0x80)
            {
                uCol -= 30;
            }
      	    else
            {
        	uRow = 0;
        	uCol = 0;
            }
      	 }
         fnSetPos(uRow,uCol);
    	 i++;
    }
    return uLen;        //返回字串长度,汉字按2字节计算
}
/*************************/
/* 画点*/
/*************************/
void point(unsigned char x,unsigned char y,unsigned char s)
{
    unsigned char x1;
    x1 = x >> 3; // 取Y方向分页地址
    fnSetPos(y,x1); // 起点定位
    x1 = turnf[ x & 0x07 ];
    x1 = 0xF0 | x1 | s; // 字节内位置计算
    write_com(x1); // 画上屏幕S显示属性8 画点0 擦除点
}
/************************************************/
/* 画线任意方向的斜线,直线数学方程aX+bY=1 */
/************************************************/
void Linexy(unsigned char x0,unsigned char y0,unsigned char xt,unsigned char yt,unsigned char s)
{
    register unsigned char t;
    int xerr = 0,yerr = 0;
    int delta_x,delta_y,distance;
    int incx,incy,uRow,uCol;
    delta_x = xt-x0; // 计算坐标增量
    delta_y = yt-y0;
    uRow = x0;
    uCol = y0;
    if(delta_x>0)
    {
        incx = 1; // 设置单步方向
    }
    else if( delta_x==0 )
    {
        incx=0; // 垂直线
    }
    else
    {
        incx = -1;
        delta_x = -delta_x;

    }
    if(delta_y>0)
    {
        incy=1;
    }
    else if( delta_y==0 )
    {
        incy=0; // 水平线
    }
    else
    {
        incy=-1;
        delta_y=-delta_y;
    }
    if( delta_x > delta_y )
    {
        distance=delta_x; // 选取基本增量坐标轴
    }
    else
    {
        distance=delta_y;
    }
    for( t=0;t <= distance+1; t++ )   // 画线输出
    {
        point(uRow,uCol,s); // 画点
        xerr += delta_x;
        yerr += delta_y;
        if( xerr > distance )
        {
            xerr -= distance;
            uRow += incx;
        }
        if( yerr > distance )
        {
            yerr -= distance;
            uCol += incy;
        }
    }
}

⌨️ 快捷键说明

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