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

📄 main.c

📁 程序用于演示LCD的驱动和编程方法其中包括初始化设置、坐标位置、色彩选定、作图方法等。
💻 C
字号:
//****************************************************************************************
//** 文件名:main.c

//** Copyright (c) 2003

//** 创建人:Himai (WYJ)

//** 日期:2003.10.26

//** 描述:此程序用于演示LCD模块
//**
//** 版本:1.0
//**************************************************************************************
#include "def.h"
#include "44b.h"

//**定义液晶屏的类型,如果是彩屏,定义它为8(比特),16灰度屏定义为4,否则定义它为1 
#define lcdtype (4)

//**开辟一块大小合适的显示缓冲区,显然彩屏需要240×320×8(bits)也就是240×320÷4(32bits)
//**蓝屏需要240×320(bits)也就是240×320÷32字(32bits),灰度屏需要240×320÷8
INT32U buffer[240][320/(32/lcdtype)]; 
INT8U  colornumber=2;
//****************************************************************************************
//**函数名:mydelay()
//**参  数:i,j
//**返回值:无
//**功  能:实现延迟等待
//**备  注:
//**************************************************************************************
void mydelay(unsigned int i,unsigned int j)
{ 
	int m,n;
	for (m=0;m<=i;m++)
	{
	  for (n=0;n<j;n++);
	}
} 

//****************************************************************************************
//**函数名:lcdclr()
//**参  数:无
//**返回值:无
//**功  能:往缓冲区填写0,也就是黑色
//**备  注:
//**************************************************************************************
void lcdclr(void)
{
	INT32U i;
	INT32U *pDisp = (INT32U*)buffer;
		for (i = 0; i < (320*240  / (32/lcdtype)); i++)
	{
		*pDisp++ =0;
	}	
}

//****************************************************************************************
//**函数名:drawpixal()
//**参  数:横坐标INT16 x, 纵坐标INT16 y, 颜色INT8U c
//**返回值:无
//**功  能:往指定的缓冲区填写指定的颜色
//**备  注:
//**************************************************************************************
void drawpixal (INT16 x, INT16 y,  INT8U c)
{ 

//**如果是彩屏,那么颜色参数为8比特,填写方法如下:
		if(lcdtype==8)
		{
		buffer[(y)][(x)/4]=((buffer[(y)][(x)/4] & (~(0xff000000>>((x)%4)*8)) )|( (c)<<((4-1-((x)%4))*8) ));
		}
	
//**如果是灰屏,那么颜色参数为4比特,填写方法如下:
	else if(lcdtype==4)
	{
	buffer[(y)][(x)/8]=((buffer[(y)][(x)/8] & (~(0xf0000000>>((x)%8)*4)) )|( (c)<<((7-((x)%8))*4) ));

	}
//**如果是蓝屏,那么颜色参数为1比特,填写方法如下:
	else
	{
  		if((c&0x01)==1)
  	 	{
  		 buffer[y][x/32]=((INT32U)0x01<<(31-x%32))|buffer[y][x/32];
  		 }
  		 else
  		 {   
  		 buffer[y][x/32]=((INT32U)(~(0x01<<(31-x%32))))&buffer[y][x/32];
  	 	}
	}
}

