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

📄 sed1335.c

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

#define SED1335_C


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

/*
void W_comm(uint8 COMMAND)
{
    PORTB|=(1<<PB5); //RD
    PORTA=COMMAND;
    PORTB|=(1<<PB7); //A0
    PORTB&=~(1<<PB6);//cs
    PORTB&=~(1<<PB4);//WD
    NOP();
    NOP();
    NOP();
    PORTB|=(1<<PB6); //cs
    PORTB|=(1<<PB4); //WD
    PORTB&=~(1<<PB7); //A0
}

void W_code(uint8 code)
{
    PORTA=code;
    PORTB&=~(1<<PB7); //A0
    PORTB|=(1<<PB5); //RD
    PORTB&=~(1<<PB6);//cs
    PORTB&=~(1<<PB4); //WD
    NOP();
    NOP();
    NOP();
    PORTB|=(1<<PB6); //cs
    PORTB|=(1<<PB4); //WD
}
*/
void W_comm(uint8 COMMAND)
{
    RD_H;
    DATAOUT=COMMAND;
    A0_H;
    CS_L;
    WD_L;
    NOP();
    NOP();
    NOP();
    CS_H;
    WD_H;
    A0_L;
}

void W_code(uint8 code)
{
    DATAOUT=code;
    A0_L;
    RD_H;
    CS_L;
    WD_L;
    for(int i=0;i<10;i++)
        NOP();
    CS_H;
    WD_H;
}
void W_data(uint8 z)
{
    W_comm(0X42);
    W_code(z);
}
/*
uint8 r_data(void)
{
    uint8 a;
    W_comm(0X43);
    DDRA=0x00;
    PORTB|=(1<<PB7); //A0
    PORTA=0xff;
    PORTB|=(1<<PB4); //WD
    PORTB&=~(1<<PB6); //cs
    PORTA=0xff;
    PORTB&=~(1<<PB5); //RD
    NOP();
    NOP();
    NOP();
    a=PINA;
    PORTB|=(1<<PB6); //cs
    PORTB|=(1<<PB5); //RD
    PORTA=0x00;
    DDRA=0xff;
    return(a);
}
*/
uint8 r_data(void)
{
    uint8 a;
    W_comm(0X43);
    DATABUS=0x00;
    A0_H;
    DATAOUT=0xff;
    WD_H;
    CS_L;
    DATAOUT=0xff;
    RD_L;
    for(int i=0;i<10;i++)
        NOP();
    a=DATAIN;
    CS_H;
    RD_H;
    DATAOUT=0x00;
    DATABUS=0xff;
    return(a);
}

void set_pos(uint8 pos_x,uint8 pos_y)
{
    uint16 addr;
    if (pos_x>=40)
    {
        pos_x=0;        
    }
    if(pos_y>=240)
    {
        pos_y=0;
    }
    addr=pos_x+pos_y*40;
    W_comm(0x4c);
    W_comm(0x46);
    W_code(LOBYTE(addr));
    W_code(HIBYTE(addr));
}

/****************************************************************************
* 名称:GUI_FillSCR()
* 功能:全屏填充。直接使用数据填充显示缓冲区。
* 入口参数:dat		填充的数据
* 出口参数:无
* 说明:用户根据LCM的实际情况编写此函数。
****************************************************************************/
void  GUI_FillSCR(TCOLOR dat)
{ 
    uint16 k;
    //uint32 i,j;
    //填充缓冲区
    /*
    for(i=0;i<(GUI_LCM_YMAX/8);i++)
    {
        for(j=0;j<GUI_LCM_XMAX;j++)
        {
            //gui_disp_buf[i][j]=dat;
        }
    }*/
    //填充LCM 
    
    k=0x2580;
    W_comm(0x4c);
    W_comm(0x46);
    W_code(0x00);
    W_code(0x00);
    W_comm(0x42);
    do
    {
        W_code(dat);
        k--;
    }
    while(k>0);
}


/****************************************************************************
* 名称:GUI_ClearSCR()
* 功能:清屏。
* 入口参数:无
* 出口参数:无
* 说明:用户根据LCM的实际情况编写此函数。
****************************************************************************/
void  GUI_ClearSCR(void)
{
    unsigned int i;
    i=0x7080;
    W_comm(0x4c);
    W_comm(0x46);
    W_code(0x00);
    W_code(0x00);
    W_comm(0x42);
    do{
        W_code(0x00);
        i--;
    }
    while(i>0);
}

