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

📄 lcd.c

📁 这是一种火灾报警控制器的源代码
💻 C
字号:

//***************************** lcd.c ****************************//
//************************ LCM19264驱动程序 **********************//

#include<lcd\lcd.h>

/*****************************************************************
*函数:wiat_ready_left()
*功能:判断液晶左侧屏是否在忙状态
*形式参数:无;
*返回值:无
******************************************************************/
void wait_ready_left(void)
{
	unsigned char temp;
	while(1)
	{
		temp=XBYTE[0x9002];	//读状态端口
		if((temp&stat_busy)==0)
			break;
	}
	return;
}

/*****************************************************************
*函数:wiat_ready_middle()
*功能:判断液晶中间屏是否在忙状态
*形式参数:无;
*返回值:无
******************************************************************/
void wait_ready_middle(void)
{
	unsigned char temp;
	while(1)
	{
		temp=XBYTE[0x9102];	//读状态端口
		if((temp&stat_busy)==0)
			break;
	}
	return;
}

/*****************************************************************
*函数:wiat_ready_right()
*功能:判断液晶右侧屏是否在忙状态
*形式参数:无;
*返回值:无
******************************************************************/
void wait_ready_right(void)
{
	unsigned char temp;
	while(1)
	{
		temp=XBYTE[0x9202];	//读状态端口
		if((temp&stat_busy)==0)
			break;
	}
	return;
}

/*****************************************************************
*函数:set_line()
*功能:设置行
*形式参数:line-行号;
*返回值:无
******************************************************************/
void set_line(unsigned char line)
{
	wait_ready_left();
	write_inst_left(disp_star_line|line);
	wait_ready_middle();
	write_inst_middle(disp_star_line|line);
	wait_ready_right();
	write_inst_right(disp_star_line|line);
	return;
}

/*****************************************************************
*函数:set_page()
*功能:设置页
*形式参数:page-页号;
*返回值:无
******************************************************************/
void set_page(unsigned char page)
{
	wait_ready_left();
	write_inst_left(page_addr_set|page);
	wait_ready_middle();
	write_inst_middle(page_addr_set|page);
	wait_ready_right();
	write_inst_right(page_addr_set|page);
	return;
}

/*****************************************************************
*函数:set_col()
*功能:设置列
*形式参数:col-列号;
*返回值:无
******************************************************************/
void set_col(unsigned char col)
{
	wait_ready_left();
	write_inst_left(col_addr_set|col);
	wait_ready_middle();
	write_inst_middle(col_addr_set|col);
	wait_ready_right();
	write_inst_right(col_addr_set|col);
	return;
}

/*****************************************************************
*函数:lcd_clr_quarter()
*功能:液晶模块横向清1/4屏
*形式参数:part-清除的部分;
*返回值:无
******************************************************************/
extern void lcd_clr_quarter(unsigned char part)
{
	unsigned char i,page;
 	set_line(0);
	for (page=part*2;page<part*2+2;page++)
    {			
    	set_page(page);					//设置当前页
 		set_col(0);						//设置当前列 		
  		for (i=0;i<64;i++)
    	{	
			wait_ready_left();
			write_data_left(0x00);		//左侧屏当前列数据为0
			wait_ready_middle();
			write_data_middle(0x00);    //中间屏当前列数据为0
			wait_ready_right();
			write_data_right(0x00);		//右侧屏当前列数据为0
    	}
	}
	return;
}

/*****************************************************************
*函数:lcd_clr()
*功能:液晶模块清全屏
*形式参数:无;
*返回值:无
******************************************************************/
extern void lcd_clr(void)
{
	unsigned char i,page;
 	set_line(0);
	for (page=0;page<8;page++)
    {
    	set_page(page);					//设置当前页
 		set_col(0);						//设置当前列
 		
  		for (i=0;i<64;i++)
    	{	
			wait_ready_left();
			write_data_left(0x00);		//左侧屏当前列数据为0
			wait_ready_middle();
			write_data_middle(0x00);    //中间屏当前列数据为0
			wait_ready_right();
			write_data_right(0x00);		//右侧屏当前列数据为0
    	}
	}	
	return;
}

/*****************************************************************
*函数:init_lcd()
*功能:液晶模块初始化
*形式参数:无;
*返回值:无
******************************************************************/
extern void init_lcd(void)
{
	wait_ready_left();
	write_inst_left(disp_off);	//关显示
	wait_ready_middle();
	write_inst_middle(disp_off);
	wait_ready_right();
	write_inst_right(disp_off);
	set_line(0);				//设置开始行为0
	set_page(0);				//设置开始页地址为0
	set_col(0);					//设置开始列为0
	wait_ready_left();
	write_inst_left(disp_on);	//开显示
	wait_ready_middle();
	write_inst_middle(disp_on);
	wait_ready_right();
	write_inst_right(disp_on);
	lcd_clr();					//清屏
	return;
}

