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

📄 flash_hx8312_c51_h.c

📁 tft屏完全驱动,64M三星内存,全彩显示
💻 C
字号:
 //****************************************************
//project:	YL6750_demo board
//Driver: 	hx8312
//pixel:	240*320
//interface:8 bit 8080 interface
//data:		2005-7-26
//Editer:	qinguoxi
//****************************************************
#pragma db code
#include<reg51.h>
#include <intrins.h>

#define uchar unsigned char
#define uint unsigned int 

#define common 320			//common , 
#define segment 240			//segment
		

//port define 
#define PORT P0


//LCM interface
sbit CS_MAIN=P1^7;		//chip select signal
sbit RES=P1^6;			//reset signal 
sbit DC=P1^5;			//data/command  control signal
sbit WRITE=P1^4;		//write strobe signal
sbit READ=P1^3;
//shift key 
sbit KEY5=P1^1;     	//waitkey 

//k9f5608(flash rom) interface
sbit RB=P3^1;	 
sbit RE=P3^2;
sbit CE=P3^3;
sbit CLE=P3^4;	 
sbit ALE=P3^5;
sbit WE=P3^6;      
sbit WP=P3^7;	 


/****************************************************************************
** 函数声明
*****************************************************************************/
void LCD_write_d(uchar dat);
void LCD_write_c(uchar com);
uchar LCD_read_d(void);
void cpu_initial(void);
void init_lcd(void);

void clear_ram();
void MainLcdFill(uchar A,uchar B );
void showRGBW(void);
void volum_rgb_display(void); 
void picture_display(unsigned char *pi);

void Delay(uint adj);
void LCD_reset(void);
void waitkey(void);

void reset_flash();
void rb_ready();
void flash_address_write(uint addr);
void flash_command_write(uchar com);
void read_flash(uint page_address);

void moving_display(uint page_start_address,uint page_number);
void flash_picture_display(uint page_start_address,uint page_number);

void moving_line();
void gui_vline(uint x0,uint y0,uint y1,uint color);

void gui_fillscr(uint fill_color);
void gui_clearscr(void);
uint gui_point(uint x,uint y,uint color);
void gui_hline(uint x0,uint y0,uint x1,uint color);
void gui_vline(uint x0,uint y0,uint y1,uint color);
void text_display(uint x,uint y,uint xx,uint yy,uint backh_color,uint backl_color,uint txth_color,uint txtl_color, uchar *pi);
void text_moving();

code unsigned char txt1[];
code unsigned char txt2[];

code unsigned char pic1[];

uchar text_buff[32];

uint page;	//flash rom 页码计数

/************************************************************
//主函数
*************************************************************/
 void main()
{
	cpu_initial();
	LCD_reset();
	init_lcd();	

	reset_flash();
	Delay(1);
	
	
	
	while(1)
	{
		page=0;

 	    flash_picture_display(0x0000,8);
//		text_moving();
//		waitkey();
		Delay(1000);

 		MainLcdFill(0xf8,0x00);
 //		waitkey();
		Delay(1000);
 
		MainLcdFill(0x07,0xe0);
//		waitkey();
		Delay(1000);

		MainLcdFill(0x00,0x1f);
//		waitkey();
		Delay(4000);
/*
		MainLcdFill(0x00,0x00);
		waitkey();
//		Delay(4000);

		MainLcdFill(0xff,0xff);
		waitkey();
//		Delay(4000);

		showRGBW();
		waitkey();
//		Delay(4000);
		
		volum_rgb_display(); 
		waitkey();
//		Delay(4000);

// 		picture_display(pic1);
//		waitkey();
//		Delay(4000);

*/ 

	

		
// 		moving_display(0x0000,482);
//		waitkey();
//		Delay(4000);

 
 
	}
}

/*===========================================================================
** 函数名称: text_display()
** 功能描述: 在指定位置显示汉字
** 入口参数:X-文字位置x坐标,Y-文字位置Y坐标,xx-字体宽,yy-字体高, 
**           backh(l)_color-背景颜色高(底)位,txth(l)_color-字体颜色高(低)位
** 注意:	字体高必须为8的整数倍
** 出口参数:
============================================================================*/

