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

📄 main.c

📁 完整的ARM7的SPI驱动LCD的程序
💻 C
字号:
/****************************************Copyright (c)**************************************************
**                               Guangzou ZLG-MCU Development Co.,LTD.
**                                      graduate school
**                                 http://www.zlgmcu.com
**
**--------------File Info-------------------------------------------------------------------------------
** File name:			main.c
** Last modified Date:  2004-09-16
** Last Version:		1.0
** Descriptions:		The main() function example template
**
**------------------------------------------------------------------------------------------------------
** Created by:			Chenmingji
** Created date:		2004-09-16
** Version:				1.0
** Descriptions:		The original version
**
**------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
** Version:
** Descriptions:
**
********************************************************************************************************/

#include "config.h"


typedef unsigned char  uint8;	
typedef unsigned int   uint32; 	
typedef signed char    int8;	
typedef signed int     int32;   

#define GUI_LCM_YMAX 64
#define GUI_LCM_XMAX 132

#define LCD_SDA 19
#define LCD_SCK 17
#define LCD_DorC 23
#define LCD_CS1 25
#define LCD_RES 24






#define CMD_SET_PADDR	0xb0
#define CMD_SET_CADDR_H	0x10	//设置列地址高4位
#define CMD_SET_CADDR_L	0x00
#define CMD_RD_WR	0xe0	//读-修改-写
#define CMD_RD_WR_END	0xee	//读-修改-写结束
#define DISPALAY_ON     0xaf

#define MAX(x,y) (x)>(y)?(x):(y)
#define MIN1(x,y) (x)<(y)?(x):(y)



volatile unsigned long * PortClrSetAddr[2][4] = 
{
    {
    &IO0CLR,
    &IO1CLR,
    &IO2CLR,
    &IO3CLR
    },
    {
    &IO0SET,
    &IO1SET,
    &IO2SET,
    &IO3SET
    }
};
volatile unsigned long * PortPinAddr[4] =
{
    &IO0PIN,
    &IO1PIN,
    &IO2PIN,
    &IO3PIN
}; 

void GPIOSet(uint32 Port, uint32 Pin, uint32 Set)
{
    *(PortClrSetAddr[Set][Port]) = 1<<Pin;
}

void p_delay(int32 delay)
{
	int32 i,j;
	for(i=0; i<delay; i++)
	{
      for(j=0;j<5;j++)
	  {
	  }
	}
}






//---------------------------------
//函数功能:	写LCD的数据端口
//参数说明:
//			dat	要写的数据
//--------------------------------

void wrPort(uint8 dat)
{
   S1PDR=dat;
   while(!((uint8)S1PSR & 0x80))
   {
   }  

	
}


void wrData(uint8 dat)
{
   
   GPIOSet(0,LCD_CS1,0);   
   GPIOSet(0,LCD_DorC,1);
   wrPort(dat);
   GPIOSet(0,LCD_CS1,1);
   p_delay(3);
}

void wrCommand(uint8 dat)
{
   GPIOSet(0,LCD_CS1,0);
   GPIOSet(0,LCD_DorC,0);
   wrPort(dat);
   GPIOSet(0,LCD_CS1,1);
   p_delay(3);

}


//----------------------------------------------------------
//函数功能:	写NT7532的RAM区
//参数说明:
//			pAddr	页地址
//			cAddr	列地址
//			*dat	存放读出的数据
//			size	要存的数据长度
//----------------------------------------------------------
void wrDis(uint8 pAddr, uint8 cAddr, uint8 *dat, uint32 size,uint8 *Pointer_start)
{
	int32 i,j,k;
	uint8 *pointer;
	j=0;

	pointer=Pointer_start+(int32)cAddr+(int32)pAddr*GUI_LCM_XMAX;
	while(size>0)
	{

	wrCommand(CMD_SET_PADDR | (pAddr&0x0f));	//设置页地址
	wrCommand(CMD_SET_CADDR_H | (cAddr>>4));	//设置列地址高4位
	wrCommand(CMD_SET_CADDR_L | (cAddr&0x0f));	//列地址低4位
    
	for(i=(int32)cAddr; i<GUI_LCM_XMAX; i++)
	{
	    if(size>0)
		{
		  
		
	    size--;
	    wrData(*(dat+j));
            *pointer=*(dat+j);
            pointer++;
	    j++;
	    }
	    else
	    break;		
	}
        cAddr=0x00;
        k=(int32)pAddr;
	k++;
	pAddr=(uint8)k;

	}
}


