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

📄 t6963.c

📁 周立功GUI在avr单片机上的移植 开发环境为IAR
💻 C
字号:
/****************************************************************************
* 文件名:T6963.C
*   功能:T6963图形液晶模块驱动程序。
          用于ZLG/GUI用户图形界面。
*   作者:钱巍
*   日期:2006/5/20
****************************************************************************/

#include "all.h"
#ifdef T6963

#define T6963_C

/* 定义显示缓冲区 */
//TCOLOR  gui_disp_buf[GUI_LCM_YMAX][GUI_LCM_XMAX/8];

__flash unsigned char  turnf[8] = {7,6,5,4,3,2,1,0};


// 读状态
unsigned char RD_LCM(void)
{
    unsigned char temp;
    DATABUS = 0x00;
    CD_H;
#ifdef CS
    CS_L;
#endif
    RD_L;
    NOP();
    temp=DATAIN;
    RD_H;
    DATABUS = 0xff;
#ifdef CS
    CS_H;
#endif
    return(temp);
}

// 读数据
unsigned char RD_DAT(void)
{
    unsigned char temp;
    DATABUS = 0x00;
    CD_L;
#ifdef CS
    CS_L;
#endif
    RD_L;
    NOP();
    temp=DATAIN;
    RD_H;
    DATABUS = 0xff;
#ifdef CS
    CS_H;
#endif
    return(temp);
}

// 写数据
void WR_DAT(unsigned char val)
{
    DATABUS = 0xff;
    CD_L;
#ifdef CS
    CS_L;
#endif
    DATAOUT = val;
    WR_L;
    NOP();
    NOP();
    WR_H;
#ifdef CS
    CS_H;
#endif
}

// 写命令
void WR_CMD(unsigned char val)
{
    DATABUS = 0xff;
    CD_H;
    DATAOUT = val;
#ifdef CS
    CS_L;
#endif
    WR_L;
    NOP();
    NOP();
    WR_H;
#ifdef CS
    CS_H;
#endif    
}

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

// 检查STA2,如果STA2=1 为自动读状态
unsigned char fnSTA2(void)
{
    unsigned char i;
    for(i=10;i>0;i--)
    {
        if((RD_LCM() & 0x04) == 0x04)
        {
            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); // 若返回零说明错误
}


// 写双参数的指令
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 fnPR11(unsigned char uCmd,unsigned char uPar1)
{
    if(fnSTA01() == 0)
    {
        return 1;
    }
    WR_DAT(uPar1);
    if(fnSTA01() == 0)
    {
        return 2;
    }
    WR_CMD(uCmd);
    return(0); // 返回0 成功 
}

// 写无参数的指令
unsigned char fnPR12(unsigned char uCmd)
{   
    if(fnSTA01() == 0)
    {
        return 1;
    }
    WR_CMD(uCmd);
    return(0); // 返回0 成功
}

// 写数据
unsigned char fnPR13(unsigned char uData)
{
    if(fnSTA3() == 0)
    {
        return 1;
    }
    WR_DAT(uData);
    return(0); // 返回0 成功
}

// 读数据
unsigned char fnPR2(void)
{
    unsigned char temp;
    if(fnSTA01() == 0)
    {
         return 1; // 获取状态如果状态错
    }
    temp=RD_DAT();
    return(temp); // 返回数据
}

// 设置当前地址
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);
}

/**********************/
/* 设置当前显示行列*/
/**********************/
void cursor(unsigned char uRow, unsigned char uCol)
{
    fnSetPos(uRow * 16, uCol);
}

/****************************************************************************
* 名称:GUI_FillSCR()
* 功能:全屏填充。直接使用数据填充显示缓冲区。
* 入口参数:dat		填充的数据
* 出口参数:无
* 说明:用户根据LCM的实际情况编写此函数。
****************************************************************************/
void  GUI_FillSCR(TCOLOR dat)
{ 
    uint16 k;
    //填充LCM 
    
    k=0x2580;
    fnSetPos(0,0);
    fnPR12(LC_AUT_WR);
    do
    {
        fnPR13(dat);
        k--;
    }
    while(k>0);
}


/****************************************************************************
* 名称:GUI_ClearSCR()
* 功能:清屏。
* 入口参数:无
* 出口参数:无
* 说明:用户根据LCM的实际情况编写此函数。
****************************************************************************/
void  GUI_ClearSCR(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); // 重置地址指针
}

