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

📄 hx8310tft.c

📁 手机常用的TFT液晶驱动器HX8310驱动程序,该程序为完整的演示程序,其中核心部分作为模块已经在产品中大量应用.
💻 C
📖 第 1 页 / 共 2 页
字号:
//------------------------------------------------------------------
//向LCM写入一字数据程序
//对于16位设置数据,中间位和最低位不用, 对于18位图像数据,则18位全用,
//	调用本函数的程序在向RGB_OUTU写入设置数据时,要向ins_16b_h ins_16b_l 写入数据
//	向RGB_OUTU写入图像数据时, 要向red_data_buf gre_data_buf blu_data_buf写入数据
//输入: 存放在RGB_OUTU 中的数据, 
//输出:无
//注:写入的是当前单元的内容, 写入地址的设置需要单独进行,然后调用本函数写入数据
//------------------------------------------------------------------
void wr_1word_reg_data(void)
{
	lcm_CD=1;	//写数据
//	set_lcd_cd();	//写数据

	dataiol=ins_16b_l<<1;		//使数据在D17~D10 D8~D1上
	dataiom=ins_16b_l>>7;
	dataiom=dataiom|(ins_16b_h<<2);
	dataioh=ins_16b_h>>6;

	lcm_IOH=dataioh;
	lcm_IOM=dataiom;
	lcm_IOL=dataiol;

	lcm_CE=0;
	nop();
	lcm_WR=0;
	nop();
	lcm_WR=1;
	nop();
//	lcm_CE=1;
}


//------------------------------------------------------------------
//------------------------------------------------------------------
void rd_1word_reg_data(void)
{
	lcm_CD=1;	//
//	set_lcd_cd();	//数据

	lcm_CE=0;
	lcm_RD=0;
	lcm_datah_dir=DEFA_PCR&0xfc;		//高2位用的口方向寄存器需要考虑其余6位情况
	lcm_datam_dir=0x00;					//置为输入
	lcm_datal_dir=0x00;
	dataioh=lcm_IOH;
	dataiom=lcm_IOM;
	dataiol=lcm_IOL;
	lcm_datah_dir=DEFA_PCR;		//高2位用的口方向寄存器需要考虑其余6位情况
	lcm_datam_dir=0xff;					//置为输出
	lcm_datal_dir=0xff;
	lcm_RD=1;
//	lcm_CE=1;
}

//------------------------------------------------------------------
//向LCM Index寄存器写入一字程序
//输入: 存放在RGB_OUTU 中的数据, 
//输出:无
//------------------------------------------------------------------
void wr_1word_index(void)
{
	lcm_CD=0;	//写Index
//	clr_lcd_cd();	//写

//	dataiol=ins_16b_l<<1;		//使数据在D17~D10 D8~D1上
//	dataiom=ins_16b_l>>7;
//	dataiom=dataiom|(ins_16b_h<<2);
//	dataioh=ins_16b_h>>6;
//	lcm_IOH=dataioh;
//	lcm_IOM=dataiom;
//	lcm_IOL=dataiol;

	lcm_IOH=0;
	lcm_IOM=0;
	lcm_IOL=ins_16b_l<<1;

	lcm_CE=0;
	nop();
	lcm_WR=0;
	nop();
	lcm_WR=1;
	nop();
//	lcm_CE=1;
}

//------------------------------------------------------------------
//从LCM读出一字数据程序
//输入:无
//输出:存放在RGB_OUTU 中的数据
//注:读取的是当前单元的内容, 读取地址的设置需要单独进行,然后调用本函数读取数据
//------------------------------------------------------------------
void rd_1word_data(void)
{
	lcm_CD=1;		//读数据
//	set_lcd_cd();	//

	lcm_CE=0;
	lcm_RD=0;
	lcm_datah_dir=DEFA_PCR&0xfc;		//高2位用的口方向寄存器需要考虑其余6位情况
	lcm_datam_dir=0x00;					//置为输入
	lcm_datal_dir=0x00;
	nop();
	dataioh=lcm_IOH;
	dataiom=lcm_IOM;
	dataiol=lcm_IOL;
	lcm_datah_dir=DEFA_PCR;		//高2位用的口方向寄存器需要考虑其余6位情况
	lcm_datam_dir=0xff;					//置为输出
	lcm_datal_dir=0xff;
	lcm_RD=1;
//	lcm_CE=1;
}

