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

📄 dispfinal.c

📁 视频字符叠加系统、采用89系列单片机开发
💻 C
📖 第 1 页 / 共 3 页
字号:
	i=(receive_buf[1]&0x30)>>4;
	left_shift(charsize|i);
	while(osd_busy);	 left_shift(smooth|pos); 
	i=char_position|((disp_lines>>3)&0x01);
	j=disp_lines<<5&0xe0|disp_words;
	while(osd_busy);
	left_shift(i);					//command and lines.3
	while(osd_busy);
	left_shift(j);					//lines.2-0 and words
	if(start_blink==1) 	left_shift(char_blink);
	else 				left_shift(char_attribute);
	for(i=0;i<24;i++)
		{
			if(i+disp_words>=24) 
				{
				address_buf[i]=0xef;
				continue;
				}
		if((start_blink==(i+1))&(i!=0))
		 		{
				if(channel==0) 
					{
					osd1_cs=1;
					_nop_();
					osd1_cs=0;
					}
			   	else
					{
					osd2_cs=1;
					_nop_();
					osd2_cs=0;
					}
				left_shift(char_blink);	
				}
			if(end_blink==(i+1))
				{
				if(channel==0)
					{
					osd1_cs=1;
					_nop_();
					osd1_cs=0;
					}
			   	else
					{
					osd2_cs=1;
					_nop_();
					osd2_cs=0;
					}
				left_shift(char_attribute);
				}
			if(address_buf[i]==0xef) break;
			left_shift(address_buf[i]);
			address_buf[i]=0xef;
	  	}
   	while(osd_busy);
		{	osd1_cs=1;
			osd2_cs=1;	}
   	}
//---------------------------------------------------------------------------
void create_character(unsigned int pos)				//requista address
		{
			unsigned char data i,pow;
			while(osd_busy);						//write a space line
				left_shift(cram_data);
			while(osd_busy);
				left_shift(0x00);
			while(osd_busy);						//write a space line
				left_shift(cram_data);
			while(osd_busy);
				left_shift(0x00);
			for(i=0;i<16;i++)						//write character dot information
				{
					pow=XBYTE[pos++];
					pow=pow&0x0f|cram_data;
					while(osd_busy);
						left_shift(pow);
					pow=XBYTE[pos++];
					while(osd_busy);
						left_shift(pow);
				}
	   	}

//----------------------------------------------------------------------------
void detemine_command(void)
		{
		unsigned char data comm;
		receive_flag=0;
		ES=0;					
		for(comm=0;comm<29;comm++)
			{
			receive_buf[comm]=receive_buf2[comm];
			}
		ES=1;
        comm=receive_buf[0]&0xf0;
        switch(comm)
           	{
           	case 0x10: timer_position(); break;
           	case 0x20: timer_setup();    break;
				case 0x30: clear_disp();	 break;
            case 0x40: disp_character(); break;
				case 0x50: release_alarm();  break;
	        	case 0x60: video_change();   break;
				case 0x70: background_set(); break;
				case 0x80: close_time();	 break;
				case 0x90: close_date();	 break;
				case 0xa0: televisionmode(); break;
				default:                     break;
            }
		}

//--------------------------------------------------------------------------
unsigned char get_strokes(unsigned char pow)
		{
		char data t,i=0,j=47;
		while(j>=i)
			{
			t=(i+j)/2;
			if(pow==disp_strokes[t].ascii)
				{
				return(disp_strokes[t].stroke);
				}
	   		else
				{
	 			if(pow<disp_strokes[t].ascii)
					{
					j=t-1;
					}
				else
					{
					if(pow>disp_strokes[t].ascii)
					i=t+1;
					}
			  	}
		   	}
		return(0xce);
		} 
//---------------------------------------------------------------------------
unsigned char get_ch_strokes(unsigned char high_data,unsigned char low_data)
		{
		char data t,i=0,j=49;
		while(j>=i)
			{
			t=(i+j)/2;
			if((high_data==disp_ch_strokes[t].code_high)&(low_data==disp_ch_strokes[t].code_low))
				{
				return(disp_ch_strokes[t].ch_stroke);
				}
	   		else
				{
	 			if((high_data<disp_ch_strokes[t].code_high)||\
				   ((high_data==disp_ch_strokes[t].code_high)&&\
				   (low_data<disp_ch_strokes[t].code_low)))
					{
					j=t-1;
					}
				else
					{
					if((high_data>disp_ch_strokes[t].code_high)||\
					   ((high_data==disp_ch_strokes[t].code_high)&&\
					   (low_data>disp_ch_strokes[t].code_low)))
					i=t+1;
					}
			  	}
		   	}
		return(0);
		} 