/*****************************************************************
*函数:disp_bmp()
*功能:在指定位置显示一个高16个点阵宽W个点阵的位图
*形式参数:x-位图横坐标;y-位图纵坐标;width-位图宽度;bmp-位图代码指针;
*返回值:无
******************************************************************/
/*void disp_bmp(unsigned char x,unsigned char y,unsigned char width,unsigned char *bmp)
{
	unsigned char i,*p;
	p=bmp;
	set_line(0);
	switch(x/64)
	{
		case 0:				//左侧屏显示			
			set_page(y/8);	//显示位图的上半部
			set_col(x%64);
			for(i=0;i<width;i++)
			{
				wait_ready_left();
				write_data_left(*p);
				p++;
			}
			set_page(y/8+1);//显示位图的下半部
			set_col(x%64);
			for(i=0;i<width;i++)
			{
				wait_ready_left();
				write_data_left(*p);
				p++;
			}
			break;
		case 1:				//中间屏显示
			set_page(y/8);	//显示位图的上半部
			set_col(x%64);
			for(i=0;i<width;i++)
			{
				wait_ready_middle();
				write_data_middle(*p);
				p++;
			}
			set_page(y/8+1);//显示位图的下半部
			set_col(x%64);
			for(i=0;i<width;i++)
			{
				wait_ready_middle();
				write_data_middle(*p);
				p++;
			}
			break;
		default:				//右侧屏显示
			set_page(y/8);	//显示位图的上半部
			set_col(x%64);
			for(i=0;i<width;i++)
			{
				wait_ready_right();
				write_data_right(*p);
				p++;
			}
			set_page(y/8+1);//显示位图的下半部
			set_col(x%64);
			for(i=0;i<width;i++)
			{
				wait_ready_right();
				write_data_right(*p);
				p++;
			}			
	}
	return;
}*/
void disp_bmp(unsigned char x,unsigned char y,unsigned char width,unsigned char *bmp)
{
	unsigned char i,k,*p;
	k=x;
	p=bmp;
	set_line(0);
	for(i=0;i<width;i++)		//显示位图的上半部
	{
		switch(k/64)
		{
			case 0:				//左侧屏显示			
				set_page(y/8);
				set_col(k%64);
				wait_ready_left();
				write_data_left(*p);
				k++;
				p++;
				break;
			case 1:				//中间屏显示
				set_page(y/8);
				set_col(k%64);
				wait_ready_middle();
				write_data_middle(*p);
				k++;
				p++;
				break;
			default:			//右侧屏显示
				set_page(y/8);
				set_col(k%64);
				wait_ready_right();
				write_data_right(*p);
				k++;
				p++;				
		}
	}
	k=x;
	for(i=0;i<width;i++)		//显示位图的下半部
	{
		switch(k/64)
		{
			case 0:				//左侧屏显示			
				set_page(y/8+1);
				set_col(k%64);
				wait_ready_left();
				write_data_left(*p);
				k++;
				p++;
				break;
			case 1:				//中间屏显示
				set_page(y/8+1);
				set_col(k%64);
				wait_ready_middle();
				write_data_middle(*p);
				k++;
				p++;
				break;
			default:			//右侧屏显示
				set_page(y/8+1);
				set_col(k%64);
				wait_ready_right();
				write_data_right(*p);
				k++;
				p++;				
		}
	}
}

/*****************************************************************
*函数:disp_one_chinese()
*功能:在指定位置显示一个汉字字符
*形式参数:x-字符横坐标;y-字符纵坐标;chinese-汉字代码指针;
*返回值:无
******************************************************************/
void disp_one_chinese(unsigned char x,unsigned char y,unsigned char *chinese)
{
	disp_bmp(x,y,16,chinese);
	return;
}

/*****************************************************************
*函数:disp_one_number()
*功能:在指定位置显示一个数字字符
*形式参数:x-字符横坐标;y-字符纵坐标;number-数字代码指针;
*返回值:无
******************************************************************/
void disp_one_number(unsigned char x,unsigned char y,unsigned char *number)
{
	disp_bmp(x,y,8,number);
	return;
}

/*****************************************************************
*函数:disp_multi_chinese()
*功能:显示多个汉字
*形式参数:x-字符串启始横坐标;y-字符串启始纵坐标;str-汉字信息指针;
*返回值:无
******************************************************************/
void disp_multi_chinese(unsigned char x,unsigned char y,unsigned char *str)
{
	unsigned char i,*p;
	i=x;
	p=str;
	while(1)
	{
		if(*p==-1)break;
		disp_one_chinese(i,y,chinese_table+(*p)*32);
		p++;
		i+=16;
	}
	return;	
}

/*****************************************************************
*函数:disp_multi_number()
*功能:显示多位数字信息
*形式参数:x-数字串启始横坐标;y-数字串启始纵坐标;n-数字串位数;number-数字值;
*返回值:无
******************************************************************/
void disp_multi_number(unsigned char x,unsigned char y,unsigned char n,unsigned int number)
{
	unsigned char a[3],i,k;
	unsigned int j;
	i=x;
	j=number;
	a[2]=j/100;j=j%100;
	a[1]=j/10;
	a[0]=j%10;
	for(k=n;k>0;k--)
	{
		disp_one_number(i,y,number_table+a[k-1]*16);
		i+=8;
	}
	return;
}

/*****************************************************************
*函数:disp_one_scr_chinese()
*功能:显示一屏汉字信息
*形式参数:scr-界面代码;
*返回值:无
******************************************************************/
void disp_one_scr_chinese(unsigned char scr)
{
	;
}


//////////////////////////////////////
extern void aaa(void)
{
	disp_multi_number(63,16,3,73);
	disp_multi_number(123,16,3,124);
	disp_multi_number(1,0,3,568);
	disp_multi_number(123,0,2,9);
	

	//disp_one_chinese(33,16,chinese_table+32*1);
	//disp_one_chinese(17,32,chinese_table+32*2);
	//disp_one_chinese(3,48,chinese_table+32*3);

	//disp_one_chinese(121,0,chinese_table);
	//disp_one_chinese(133,16,chinese_table+32*1);
	//disp_one_chinese(171,32,chinese_table+32*2);
	//disp_one_chinese(123,48,chinese_table+32*3);
	
}


⌨️ 快捷键说明

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