//------------------------------------------------------------------
//从LCM读出状态寄存器程序
//输入:无
//输出:存放在RGB_OUTU中的数据
//------------------------------------------------------------------
void rd_1word_status(void)
{
	lcm_CD=1;		//读Status
//	set_lcd_cd();	//写数据

	lcm_CE=0;
	lcm_RD=0;
	lcm_datah_dir=DEFA_PCR&0xfc;		//高2位用的口方向寄存器需要考虑其余6位情况
	lcm_datam_dir=0x00;					//置为输入
	lcm_datal_dir=0x00;
	dataioh=lcm_IOH;
	dataiom=lcm_IOM;
	dataiol=lcm_IOL;
	lcm_datah_dir=DEFA_PCR|0x03;		//高2位用的口方向寄存器需要考虑其余6位情况
	lcm_datam_dir=0xff;					//置为输出
	lcm_datal_dir=0xff;
	lcm_RD=1;
//	lcm_CE=1;
}

//------------------------------------------------------------------
//------------------------------------------------------------------
void ini_lcm(void)
{
	lcm_RST=0;
	delayms(60);
	lcm_RST=1;
	delayms(10);

	lcm_CE=0;		//???????先一直选通HX8310

	ins_16b_h=0;
	ins_16b_l=0;
	wr_1word_index();	//对寄存器R00操作
	rd_1word_reg_data();
	ins_16b_h=0x00;
	ins_16b_l=0x01;		//Oscillation Start
	wr_1word_reg_data();
	delayms(40);

	ins_16b_h=0;
	ins_16b_l=0x07;
	wr_1word_index();	//对寄存器R07操作
	ins_16b_h=0x00;
	ins_16b_l=0x04;		//
	wr_1word_reg_data();

	ins_16b_h=0;
	ins_16b_l=0x0d;
	wr_1word_index();	//对寄存器R0D操作
	ins_16b_h=0x03;
	ins_16b_l=0x04;		//
	wr_1word_reg_data();

	ins_16b_h=0;
	ins_16b_l=0x0e;
	wr_1word_index();	//对寄存器R0E操作
	ins_16b_h=0x16;
	ins_16b_l=0x1a;		//
	wr_1word_reg_data();
	delayms(60);

	ins_16b_h=0;
	ins_16b_l=0x01;
	wr_1word_index();	//对寄存器R01操作
	ins_16b_h=0x01;
	ins_16b_l=0x13;		//
	wr_1word_reg_data();

	ins_16b_h=0;
	ins_16b_l=0x02;
	wr_1word_index();	//对寄存器R02操作
	ins_16b_h=0x07;
	ins_16b_l=0x00;		//
	wr_1word_reg_data();

	ins_16b_h=0;
	ins_16b_l=0x05;
	wr_1word_index();	//对寄存器R05操作
	ins_16b_h=0x10;
	ins_16b_l=0x30;		//
	wr_1word_reg_data();

	ins_16b_h=0;
	ins_16b_l=0x06;
	wr_1word_index();	//对寄存器R06操作
	ins_16b_h=0x00;
	ins_16b_l=0x00;		//
	wr_1word_reg_data();

	ins_16b_h=0;
	ins_16b_l=0x0b;
	wr_1word_index();	//对寄存器R0B操作
	ins_16b_h=0x00;
	ins_16b_l=0x00;		//
	wr_1word_reg_data();

	ins_16b_h=0;
	ins_16b_l=0x0c;
	wr_1word_index();	//对寄存器R0C操作
	ins_16b_h=0x00;
	ins_16b_l=0x0d;		//
	wr_1word_reg_data();

	ins_16b_h=0;
	ins_16b_l=0x03;
	wr_1word_index();	//对寄存器R03操作
	ins_16b_h=0x04;
	ins_16b_l=0x10;		//
	wr_1word_reg_data();

	ins_16b_h=0;
	ins_16b_l=0x04;
	wr_1word_index();	//对寄存器R04操作
	ins_16b_h=0x00;
	ins_16b_l=0x00;		//
	wr_1word_reg_data();

	ins_16b_h=0;
	ins_16b_l=0x0e;
	wr_1word_index();	//对寄存器R0E操作
	ins_16b_h=0x12;
	ins_16b_l=0x1a;		//
	wr_1word_reg_data();

	ins_16b_h=0;
	ins_16b_l=0x0d;
	wr_1word_index();	//对寄存器R0D操作
	ins_16b_h=0x01;
	ins_16b_l=0x19;		//
	wr_1word_reg_data();

	ins_16b_h=0;
	ins_16b_l=0x0f;
	wr_1word_index();	//对寄存器R0F操作
	ins_16b_h=0x00;
	ins_16b_l=0x00;		//
	wr_1word_reg_data();

	ins_16b_h=0;
	ins_16b_l=0x11;
	wr_1word_index();	//对寄存器R11操作
	ins_16b_h=0x00;
	ins_16b_l=0x00;		//
	wr_1word_reg_data();

	ins_16b_h=0;
	ins_16b_l=0x14;
	wr_1word_index();	//对寄存器R14操作
	ins_16b_h=0x9f;
	ins_16b_l=0x00;		//
	wr_1word_reg_data();

	ins_16b_h=0;
	ins_16b_l=0x15;
	wr_1word_index();	//对寄存器R15操作
	ins_16b_h=0x00;
	ins_16b_l=0x00;		//
	wr_1word_reg_data();

	ins_16b_h=0;
	ins_16b_l=0x16;
	wr_1word_index();	//对寄存器R16操作
	ins_16b_h=0x7f;
	ins_16b_l=0x00;		//水位RAM位置,128列
	wr_1word_reg_data();

	ins_16b_h=0;
	ins_16b_l=0x17;
	wr_1word_index();	//对寄存器R17操作
	ins_16b_h=0x9f;
	ins_16b_l=0x00;		//垂直RAM位置, 160行
	wr_1word_reg_data();

	ins_16b_h=0;
	ins_16b_l=0x21;
	wr_1word_index();	//对寄存器R21操作
	ins_16b_h=0x00;
	ins_16b_l=0x00;		//RAM地址设置
	wr_1word_reg_data();

	ins_16b_h=0;
	ins_16b_l=0x07;
	wr_1word_index();	//对寄存器R07操作
	ins_16b_h=0x00;
	ins_16b_l=0x05;		//
	wr_1word_reg_data();
	delayms(10);

	ins_16b_h=0;
	ins_16b_l=0x07;
	wr_1word_index();	//对寄存器R07操作
	ins_16b_h=0x00;
	ins_16b_l=0x25;		//
	wr_1word_reg_data();
	delayms(10);

	ins_16b_h=0;
	ins_16b_l=0x07;
	wr_1word_index();	//对寄存器R07操作
	ins_16b_h=0x00;
	ins_16b_l=0x27;		//
	wr_1word_reg_data();
	delayms(10);

	ins_16b_h=0;
	ins_16b_l=0x07;
	wr_1word_index();	//对寄存器R07操作
	ins_16b_h=0x00;
	ins_16b_l=0x37;		//
	wr_1word_reg_data();
	delayms(10);
}
/*
void ini_lcm(void)
{
	lcm_RST=0;
	delayms(50);
	delayms(50);
	lcm_RST=1;
	delayms(50);

	lcm_outu_h=0;
	lcm_outu_l=0;
	wr_1word_index();	//对寄存器R00操作
	ins_16b_h=0x00;
	ins_16b_l=0x01;		//Oscillation Start
	wr_1word_data();
	delayms(20);

	lcm_outu_h=0;
	lcm_outu_l=0x07;
	wr_1word_index();	//对寄存器R07操作
	ins_16b_h=0x00;
	ins_16b_l=0x04;		//
	wr_1word_data();

	lcm_outu_h=0;
	lcm_outu_l=0x0d;
	wr_1word_index();	//对寄存器R0D操作
	ins_16b_h=0x03;
	ins_16b_l=0x04;		//
	wr_1word_data();

	lcm_outu_h=0;
	lcm_outu_l=0x0e;
	wr_1word_index();	//对寄存器R0E操作
	ins_16b_h=0x16;
	ins_16b_l=0x1a;		//
	wr_1word_data();
	delayms(20);

	lcm_outu_h=0;
	lcm_outu_l=0x01;
	wr_1word_index();	//对寄存器R01操作
	ins_16b_h=0x01;
	ins_16b_l=0x13;		//
	wr_1word_data();

	lcm_outu_h=0;
	lcm_outu_l=0x02;
	wr_1word_index();	//对寄存器R02操作
	ins_16b_h=0x07;
	ins_16b_l=0x00;		//
	wr_1word_data();

	lcm_outu_h=0;
	lcm_outu_l=0x05;
	wr_1word_index();	//对寄存器R05操作
	ins_16b_h=0x10;
	ins_16b_l=0x30;		//
	wr_1word_data();

	lcm_outu_h=0;
	lcm_outu_l=0x06;
	wr_1word_index();	//对寄存器R06操作
	ins_16b_h=0x00;
	ins_16b_l=0x00;		//
	wr_1word_data();

	lcm_outu_h=0;
	lcm_outu_l=0x0b;
	wr_1word_index();	//对寄存器R0B操作
	ins_16b_h=0x00;
	ins_16b_l=0x00;		//
	wr_1word_data();

	lcm_outu_h=0;
	lcm_outu_l=0x0c;
	wr_1word_index();	//对寄存器R0C操作
	ins_16b_h=0x00;
	ins_16b_l=0x0d;		//
	wr_1word_data();

	lcm_outu_h=0;
	lcm_outu_l=0x03;
	wr_1word_index();	//对寄存器R03操作
	ins_16b_h=0x04;
	ins_16b_l=0x10;		//
	wr_1word_data();

	lcm_outu_h=0;
	lcm_outu_l=0x04;
	wr_1word_index();	//对寄存器R04操作
	ins_16b_h=0x00;
	ins_16b_l=0x00;		//
	wr_1word_data();

	lcm_outu_h=0;
	lcm_outu_l=0x0e;
	wr_1word_index();	//对寄存器R0E操作
	ins_16b_h=0x12;
	ins_16b_l=0x1a;		//
	wr_1word_data();

	lcm_outu_h=0;
	lcm_outu_l=0x0d;
	wr_1word_index();	//对寄存器R0D操作
	ins_16b_h=0x01;
	ins_16b_l=0x19;		//
	wr_1word_data();

	lcm_outu_h=0;
	lcm_outu_l=0x0f;
	wr_1word_index();	//对寄存器R0F操作
	ins_16b_h=0x00;
	ins_16b_l=0x00;		//
	wr_1word_data();

	lcm_outu_h=0;
	lcm_outu_l=0x11;
	wr_1word_index();	//对寄存器R11操作
	ins_16b_h=0x00;
	ins_16b_l=0x00;		//
	wr_1word_data();

	lcm_outu_h=0;
	lcm_outu_l=0x14;
	wr_1word_index();	//对寄存器R14操作
	ins_16b_h=0x9f;
	ins_16b_l=0x00;		//
	wr_1word_data();

	lcm_outu_h=0;
	lcm_outu_l=0x15;
	wr_1word_index();	//对寄存器R15操作
	ins_16b_h=0x00;
	ins_16b_l=0x00;		//
	wr_1word_data();

	lcm_outu_h=0;
	lcm_outu_l=0x16;
	wr_1word_index();	//对寄存器R16操作
	ins_16b_h=0x7f;
	ins_16b_l=0x00;		//水位RAM位置,128列
	wr_1word_data();

	lcm_outu_h=0;
	lcm_outu_l=0x17;
	wr_1word_index();	//对寄存器R17操作
	ins_16b_h=0x9f;
	ins_16b_l=0x00;		//垂直RAM位置, 160行
	wr_1word_data();

	lcm_outu_h=0;
	lcm_outu_l=0x21;
	wr_1word_index();	//对寄存器R21操作
	ins_16b_h=0x00;
	ins_16b_l=0x00;		//RAM地址设置
	wr_1word_data();

	lcm_outu_h=0;
	lcm_outu_l=0x07;
	wr_1word_index();	//对寄存器R07操作
	ins_16b_h=0x00;
	ins_16b_l=0x05;		//
	wr_1word_data();
	delayms(5);

	lcm_outu_h=0;
	lcm_outu_l=0x07;
	wr_1word_index();	//对寄存器R07操作
	ins_16b_h=0x00;
	ins_16b_l=0x25;		//
	wr_1word_data();
	delayms(5);

	lcm_outu_h=0;
	lcm_outu_l=0x07;
	wr_1word_index();	//对寄存器R07操作
	ins_16b_h=0x00;
	ins_16b_l=0x27;		//
	wr_1word_data();
	delayms(5);

	lcm_outu_h=0;
	lcm_outu_l=0x07;
	wr_1word_index();	//对寄存器R07操作
	ins_16b_h=0x00;
	ins_16b_l=0x37;		//
	wr_1word_data();
	delayms(5);
}
*/