void text_display(uint x,uint y,uint xx,uint yy,uint backh_color,uint backl_color,uint txth_color,uint txtl_color, uchar *pi)
{
	uint ii,mm,jj;
	uchar charter;
   	
	
	for(ii=0;ii<yy;ii++)
	{
		for(mm=0;mm<xx/8;mm++)
		{
			charter=*pi;
			for(jj=0;jj<8;jj++)
			{
				
				LCD_write_c(0x00); 		// RAM address set
				LCD_write_c(0x21);
				LCD_write_d(y+ii);
   				LCD_write_d(x+mm*8+jj);
   				
   				LCD_write_c(0x00);
   				LCD_write_c(0x22);

				if((charter&0x80)==0)
				{
					LCD_write_d(backh_color);
					LCD_write_d(backl_color);
				}
				else
				{
					LCD_write_d(txth_color);
					LCD_write_d(txtl_color);
				}		
				charter<<=1;	 
				
			}
			pi++;
			
			
		}
	}

  
}

 

/*===========================================================================
** 函数名称: text_moving()
** 功能描述: 移动显示汉字
** 入口参数:
** 出口参数:
============================================================================*/
void text_moving()
{
	uchar rd1,rd2;
	uint mm1,mm2,mm;
	mm=0;
 	

	//显示字体背景竖条
	for(mm=5;mm<154;mm++)
	{

		LCD_write_c(0x00); 		// RAM address set
    	LCD_write_c(0x21);
		LCD_write_d(mm);	
		LCD_write_d(29);

		LCD_write_c(0x00);
   		LCD_write_c(0x22);

		for(mm1=0;mm1<18;mm1++)
		{

			LCD_write_d(0x00);
			LCD_write_d(0x00);
 
		}
	}
/*
	waitkey();

	//方式1:直接写CGRAM移动显示字体
  	for(mm=5;mm<138;mm++)
  	{

		text_display(30,mm,16,16,0x00,0x00,0xff,0xff, txt1);
// 		text_display(30,16,16,16,0x00,0x00,0xff,0xff, txt2);
		Delay(100);
	
  	}


	waitkey();

*/
	text_display(30,10,16,16,0x00,0x00,0xff,0xff, txt1);
 
	//方式2:读CGRAM移动字体

 
	waitkey();
 

 	for(mm=0;mm<160;mm++)
 	{
 
		for(mm2=0;mm2<16;mm2++)
		{
			LCD_write_c(0x00); 		// RAM address set
    		LCD_write_c(0x21);
			LCD_write_d(5);	
			LCD_write_d(30+mm2);

			LCD_write_c(0x00);
   			LCD_write_c(0x22);	

 			LCD_read_d();
			LCD_read_d();
			
	

 			text_buff[2*mm2]=LCD_read_d();
			text_buff[2*mm2+1]=LCD_read_d();
			Delay(1);	
	
		}
 

		for(mm1=6;mm1<154;mm1++)
		{
			for(mm2=0;mm2<16;mm2++)
			{
				LCD_write_c(0x00); 		// RAM address set
    			LCD_write_c(0x21);
				LCD_write_d(mm1);	
				LCD_write_d(30+mm2);

				LCD_write_c(0x00);
   				LCD_write_c(0x22);
				
 				LCD_read_d();
				LCD_read_d();

				rd1=LCD_read_d();			
				rd2=LCD_read_d();

				LCD_write_c(0x00); 		// RAM address set
    			LCD_write_c(0x21);
				LCD_write_d(mm1-1);		
				LCD_write_d(30+mm2);
	
				LCD_write_c(0x00);
   				LCD_write_c(0x22);

				LCD_write_d(rd1);
				LCD_write_d(rd2);	
			}

		}


		for(mm2=0;mm2<16;mm2++)
		{
			LCD_write_c(0x00); 		// RAM address set
    		LCD_write_c(0x21);
			LCD_write_d(153);	
			LCD_write_d(30+mm2);


			LCD_write_c(0x00);
   			LCD_write_c(0x22);	

 			LCD_write_d(text_buff[2*mm2]);
			LCD_write_d(text_buff[2*mm2+1]);		
		}

//		Delay(100);


 	}

}


/*===========================================================================
** 函数名称: gui_fillscr()
** 功能描述: 填充RGB颜色;
============================================================================*/