/****************************************************************************
* 名称:GUI_Initialize()
* 功能:初始化GUI,包括初始化显示缓冲区,初始化LCM并清屏。
* 入口参数:无
* 出口参数:无
* 说明:用户根据LCM的实际情况编写此函数。
****************************************************************************/
/*
void  GUI_Initialize(void)
{
    //初始化IO
    DDRB  = 0xFF;
    PORTB &= ~0x08;//复位LCM
    PORTA = 0xFF;
    DDRA  = 0xFF;
    asm("nop");
    asm("nop");
    asm("nop");
    PORTB |= 0x08;//有复位控制0x08   
   
    //init_devices();
    //PORTB&=~(1<<6);     //   /cs -> 0
    W_comm(0x40);//SYSTEM SET
    W_code(0x30);//P1
    W_code(0x87);//P2
    W_code(0x07);//P3
    W_code(0x27);//p4
    W_code(0x42);//p5
    W_code(0xf0);//P6
    W_code(0x28);//p7
    W_code(0x00);//p8
    
    W_comm(0x44);//SCROLL
    W_code(0x00);//P1
    W_code(0x00);//P2
    W_code(0xf0);//P3
    W_code(0x00);//P4
    W_code(0x40);//P5
    W_code(0xf0);//P6
    W_code(0x00);//P7
    W_code(0x80);//P8
    W_code(0x00);//P9
    W_code(0x00);//P10
    
    W_comm(0x5d);//CSR FORM
    W_code(0x07);
    W_code(0x07);
    W_comm(0x5a);//HDOT SCR
    W_code(0x00);
    W_comm(0x5b);//OVLAY
    W_code(0x0d);//异或方式
    //W_code(0x18);
    W_comm(0x59);//DISP ON
    W_code(0x54);//无光标
    //W_code(0x56); //有光标
    //PORTB|=(1<<6);     //   /cs -> 1
    
    //GUI_FillSCR(0x00);	// 初始化缓冲区为0x00,并输出屏幕(清屏)
    GUI_ClearSCR();
}*/
void  GUI_Initialize(void)
{
    //初始化IO
    CTLINIT;
    RES_L;
    DATAINIT;
    for(int i=0;i<10;i++)
        NOP();
    RES_H;//复位控制 
    CS_L;
    
    W_comm(0x40);//SYSTEM SET
    W_code(0x30);//P1
    W_code(0x87);//P2
    W_code(0x07);//P3
    W_code(0x27);//p4
    W_code(0x42);//p5
    W_code(0xf0);//P6
    W_code(0x28);//p7
    W_code(0x00);//p8
    
    W_comm(0x44);//SCROLL
    W_code(0x00);//P1
    W_code(0x00);//P2
    W_code(0xf0);//P3
    W_code(0x00);//P4
    W_code(0x40);//P5
    W_code(0xf0);//P6
    W_code(0x00);//P7
    W_code(0x80);//P8
    W_code(0x00);//P9
    W_code(0x00);//P10
    
    W_comm(0x5d);//CSR FORM
    W_code(0x07);
    W_code(0x07);
    W_comm(0x5a);//HDOT SCR
    W_code(0x00);
    W_comm(0x5b);//OVLAY
    W_code(0x0d);//异或方式
    //W_code(0x18);
    W_comm(0x59);//DISP ON
    W_code(0x54);//无光标
    //W_code(0x56); //有光标
    
    CS_H;
    
    //GUI_FillSCR(0x00);	// 初始化缓冲区为0x00,并输出屏幕(清屏)
    GUI_ClearSCR();
}

/****************************************************************************
* 名称:GUI_Point()
* 功能:在指定位置上画点。
* 入口参数: x		指定点所在列的位置
*            y		指定点所在行的位置
*            color	显示颜色(对于黑白色LCM,为0时灭,为1时显示)
* 出口参数:返回值为1时表示操作成功,为0时表示操作失败。(操作失败原因是指定地址
*             超出有效范围)
* 说明:用户根据LCM的实际情况编写此函数。
****************************************************************************/
uint8  GUI_Point(uint16 x, uint8 y, uint8 color)
{
    uint8 px1;
    uint8 temp,temp1;
    // 参数过滤
    if(x>=GUI_LCM_XMAX) return(0);
    if(y>=GUI_LCM_YMAX) return(0);
    
    px1=x/8;
    temp=x & 0x0007;
    temp =(uint8)(7-temp);
    temp = 1<<temp;
    set_pos(px1,y);   
    temp1=r_data();
    if(color==1)
        temp|=temp1;
    else if(color==0)
        temp=(~temp)&temp1;
    else
        return(0);
    
    set_pos(px1,y);
    W_comm(0X42);
    W_code(temp);  //在屏上写一点
    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)
{
    uint8 px1;
    uint8 temp,temp1;
    // 参数过滤
    if(x>=GUI_LCM_XMAX) return(0);
    if(y>=GUI_LCM_YMAX) return(0);
    
    px1=x/8;
    temp=x & 0x0007;
    temp =(uint8)(7-temp);
    temp = 1<<temp;
    set_pos(px1,y);
    temp1 = r_data();
    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 + -