//---*---*---*---*---*---*---*---*---*---*---*---*---*---*---*---*---*---*---*---*---*---*---*---*---*---
//---    ---   对   ---   R   ---   A   ---   M   ---  操  ---  作  ---
#define ram_IO	 IO.PDR5.BYTE		//RAM 数据读写口线
#define ram_WR	 IO.PDR7.BIT.B5		//RAM 写使能口线
#define ram_RD	 IO.PDR7.BIT.B4		//RAM READ使能口线
#define ram_CE	 IO.PDR6.BIT.B4		//RAM 片选口线
//---*---*---*---*---*---*---*---*---*---*---*---*---*---*---*---*---*---*---*---*---*---*---*---*---*---

//------------------------------------------------------------------
//送入1字节数据, 地址在其它函数中确定,这里不关心地址
//输入:要送入的数据
//------------------------------------------------------------------
void wr_ram_1byte_data(data)
{
	ram_IO=data;
	ram_CE=0;
	ram_WR=0;
	nop();
	ram_WR=1;
	ram_CE=1;
}


//------------------------------------------------------------------
//读出1字节数据, 地址在其它函数中确定,这里不关心地址
//输出:读出的数据
//------------------------------------------------------------------
uchar rd_ram_1byte_data(void)
{
	uchar data;
	lcm_datal_dir=0x00;
	ram_CE=0;
	ram_RD=0;
	nop();
	data=ram_IO;
	lcm_datal_dir=0xff;
	ram_RD=1;
	ram_CE=1;
	return(data);
}