void gui_fillscr(uint fill_color)
{
    uint tt,ll;
    LCD_write_c(0x00);
    LCD_write_c(0x22);
    
    for(ll=0;ll<common;ll++)
    {
         for(tt=0;tt<segment;tt++)
         {
              LCD_write_d(fill_color>>8);
			  LCD_write_d(fill_color&0x00ff);
         }
    }
}

/*===========================================================================
** 函数名称: gui_clearscr()
** 功能描述: 清屏;
============================================================================*/
void gui_clearscr(void)
{
	gui_fillscr(0x0000);
}
/*===========================================================================
** 函数名称: gui_point()
** 功能描述: 在(x,y)坐标上画出一点
** 入口参数:X,点的X坐标,y,点的y坐标,color,点的颜色值
** 出口参数:
============================================================================*/
uint gui_point(uint x,uint y,uint color)
{
	if(x>=segment|y>=common)
	 	return(0);
	else
	{ 
		LCD_write_c(0x00); 		// RAM address set
		LCD_write_c(0x21);
		LCD_write_d(y);
		LCD_write_d(x);
     
    	LCD_write_c(0x00);		// ram data write
 		LCD_write_c(0x22);	 

 		LCD_write_d(color>>8);
		LCD_write_d(color&0x00ff);

		return(1);
	}
	
	LCD_write_c(0x00); 		// RAM address set
	LCD_write_c(0x21);
	LCD_write_d(0x00);
	LCD_write_d(0x02);
}

/*===========================================================================
** 函数名称: gui_hline()
** 功能描述: 画水平线
** 入口参数:x0,x1,起点,终点的X坐标,y0,水平线y坐标,color,线条的颜色值
** 出口参数:
============================================================================*/
void gui_hline(uint x0,uint y0,uint x1,uint color)
{
	uint bak;
	if(x0>x1)
	{
		bak=x1;
		x1=x0;
		x0=bak;
	}
	do
	{
		gui_point(x0,y0,color);
		x0++;
		
	}while(x1>=x0);
}

/*===========================================================================
** 函数名称: gui_vline()
** 功能描述: 画垂直线
** 入口参数:x0,垂直线X坐标,y0,y1,水平线起点,终点y坐标,color,线条的颜色值
** 出口参数:
============================================================================*/
void gui_vline(uint x0,uint y0,uint y1,uint color)
{
	uint bak;
	if(y0>y1)
	{
		bak=y1;
		y1=y0;
		y0=bak;
	}
	do
	{
		gui_point(x0,y0,color);
		y0++;
		
	}while(y1>=y0);
}


 /*===========================================================================
** 函数名称: moving_display()
** 功能描述: 显示动画
** 入口参数: page_start_address:首幅图像数据储存在flash 中的页地址A24-A9,
			 pict_number:		图像幅数		
** 出口参数: 无
============================================================================*/
void moving_display(uint page_start_address,uint pict_number)
{
	uint kk;
	for(kk=0;kk<pict_number;kk++)
		read_flash(page_start_address);
	
}

 /*===========================================================================
** 函数名称: picture_display()
** 功能描述: 显示图像
** 入口参数: page_start_address:首幅图像数据储存在flash 中的页地址A24-A9,
			 pict_number:		图像幅数		
** 出口参数: 无
============================================================================*/
void flash_picture_display(uint page_start_address,uint pict_number)
{
	uint kk;
	for(kk=0;kk<pict_number;kk++)
	{
		read_flash(page_start_address);
		Delay(2000);

//		waitkey();	
	}
}




/*===========================================================================
** 函数名称: flash_command_write(uchar com)
** 功能描述: 写指令到Flash_rom
** 入口参数: com:k9f5608(flash rom) 指令码
** 出口参数: 无
============================================================================*/

void flash_command_write(uchar com)
{
	CE=0;
	PORT=com;

	CLE=1;
	ALE=0;
	WE=0;
	WE=0;
	WE=1;
	WE=1;

	CLE=0;
	ALE=0;
}


/*===========================================================================
** 函数名称: flash_address_write(uchar com)
** 功能描述: 写地址到Flash_rom
** 入口参数: addr:flash rom 地址高16位

⌨️ 快捷键说明

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