//-----------------------------------
//函数功能:	找到显示屏上对应于显示缓冲区的位置
//参数说明:
//			x, y-坐标
//			Pointer_start--显示缓冲区的头指针
//-----------------------------------
uint8 *findPointer(int32 x, int32 y, uint8 *Pointer_start)
{
    uint8 *pointer; 
    y=y/8;  
    pointer=Pointer_start+y*GUI_LCM_XMAX+x;
    return pointer;
}
   

//-----------------------------------
//函数功能:	在指定的坐标画点或清点
//参数说明:
//			x, y-坐标
//			mode-操作点的状态
//-----------------------------------
void putPixel(int32 x, int32 y, uint8 mode, uint8 *Pointer_start)
{
        uint8 yy,xx; 
	uint8 pAddr, cAddr, i;
	uint8 *pointer;
	yy=(uint8)y;
	xx=(uint8)x;
	pAddr = yy>>3;	        //y/8页地址
	cAddr = xx;
	i= yy&0x07;		//y%8点在页里的第几行
        pointer=findPointer(x,y,Pointer_start);

	if(0x01==mode)		//画点
	{
                *pointer=(1<<(int32)i)|*pointer;

	}	
	else if(0x00==mode)	//清点
	{
                *pointer=(~(1<<(int32)i))&*pointer;
	}
        wrDis(pAddr, cAddr, pointer, 1,Pointer_start);
}

//-----------------------------------
//函数功能:	全屏填充
//参数说明:
//			dat 0x00或0xFF
//          Pointer_start--显示缓冲区的头指针
//-----------------------------------

void GUI_FILLSCR(uint8 dat, uint8 *Pointer_start)
{ 
   uint32 i;
   for(i=0; i<GUI_LCM_YMAX*GUI_LCM_XMAX/8; i++)
   {
      *(Pointer_start+i)=dat;
   }
   wrDis(0, 0, Pointer_start, GUI_LCM_YMAX*GUI_LCM_XMAX/8, Pointer_start);
}

//-----------------------------------
//函数功能:	初始化GUI,包括初始化显示缓冲区,初始化LCM并清屏
//参数说明:
//			Pointer_start--显示缓冲区的头指针
//-----------------------------------

void GUI_Initailize(uint8 *Pointer_start)
{
  GPIOSet(0,LCD_RES,0);
  p_delay(1000);
  GPIOSet(0,LCD_RES,1);
  
  wrCommand(0xe2);//Software Reset
  p_delay(300);

  wrCommand(0x2f);//Power controller set
  p_delay(10);

  wrCommand(0x81);//Electronic Volume, 设置Vo的电压大小的, 两个字节的命令
  p_delay(10);
  wrCommand(0x31);
  p_delay(10);

  wrCommand(0xa2);//Bias select 1/9, 设置液晶驱动电压输出偏置率
  p_delay(10);
  wrCommand(0xa1);//ADC select, 设置ram中列的地址和segment之间的对应关系为正常模式
  p_delay(10);

  wrCommand(0xc0);//Common output mode set, 选择Common输出的方向, 
  p_delay(10);
   wrCommand(0xaf);//Display on
  p_delay(10);

  wrCommand(0xa5);   // set entir on(10)  
  p_delay(5000);
  wrCommand(0xa4);   //set entir off(10)


  wrCommand(0x61);//Display start address, 显示起始行选择为0(bit0-5)(COM0)
  p_delay(10);

  wrCommand(0xb0);//Page address, 设置页地址为0(bit0-3)
  p_delay(10);
  wrCommand(0x10);//High column, 设置列地址的高4位为0(bit0-3)
  p_delay(10);
  wrCommand(0x01);//Low column, 设置列地址的低4位为0(bit0-3)
  p_delay(10);

 
}