//------------------------------------------------------------------
//送出地址, 
//输入:要送出的地址
//------------------------------------------------------------------
void set_ram_add(uint add)
{
	add_ALE=1;
	ram_IO=(uchar)(add%256);
	add_ALE=0;
	ram_ADDH=(uchar)(add/256);
}


//------------------------------------------------------------------
//读RAM任意地址数据程序
//------------------------------------------------------------------
uchar rd_ram_rand(uint add)
{
	uchar data;
	set_ram_add(add);
	data=rd_ram_1byte_data();
	return (data);
}



//------------------------------------------------------------------
//写RAM任意地址数据程序
//------------------------------------------------------------------
void wr_ram_rand(uchar data,uint add)
{
	set_ram_add(add);
	wr_ram_1byte_data(data);
}


//---*---*---*---*---*---*---*---*---*---*---*---*---*---*---*---*---*---*---*---*---*---*---*---*---*---
//---    ---   中   ---   断   ---   服   ---   务   ---   ---
//---*---*---*---*---*---*---*---*---*---*---*---*---*---*---*---*---*---*---*---*---*---*---*---*---*---

//------------------------------------------------------------------
//TMR W 中断服务程序-----定时20毫秒
//------------------------------------------------------------------
void tmrw_isrp(void)
{
//	TW.TSRW.BYTE&=0x7f;
//	TW.TCNT=25536;
//	if (IRR2.BIT.IRRTB1) IRR2.BIT.IRRTB1=0;
	if (TV.TCSRV.BIT.CMFA) TV.TCSRV.BIT.CMFA=0;
	TV.TCSRV.BIT.CMFA=0;
	TV.TCSRV.BIT.CMFB=0;
	TV.TCORA=2500;
	TV.TCNTV=0;

	clock_20ms_flg=1;
	clock_100ms_ct++;
	if (clock_100ms_ct>=50)
	{
		clock_100ms_ct=0;
		clock_500ms_flg=1;
	}

	buzzer_ct++;
//	if (buzzer_ct>=200) buzzer=0;

	clock_1s_ct++;
	if (clock_1s_ct>=50)
	{
		clock_1s_ct=0;
		clock_1s_flg=1;
		disp_dlt_ct++;
	}

	clock_2s_ct++;
	if (clock_2s_ct>=100)
	{
		clock_2s_ct=0;
	}
	
}



//-----------------------------------------------------------------------//
//延时程序;
//-----------------------------------------------------------------------//
void delays(uchar dlt)
{
	uchar k;
delayt_1:
	if (dlt==0) return;
	dlt--;
	for (k=0;k<10;k++)
	{
		delayms(100);
	}
	goto delayt_1;
}

void delayms(uchar dlt)
{
uchar i;
delayt_1:
	if (dlt==0) return;
	dlt--;
	for (i=0;i<250;i++)
	{
		nop();
		nop();
		nop();
		nop();
		nop();
		nop();
	}
	goto delayt_1;
}


void delayus(uchar dlt)
{
uchar i;
delayt_1:
	if (dlt==0) return;
	dlt--;
	for (i=0;i<8;i++)
	{
		nop();
	}
	goto delayt_1;
}

⌨️ 快捷键说明

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