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

📄 lcddrive.c

📁 MINIGUI 加UCOS 很好的源代码 找了好久才找到了 拿出来与大家一起分享!
💻 C
字号:
/****************************************************************************************
* 文件名:LCDDRIVE.C
* 功能:通过操作S1D13503,控制256色RGB伪彩液晶显示屏。
* 说明:使用LPC2200芯片控制,8位总线接口。
*       S1D13503的寄存器地址为0x838000xx,显示存储器的地址为0x834xxxxx。
* 作者:黄绍斌
* 日期:2005.05.26
****************************************************************************************/
#include "lpc2294.h"
#include "lcddrive.h"

// 定义S1D13503控制地址
#define  S1D13503_REG    	0x83800000
#define  S1D13503_DAT    	0x83400000


// S1D13503配置设置值
uint8 const  INIT_TAB[14] = { 0x00, // 寄存器0 -- 00000000B (正常工作模式,即非测试模式)
							  0xBD,	// 寄存器1 -- 10111101B (模式控制:打开显示,单屏,屏蔽XSCL水平非显示周期输出,使能LCDENB,彩色8位LCD数据--无XCSL2,16位显示存储数据总线方式)  
							  159,	// 寄存器2 -- 159 (行字节控制)(每行显示占用的存储器字节数,即列参数)
							  0x0E, // 寄存器3 -- 00001110B (非节功模式,256彩色方式)
							  239,  // 寄存器4 -- 239 (总行数)
							  0,	// 寄存器5 -- 0 (WF翻转周期,为0时表示每一帧WF输出翻转一次)
							  0x00,	// 寄存器6 -- 00H (第一屏显示RAM地址低8位)
							  0x00, // 寄存器7 -- 00H (第一屏显示RAM地址高8位)
							  0x00,	// 寄存器8 -- 00H (第二屏显示RAM地址低8位)
							  0x00, // 寄存器9 -- 00H (第二屏显示RAM地址高8位)
							  239,  // 寄存器A -- 239 (显示一区占用行数)
							  0, 	// 寄存器B -- 0 (显示一区占用行数,高2位)
							  10,	// 寄存器C -- 10 (水平默认不显示周期) 
							  0		// 寄存器D -- 0 (显示域冗余宽度,正常操作模式)
                            }; 
                                                      
/****************************************************************************
* 名称:S1D13503_Init()
* 功能:初始化S1D13503。320x240 256色单屏彩屏。
* 入口参数:无
* 出口参数:无
* 说明:本子程序对S1D13503寄存器0--D进行初始化(使用查表方法)
****************************************************************************/
void  S1D13503_Init(void)
{  volatile uint16  *REG_Point;
   uint8  i; 

   REG_Point = (void *) S1D13503_REG;
   for(i=0; i<14; i++)				// 共初始化14个寄存器
   {  *REG_Point = INIT_TAB[i];		// 查表取出数据,然后赋值给S1D13503相应的寄存器,实现初始化
      REG_Point++;					// 指向下一寄存器
   }
}


// S1D13503调色板设置值
uint8 const  LUT_RED_TAB[16] = { 0, 3, 5, 7, 9, 11, 13, 15,
                                 0, 3, 5, 7, 9, 11, 13, 15
                               };
uint8 const  LUT_GRN_TAB[16] = { 0, 3, 5, 7, 9, 11, 13, 15,
                                 0, 3, 5, 7, 9, 11, 13, 15
                               };
uint8 const  LUT_BLU_TAB[16] = { 0, 6, 10, 15,
                                 0, 6, 10, 15,
                                 0, 6, 10, 15, 
                                 0, 6, 10, 15
                               };                                                              