//-----------------------------------
//函数功能:	在指定的坐标画点或清点
//参数说明:
//			返回0 表示操作失败
//          返回1 表示操作成功
//-----------------------------------

int32 GUI_Point(int32 x, int32 y, uint8 mode, uint8 *Pointer_start)
{
        if(x>=GUI_LCM_XMAX)
	   return 0;
	if(y>=GUI_LCM_YMAX)
	   return 0;

	putPixel(x, y, mode, Pointer_start);
	return 1;
}

//-----------------------------------
//函数功能:	画水平线
//参数说明:
//		   x1,x2 起始点和终止点	
//         y     垂直位置
//-----------------------------------

int32 GUI_HLine(int32 x1, int32 x2, int32 y, uint8 mode, uint8 *Pointer_start)
{
        int32 x_max,x_min;
	x_max=MAX(x1,x2);
	x_min=MIN1(x1,x2);

	while(x_min<=x_max)
	{
	   if(GUI_Point(x_min, y, mode, Pointer_start)==0)
	   {   
	       return 0;
	   }
	   x_min++;
	 }
	 return 1;
}
    
//-----------------------------------
//函数功能:	画垂直线
//参数说明:
//		   y1,y2 起始点和终止点	
//         x     水平位置
//-----------------------------------

int32 GUI_RLine(int32 x, int32 y1, int32 y2, uint8 mode, uint8 *Pointer_start)
{
        int32 y_max,y_min;
	y_max=MAX(y1,y2);
	y_min=MIN1(y1,y2);

	while(y_min<=y_max)
	{
	   if(GUI_Point(x, y_min, mode, Pointer_start)==0)
	   {   
	       return 0;
	   }
	   y_min++;
	 }
	 return 1;
}

///////////////////////////////////////////
//SPI初始化

void init_SPI()
{	
	S1PCR=0x0020;
        S1PCCR=0x10;     
}

//////////////////////////////////////

int main(void)
{
	
        uint8 LCD_RAM[GUI_LCM_YMAX*GUI_LCM_XMAX/8];

    PINSEL1=0X02A8;
    IO0DIR = 0x039E0000;

	init_SPI();
     GPIOSet(0,LCD_CS1,0);   
   GPIOSet(0,LCD_DorC,0);
    GPIOSet(0,LCD_RES,0); 
      
   GPIOSet(0,LCD_DorC,1);
    GPIOSet(0,LCD_CS1,1);   
    GPIOSet(0,LCD_RES,1); 
   
   

        GUI_Initailize(LCD_RAM);
        GUI_FILLSCR(0x00, LCD_RAM);
        GUI_FILLSCR(0xff, LCD_RAM);
        GUI_FILLSCR(0x00, LCD_RAM);
       // GUI_Point(16, 8, 0x01, LCD_RAM);
	GUI_Point(17, 1, 0x01, LCD_RAM);
	GUI_Point(18, 7, 0x01, LCD_RAM);
	GUI_Point(19, 8, 0x01, LCD_RAM);
	GUI_Point(20, 63, 0x01, LCD_RAM);

	GUI_HLine(1, 131, 16, 1, LCD_RAM);
	//GUI_RLine(10, 1, 64, 1, LCD_RAM);
	 GUI_RLine(14, 1, 63, 1, LCD_RAM);
	GUI_RLine(13, 11, 63, 1, LCD_RAM);

   


	GUI_FILLSCR(0x0f, LCD_RAM);
    

return 0;


}

	
	




/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

⌨️ 快捷键说明

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