//*****************************************************************
//** 函数名:LcdInit(void)
//** 输 入: 无
//** 输 出: 无
//** 功能描述:初始化LCD控制器
//** 全局变量:
//*****************************************************************
void lcdinit ()
{   
//** 根据不同的显示屏类型,定义不同的水平值、时钟值、扫描模式和显示模式
//** 这些参数的用途请参考S3CC40BX芯片相关LCD控制器部分的资料
   unsigned int hozval,clkval,scan_mode,disp_mode;  
	if (lcdtype==8)
	{
	 hozval= 119;
	 clkval= 4;
	 scan_mode=2;
     disp_mode=3;
	}
	else if (lcdtype==4)
	{
	 hozval= 79;
	 clkval= 8;
	 scan_mode=1;
	 disp_mode=2;

    }

	else 
	{
	 hozval= 79;
	 clkval= 8;
	 scan_mode=1;
	 disp_mode=0;
    }
    
//** 根据不同的LCD类型初始化LCD控制寄存器,设置扫描模式和时钟
 	rLCDCON1=(0x1c)|(scan_mode<<5)|(0<<7)|(0x3<<8)|(0x3<<10)|(clkval<<12);
 	
//** 根据不同的LCD类型初始化LCD控制寄存器,设置水平和垂直值
	rLCDCON2=(239)|(hozval<<10)|(10<<21); 
	 
//** 根据不同的LCD类型初始化LCD控制寄存器,设置显示模式,
//** 并将显示缓冲区的首地址送到寄存器内,便于LCD控制器自动将缓冲区内数据传到lcd
	rLCDSADDR1= (disp_mode<<27) | ( ((unsigned int)buffer>>22)<<21 ) | (((unsigned int)buffer>>1)&0x1fffff);
	rLCDSADDR2= (((((unsigned int)buffer+(320*240)/(8/lcdtype))>>1))&0x1fffff) | (13<<21);
	rLCDSADDR3= (320/(16/lcdtype)) | ( 0<<9 );
	
//** 设置颜色管理基数,对蓝屏不起作用,仅对彩屏有效
	rREDLUT  =0xfdb96420;
	rGREENLUT=0xfdb96420;
	rBLUELUT =0xfb40;
	
//** 设置颜色管理基数,对蓝屏不起作用,仅对灰屏有效
	switch (lcdtype)
		{
		case 1:
			break;
		case 4:
		    rDITHMODE=0x12210; 
		    rDP1_2 =0xa5a5;      
			rDP4_7 =0xba5da65;
			rDP3_5 =0xa5a5f;
			rDP2_3 =0xd6b;
			rDP5_7 =0xeb7b5ed;
			rDP3_4 =0x7dbe;
			rDP4_5 =0x7ebdf;
			rDP6_7 =0x7fdfbfe;
			break;
		case 8:
		    rDITHMODE=0x12210; 
		    rDITHMODE=0x0; 	
		    rDP1_2 =0xa5a5;      
			rDP4_7 =0xba5da65;
			rDP3_5 =0xa5a5f;
			rDP2_3 =0xd6b;
			rDP5_7 =0xeb7b5ed;
			rDP3_4 =0x7dbe;
			rDP4_5 =0x7ebdf;
			rDP6_7 =0x7fdfbfe;
			break;
		default:
			break;
		}

	
//** 打开LCD显示,启动LCD自动扫描功能
	rLCDCON1=(0x1d)|(scan_mode<<5)|(0<<7)|(0x3<<8)|(0x3<<10)|(clkval<<12);
	rPDATD=0xbf;
	
//** 清屏
	lcdclr();
	}
	
//*****************************************************************
//** 函数名:drawcircle(void)
//** 输 入: 横坐标INT16U x,纵坐标INT16U y,颜色INT16U m
//** 输 出: 无
//** 功能描述:以(x,y)为圆心,30为半径画圆,并将四个角填入反色
//** 全局变量:
//*****************************************************************
void drawcircle(INT16U x,INT16U y,INT16U m)
{
    int i,j;
    
//**区域为以(x-30,y-30)和(x+30,y+30)为对角点的矩形
    for(i=x-30;i<=x+30;i++)
    {
        for(j=y-30;j<=y+30;j++)
        {
//**如果该点距离圆心小于半径,那么填入正色
      	if(((i-x)*(i-x)+(j-y)*(j-y))<=900) drawpixal (i, j, m%colornumber);
//**否则填入反色
   		 else drawpixal (i, j, colornumber-m%colornumber);
 		}
 	}
 }

//*****************************************************************
//** 函数名:user_doing(void)
//** 输 入: 无
//** 输 出: 无
//** 功能描述:用户可以自行修改,此处共有8个圆心,根据i值判别圆心的位置
//** 全局变量:
//*****************************************************************
void user_doing(void)
 
 {
 	INT16U i;
 	lcdclr();
 	for(i=0;i<2560;i++)
 		{
 		switch(i%8)
    		{
			case 0:drawcircle(100,60,i);
	      		   break;
			case 1:drawcircle(160,60,i);
	      		   break;
			case 2:drawcircle(220,60,i);
			       break;
			case 3:drawcircle(220,120,i);
			       break;
			case 4:drawcircle(220,180,i);
			       break;
			case 5:drawcircle(160,180,i);
			       break;
			case 6:drawcircle(100,180,i);
			       break;
			case 7:drawcircle(100,120,i);
			       break;
				
			}
 		mydelay(400,800);
   		}
  }

//*****************************************************************
//** 函数名:main(void)
//** 输 入: 无
//** 输 出: 无
//** 功能描述:主函数
//** 全局变量:
//*****************************************************************
void Main(void)
{  
int i;
//** 初始化LCD
   	lcdinit();
   	for(i=0;i<lcdtype;i++)
   	{
   	colornumber=2*colornumber;
   	}
   	
//**用户程序 
   	user_doing();
   	while(1);
}
	

⌨️ 快捷键说明

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