//---------------------------------------------------------		
void getaddrone(unsigned char channel)
	{
	unsigned char data i,pow,j,t,n=0;
	i=receive_buf[1]&0x0f;
	if(i>=12) i-=12;
	disp_lines=i;
	disp_words=receive_buf[2];
	start_blink=receive_buf[3];
	end_blink=receive_buf[4];
	for(j=5;j<29;j++)
		{
		if(receive_buf[j]==0)
			{
			address_buf[n++]=0xef;
			continue;
			}
		else
			{
			if(receive_buf[j]<0x80)
				address_buf[n++]=get_strokes(toupper(receive_buf[j]));
			else
				{
				pow=get_ch_strokes(receive_buf[j],receive_buf[j+1]);
				if(pow!=0) 
					{
					j++;
					address_buf[n++]=pow;
					}				//is internal  existed chinese code
				else				//is not internal chinese
					{
					for(t=0;t<32;t++,t++)
						{
						if((receive_buf[j]==character_code[0][t])&&\ 
							(receive_buf[j+1]==character_code[0][t+1]))	//aready exist pregenerated code
							{
							j++;
							address_buf[n++]=0xf0+t/2;
							already=1;
							break;
							}
				   		}
					if(!already)
						{
						character_code[0][disp_count++]=receive_buf[j++];
						character_code[0][disp_count]=receive_buf[j];
						address_buf[n++]=0xf0+disp_count/2;
						if(++disp_count>=32) disp_count=0;
						required=1;
						}
				already=0;
					}
				}
			}
		}
	if(required)
		{
		write_osd_cram(channel);
		required=0;
		}
	write_osd_vram(i,channel);
	}
//---------------------------------------------------------		
void getaddrtwo(unsigned char channel)
	{
	unsigned char data i,pow,j,t,n=0;
	i=receive_buf[1]&0x0f;
	if(i>=12) i-=12;
	disp_lines=i;
	disp_words=receive_buf[2];
	start_blink=receive_buf[3];
	end_blink=receive_buf[4];
	for(j=5;j<29;j++)
		{
		if(receive_buf[j]==0)
			{
			address_buf[n++]=0xef;
			continue;
			}
		else
			{
			if(receive_buf[j]<0x80)
				address_buf[n++]=get_strokes(toupper(receive_buf[j]));
			else
				{
				pow=get_ch_strokes(receive_buf[j],receive_buf[j+1]);
				if(pow!=0) 
					{
					j++;
					address_buf[n++]=pow;
					}				//is internal  existed chinese code
				else				//is not internal chinese
					{
					for(t=0;t<32;t++,t++)
						{
						if((receive_buf[j]==character_code[1][t])&&\ 
							(receive_buf[j+1]==character_code[1][t+1]))	//aready exist pregenerated code
							{
							j++;
							address_buf[n++]=0xf0+t/2;
							already=1;
							break;
							}
				   		}
					if(!already)
						{
						character_code[1][addr_count++]=receive_buf[j++];
						character_code[1][addr_count]=receive_buf[j];
						address_buf[n++]=0xf0+addr_count/2;
						if(++addr_count>=32) addr_count=0;
						required=1;
						}
				already=0;
					}
				}
			}
		}
	if(required)
		{
		write_osd_cram(channel);
		required=0;
		}
	write_osd_vram(i,channel);
	}
//---------------------------------------------------------------------
void disp_character(void)
	{
	unsigned char data i;
	i=receive_buf[0]&0x03;
	if(i==0)
		{
		getaddrone(0);
		getaddrtwo(1);
		}
	if(i==1) getaddrone(0);
	if(i==2) getaddrtwo(1);	//-
	}

//--------------------------------------------------------------------
void video_change(void)
		{
		unsigned char i;
		i=receive_buf[0]&0x01;
		if(i) k_4053c=1;
		else  k_4053c=0;
		}
//----------------------------------------------------------------------
void release_alarm(void)
		{
		alarm=1;
		}

//--------------------------------------------------------------------
void separate_half_date(void)
		{
		unsigned char data i=0;
		address_buf[i++]=(unsigned char)(real_clock.years/1000);
		address_buf[i++]=(unsigned char)(real_clock.years%1000/100);
		address_buf[i++]=(unsigned char)(real_clock.years%100/10);
		address_buf[i++]=(unsigned char)(real_clock.years%10);
		address_buf[i++]=0xcd;
		address_buf[i++]=real_clock.months/10;
		address_buf[i++]=real_clock.months%10;
		address_buf[i++]=0xcd;
		address_buf[i++]=real_clock.dates/10;
		address_buf[i++]=real_clock.dates%10;
		}