/****************************************************************************
* 名称:S1D13503_LutInit()
* 功能:初始化S1D13503的调色板,红、绿基色设置为0、3、5、7、9、11、13、15,
*      蓝基色设置为0、6、10、15。
* 入口参数:无
* 出口参数:无
* 说明:使用液晶屏之前要初始化S1D13503的调色板
****************************************************************************/
void  S1D13503_LutInit(void)
{  volatile uint16  *REG_Point1;
   volatile uint16  *REG_Point2;
   uint8  i; 
   
   REG_Point1 = (void *) S1D13503_REG;
   REG_Point1 += 0x0E;
   
   REG_Point2 = (void *) S1D13503_REG;	
   REG_Point2 += 0x0F;
   
   for(i=0; i<16; i++) 
   {  *REG_Point1 = i;				// 设置为自动更换存取方式,设置地址
      *REG_Point2 = LUT_RED_TAB[i];	// 设置红色调色板
      *REG_Point2 = LUT_GRN_TAB[i];	// 设置绿色调色板
      *REG_Point2 = LUT_BLU_TAB[i];	// 设置蓝色调色板
   }
}


/****************************************************************************
* 名称:ScreenFill()
* 功能:屏幕填充。屏幕大小为320x240。
* 入口参数:dat		要填充的数据
* 出口参数:无
* 说明:直接对显存进行操作。使用前要初始化好驱动器及调色板。
****************************************************************************/
void  ScreenFill(uint8 dat)
{  volatile uint16  *DAT_Point;
   uint32  i;
   
   DAT_Point = (void *) S1D13503_DAT;
   for(i=0; i<GUI_LCM_XMAX*GUI_LCM_YMAX; i++)   // 填充字节数为GUI_LCM_XMAX*GUI_LCM_YMAX
   {  *DAT_Point = dat; 
      DAT_Point++;
   }
}


// 定义总线速度控制字 
#define	BCFG_DEF	0x10000400
#define	IDCY		(0x07<<0)
#define WST1		(0x0f<<5)
#define	WST2		(0x0f<<11)
#define	BCFG3_SET	(BCFG_DEF | IDCY | WST1 | WST2)

/*******************************************************
* 名称: LCM_Init
* 功能: 初始化液晶模块,然后清屏。
* 入口参数: 无
* 出口参数: 无
*******************************************************/
void  LCM_Init(void)
{  BCFG3 = BCFG3_SET;				// 总线速度控制

   S1D13503_Init();					// 初始化S1D13503工作模式			
   S1D13503_LutInit();				// 初始化S1D13503的调色板
   ScreenFill(0x00);                
}


/*******************************************************
* 名称: LCM_UpdateRects
* 功能: 更新液晶显示区域。更新数据在Framebuffer中。
* 入口参数: x,y  		更新区域的起始点
*			w,y			区域宽度和高度
*           buffer      Framebuffer起始地址
* 出口参数: 无
*******************************************************/
void  LCM_UpdateRects( int x, int y, int w, int h, uint8 *buffer )	 	
{	int    i, j;
    uint8  *addr;       // 显示数据指针
    
    volatile uint16  *DAT_Point;
    uint32   lcm_addr;  // 液晶显示地址
  
    
    // 需填充区域参数过滤
    if(x<0)
    {   w = w + x;
        x = 0;
    }
    if(y<0)
    {   h = h + y;
        y = 0;
    }
    
    if( x > (GUI_LCM_XMAX-1) ||
        y > (GUI_LCM_YMAX-1)
       ) 
    {   return;
    }
      
    if((x+w) > (GUI_LCM_XMAX-1))
    {   w = GUI_LCM_XMAX - x;
    }
    if((y+h) > (GUI_LCM_YMAX-1))
    {   h = GUI_LCM_YMAX - y;
    }            
     
    if((w<=0) || (h<=0)) return;
    
   
    // 更新显示数据
    for(i=0; i<h; i++)			// 输出h行数据
    {   // 计算出更新区域的buffer地址
        addr = buffer + (y*GUI_LCM_XMAX + x);
       
        // 输出一行(w)数据         
        lcm_addr = y*GUI_LCM_XMAX + x;
        DAT_Point = (void *) S1D13503_DAT;
        DAT_Point += lcm_addr;
   
        for(j=0; j<w; j++)
        {   *DAT_Point = *addr;	    // 输出数据 
            addr++;
            DAT_Point++;
        }
       
        // 指向下一行
        y++;
    } // end of for(i=0; i<h; i++)...
}

⌨️ 快捷键说明

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