void  GUI_Initialize(void)
{
    CTLBUS = 0xFF;
    CTLOUT = 0xff;
#ifdef RES
    RES_L;
    _NOP();
    _NOP();
    RES_H;
#endif
    
    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); // 显示开关设置,0x08开图形层
    
    GUI_ClearSCR();

}

/****************************************************************************
* 名称:GUI_Point()
* 功能:在指定位置上画点。
* 入口参数: x		指定点所在列的位置
*            y		指定点所在行的位置
*            color	显示颜色(对于黑白色LCM,为0时灭,为1时显示)
* 出口参数:返回值为1时表示操作成功,为0时表示操作失败。(操作失败原因是指定地址
*             超出有效范围)
* 说明:用户根据LCM的实际情况编写此函数。
****************************************************************************/
uint8  GUI_Point(uint16 x, uint8 y, uint8 color)
{
    unsigned char x1;
    
    if(x>=GUI_LCM_XMAX) return(0);
    if(y>=GUI_LCM_YMAX) return(0);
    
    x1 = x >> 3; // 取Y方向分页地址
    fnSetPos(y,x1); // 起点定位
    x1 = turnf[ x & 0x07 ];
    if(color==1)
        x1 = 0xF0 | x1 | 0x08; // 字节内位置计算
    else
        x1 = 0xF0 | x1 | 0x00; // 字节内位置计算 
    fnPR12(x1); // 画上屏幕S显示属性8 画点0 擦除点
    
    return(1);
}

/****************************************************************************
* 名称:GUI_ReadPoint()
* 功能:读取指定点的颜色。
* 入口参数:x		指定点所在列的位置
*           y		指定点所在行的位置
*           ret     保存颜色值的指针
* 出口参数:返回0表示指定地址超出缓冲区范围
* 说明:对于单色,设置ret的d0位为1或0,4级灰度则为d0、d1有效,8位RGB则d0--d7有效,
*      RGB结构则R、G、B变量有效。
****************************************************************************/
uint8  GUI_ReadPoint(uint16 x, uint8 y, TCOLOR *ret)
{
    unsigned char x1,temp,temp1;
    
    if(x>=GUI_LCM_XMAX) return(0);
    if(y>=GUI_LCM_YMAX) return(0);
    x1 = x/8; // 取Y方向分页地址
    temp=x & 0x0007;
    temp =(uint8)(7-temp);
    temp = 1<<temp;
    fnSetPos(y,x1); // 起点定位
    if(fnSTA01() == 0)
    {
         return (0); // 获取状态如果状态错
    }
    temp1=RD_DAT();
    if(temp1&temp==0)
        *ret = 0x00;
    else
        *ret = 0x01;
    return(1);
}

/****************************************************************************
* 名称:GUI_HLine()
* 功能:画水平线。
* 入口参数:x0		水平线起点所在列的位置
*           y0		水平线起点所在行的位置
*           x1      水平线终点所在列的位置
*           color	显示颜色(对于黑白色LCM,为0时灭,为1时显示)
* 出口参数:无
* 说明:操作失败原因是指定地址超出缓冲区范围。
****************************************************************************/
void  GUI_HLine(uint16 x0, uint8 y0, uint16 x1, TCOLOR color)
{
    uint8  bak;    
    if(x0>x1) 				// 对x0、x1大小进行排列,以便画图
    {
        bak = x1;
        x1 = x0;
        x0 = bak;
    }   
    do
    {
        GUI_Point(x0, y0, color);	// 逐点显示,描出垂直线
        x0++;
    }
    while(x1>=x0);
}

/***********************************************************************
* 名称:GUI_RLine()
* 功能:画竖直线。根据硬件特点,实现加速。
* 入口参数:x0		垂直线起点所在列的位置
*           y0		垂直线起点所在行的位置
*           y1      垂直线终点所在行的位置
*           color	显示颜色(对于黑白色LCM,为0时灭,为1时显示)
* 出口参数:	无
* 说明:操作失败原因是指定地址超出缓冲区范围。
***********************************************************************/
void  GUI_RLine(uint16 x0, uint8 y0, uint8 y1, TCOLOR color)
{
    uint8  bak;
    if(y0>y1) 		// 对y0、y1大小进行排列,以便画图
    {
        bak = y1;
        y1 = y0;
        y0 = bak;
    }
    do
    {
        GUI_Point(x0, y0, color);	// 逐点显示,描出垂直线
        y0++;
    }
    while(y1>=y0);
}
#endif

⌨️ 快捷键说明

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