//----------------------------------------------------------------------
void separate_half_time(void)
		{
		unsigned char data i=0;
		address_buf[i++]=real_clock.hours/10;
		address_buf[i++]=real_clock.hours%10;
		address_buf[i++]=0xe1;
		address_buf[i++]=real_clock.minutes/10;
		address_buf[i++]=real_clock.minutes%10;
		address_buf[i++]=0xe1;
		address_buf[i++]=real_clock.seconds/10;
		address_buf[i++]=real_clock.seconds%10;
		}
//---------------------------------------------------------------------------
void write_osd_date(void)
		{
		unsigned char data i;
		separate_half_date();
		while(osd_busy);
		left_shift(((real_clock.date_lines>>3)&0x01)|char_position);
		while(osd_busy);
		left_shift((real_clock.date_lines<<5)|real_clock.date_words);
		while(osd_busy);
		left_shift(char_attribute);
		for(i=0;i<10;i++)
			{
			while(osd_busy);
			left_shift(address_buf[i]);
		   	}
	 	}
//---------------------------------------------------------------------------
void write_osd_time(void) 
		{
		unsigned char data i;
		separate_half_time();
		while(osd_busy);
		left_shift(((real_clock.time_lines>>3)&0x01)|char_position);
		while(osd_busy);
		left_shift((real_clock.time_lines<<5)|real_clock.time_words);
		while(osd_busy);
		left_shift(char_attribute);
		for(i=0;i<8;i++)
			{
			while(osd_busy);
			left_shift(address_buf[i]);
		   	}
	 	} 
//--------------------------------------------------------------------
void clear_disp(void)
	{
	unsigned char data k,i;
	k=receive_buf[0]&0x03;
	oneday=1;
	if(k==0) 
		{
		osd1_cs=0;
		osd2_cs=0;
	 	for(i=0;i<32;i++){
	 		character_code[0][i]=0;
	 		character_code[1][i]=0;
	 		}
		addr_count=0;
		disp_count=0;
		}
	else 
		{
		if(k==1) {
			osd1_cs=0;
			for(i=0;i<32;i++)
			character_code[0][i]=0;
			disp_count=0;
			}
		else {
			osd2_cs=0;
			for(i=0;i<32;i++)
			character_code[1][i]=0;
			addr_count=0;
			}
		}
 	while(osd_busy);
	left_shift(clear_vram);
	delay(1);   //5 to 1   ;9.2
	while(osd_busy);
	left_shift(disp_control);
	while(osd_busy);
		{osd1_cs=1;
		osd2_cs=1;}
	}
//----------------------------------------------------------------------------
void timer_setup(void)
		{
		oneday=1;
		real_clock.years=((receive_buf[1]&0x0f)*1000l)+(unsigned int)(receive_buf[2]&0x0f)*100\
							+(receive_buf[3]&0x0f)*10+(receive_buf[4]&0x0f);
		real_clock.months=(receive_buf[5]&0x0f)*10+receive_buf[6]&0x0f;
		real_clock.dates=(receive_buf[7]&0x0f)*10+(receive_buf[8]&0x0f);
		real_clock.hours=(receive_buf[9]&0x0f)*10+(receive_buf[10]&0x0f);
		real_clock.minutes=(receive_buf[11]&0x0f)*10+(receive_buf[12]&0x0f);
		real_clock.seconds=(receive_buf[13]&0x0f)*10+(receive_buf[14]&0x0f);
		if(real_clock.years%4==0&&real_clock.years%100!=0||real_clock.years%400==0) leap=1;
		else leap=0;
	 	}
//-------------------------------------------------------------------
void timer_position(void)
		{
		unsigned char i;
		oneday=1;
		for(i=0;i<10;i++)
		address_buf[i]=0xef;
		osd1_cs=0;
		osd2_cs=0;
		while(osd_busy);
		left_shift(((real_clock.date_lines>>3)&0x01)|char_position);
		while(osd_busy);
		left_shift((real_clock.date_lines<<5)|real_clock.date_words);
		while(osd_busy);
		left_shift(char_attribute);
		for(i=0;i<10;i++)
			{
			while(osd_busy);
			left_shift(address_buf[i]);
		  	}
		osd1_cs=1;
		osd2_cs=1;
		osd1_cs=0;
		osd2_cs=0;
		while(osd_busy);
		left_shift(((real_clock.time_lines>>3)&0x01)|char_position);
		while(osd_busy);
		left_shift((real_clock.time_lines<<5)|real_clock.time_words);

⌨️ 快捷键说明

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