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

📄 t6963.c

📁 该程序为t6963控制器的c语言驱动程序
💻 C
📖 第 1 页 / 共 2 页
字号:
    return(0); // 返回0 成功
}
/************************/
/* 写单参数的指令*/
/************************/
unsigned char fnPR11(unsigned char uCmd,unsigned char uPar1)
{
    if(fnSTA01() == 0)
    {
        return 1;
    }
    LCMDW=uPar1;
    if(fnSTA01() == 0)
    {
        return 2;
    }
    LCMCW=uCmd;
    return(0); // 返回0 成功 
}
/************************/
/* 写无参数的指令*/
/************************/
unsigned char fnPR12(unsigned char uCmd)
{   
    if(fnSTA01() == 0)
    {
        return 1;
    }
   LCMCW=uCmd;
    return(0); // 返回0 成功
}
/************************/
/* 写数据*/
/************************/
unsigned char fnPR13(unsigned char uData)
{
    if(fnSTA3() == 0)
    {
        return 1;
    }
    LCMDW=uData;
    return(0); // 返回0 成功
}
/************************/
/* 读数据*/
/************************/
unsigned char fnPR2(void)
{
   // unsigned char temp;
    if(fnSTA01() == 0)
    {
         return 1; // 获取状态如果状态错
    }
    return(LCMDW); // 返回数据
}



/************************/
/* 设置当前地址*/   //RAM里
/************************/
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); // 置地址指针为从零开始
    fnPR12(LC_AUT_WR); // 自动写
    for(i=0;i<240*128/8;i++) // 清一屏
    {
        fnSTA3();
        fnPR13(0x0); // 写数据实际使用时请将0x55 改成0x0
    }
    fnPR12(LC_AUT_OVR); // 自动写结束
    fnPR1(LC_ADD_POS,0x00,0x00); // 重置地址指针
    gCurRow = 0; // 置地址指针存储变量
    gCurCol = 0;
}
/************************/
/* LCM 初始化*/
/************************/
char fnLCMInit(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); // 图形显示区宽度
    fnPR12(LC_CUR_SHP | 0x01); // 光标形状
    fnPR12(LC_MOD_OR); // 显示方式设置
    fnPR12(LC_DIS_SW | 0x08); // 显示开关设置
    return(0);
}
/********************************************************/
/* ASCII(8*16) 及 汉字(16*16) 显示函数      */
/********************************************************/
unsigned char dprintf(unsigned char x,unsigned char y, char *ptr)
{
    unsigned char c1,c2,cData;
    unsigned char 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行
            {
        	fnPR12(LC_AUT_WR);    			// 写数据(命令)
        	if (c1 >= 0x20)
          	{
            	    fnPR13( ASC_MSK[(c1-0x20)*ASC_CHR_HEIGHT+j-(16-ASC_CHR_HEIGHT)] );
          	}
        	else
        	{
          	    fnPR13(cData);
          	}
         	fnPR12(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++)    //16行循环
            {
                fnSetPos(uRow+k,uCol);
        	fnPR12(LC_AUT_WR);      		// 写数据
        	if(j < sizeof(GB_16)/sizeof(GB_16[0]))  //四个汉字 第几个汉字
          	{
          	    fnPR13(GB_16[j].Msk[k*2]);
          	    fnPR13(GB_16[j].Msk[k*2+1]);
          	}
        	else   		// 未找到该字
          	{
          	    if(k < sizeof(GB_16[0].Msk)/4)
            	    {
                        fnPR13(0x00);
            		fnPR13(0x00);
            	     }
         	    else
            	    {
            		fnPR13(0xff);
			fnPR13(0xff);
            	    }
                }
        	fnPR12(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 shortdelay(unsigned int tt)
{
    unsigned char i;
    while (tt)
    {
        i=100;
        while (i)
        {
            i--;
        }
    tt--;
    }
}
/*************************/
/* 画点*/
/*************************/
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; // 字节内位置计算
    fnPR12(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;
        }
    }
}
/********************************************/
/* 画圆数学方程(X-Ox)^2+(Y-Oy)^2=Rx^2 */
/********************************************/
void circle(unsigned char Ox,unsigned char Oy,unsigned char Rx,unsigned char s)
{
    unsigned int xx,rr;
    unsigned int xt,yt;
    unsigned int rs,row,col;
    yt = Rx;
    rr = (unsigned int)Rx*Rx+1; // 补偿1 修正方形
    rs = (yt+(yt>>1))>>1; // (*0.75)分开1/8圆弧来画
    for (xt=0;xt<=rs;xt++)
    {
        xx = xt*xt;
        while ((yt*yt)>(rr-xx))
        {
            yt--;
        }
        row = Ox+xt; // 第一象限
        col = Oy-yt;
        point(row,col,s);
        row = Ox-xt; // 第二象限
        point(row,col,s);
        col = Oy+yt; // 第三象限
        point(row,col,s);
        row = Ox+xt; // 第四象限
        point(row,col,s);
        /***************45度镜象画另一半***************/
        row = Ox+yt; // 第一象限
        col = Oy-xt;
        point(row,col,s);
        row = Ox-yt; // 第二象限
        point(row,col,s);
        col = Oy+xt; // 第三象限
        point(row,col,s);
        row = Ox+yt; // 第四象限
        point(row,col,s);
    }
}
void main(void) // 测试用
{
    unsigned char i;
   // DDRA = 0xFF;  //输出
//    port_conp = 0xff;
    shortdelay(1200);
    //MCUCR = 0x00;
    fnLCMInit();
    cls();
    cursor(0,0);
    dprintf(12,1,"mafei is a boy  he loves dan pian ji ");
    dprintf(10,2,"T6963C use ATMega16");
    dprintf(10,3,"~mymach~");
    Linexy(5,5,80,5,8); // 画斜线1
    Linexy(5,5,80,20,8); // 斜线2
    Linexy(80,20,80,5,8); // 斜线3
    
    Linexy(2,2,238,2,8); // ------
    Linexy(2,2,2,62,8); // |
    circle(45,45,20,8); // 画圆 
    circle(45,45,21,8); // 画同心圆加粗 
    shortdelay(2000);
    
    while(1)
    {
        // 变化圆演示直径不断的变化由大到小再由小到大来回缩放
        for (i=20;i>5;i--)
        {
            circle(45,45,i+1,0); // 擦除外圆
            circle(45,45,i,8);
            circle(45,45,i-1,8);
            shortdelay(3000);
        }
   
        shortdelay(500);
        for (i=5;i<20;i++)
        {
            circle(45,45,i-1,0); // 擦除内圆
            circle(45,45,i,8);
            circle(45,45,i+1,8);
            shortdelay(2000);
        }
        shortdelay(3000);
    }
}

⌨️ 快捷键说明

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