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

📄 menu.c

📁 通过51单片机对MB9200中文字符叠加芯片进行控制
💻 C
字号:
#include "menu.h"

uchar	code	MONSCREEN[] ={' ',' ',' ','M','O','N',' ','N','U','M','B','E','R',':',' '};
uchar	code	VIDEOMODEL[]={' ',' ',' ','V','I','D','E','O',' ','T','Y','P','E',':',' '};
uchar	code	SELECTNTSC[]={'N','T','S','C'};
uchar	code	SELECTPAL[]	={'P','A','L',' '};

void delay(unsigned char time)
{
	unsigned char i,j;
	
	for(i=0;i<255;i++)
	{
		for(j=0;j<time;j++);
	}
}

void Send_1byte(uchar byte_data1)
{
	uchar	j;
	CLK=(bit)1;
	EA=0;
	CS=0;
	for(j=0;j<8;j++)
	{
		SDATA =(bit)(byte_data1 & 0x80) ;	
		CLK=(bit)0; 			
		byte_data1<<=1;
		CLK=(bit)1;
	}
	CS=1;
	EA=1;
}

void FunSend16Bit(uint sddata)
{
	uchar i,s_char1,s_char2; 
	
   	s_char1=(sddata/256);
	s_char2=(sddata%256);
	
	CLK=(bit)1;
	
	EA=0;
	CS=0;
	
	for(i=0;i<8;i++)
	{
		SDATA =(bit)(s_char1 & 0x80) ;
		CLK=(bit)0;
		s_char1<<=1;
		CLK=(bit)1;
	}
	for(i=0;i<8;i++)
	{
		SDATA =(bit)(s_char2 & 0x80) ;
		CLK=(bit)0;
		s_char2<<=1;
		CLK=(bit)1;
	}
	CS=1;
	EA=1;
}

uchar get_char()
{
	char ch;
	ch=Rxbuf[readRxcnt];
	readRxcnt++;
	if(readRxcnt>=inlen)
		readRxcnt=0;
	EA=0;
	if(readRxcnt==writeRxcnt)
		bRxEmpty=0;
	EA=1;
	return ch;
}

void FunDispData(unsigned char disp_data,bit b_flash)
{
	if(b_flash)
	{FunSend16Bit(0xc200|character_list[disp_data]);}
	else
	{FunSend16Bit(0xc000|character_list[disp_data]);}
}

void FunInitInter6464A(void)
{
	unsigned char temp;

		FunSend16Bit(EXIT_TEST); 	/*退出测试模式*/
		Send_1byte(CLR_RAM);     	/*清空6464A的显示RAM*/
		delay(10);
		
		temp=PAL;
		if(temp)
		{Send_1byte(VIDIOMODE_PAL);}	/*视频模式选择PAL/NTSC PAL-N PAL-M SCAREAM */
		else
		{Send_1byte(VIDIOMODE_NTSC);}
		
		//Send_1byte(VIDIOMODE_PAL);	/*视频模式选择PAL/NTSC PAL-N PAL-M SCAREAM */
		Send_1byte(INTEROSC_OPEN);   /*内部模式,晶振打开*/
		Send_1byte(OSC4X_OPEN);     /*四倍晶振打开CLOSE*/
		Send_1byte(INTERBLUESCREEN);
		Send_1byte(CHARBLACKFRAME);
		FunSend16Bit(CTRL_LIGHT);
		Send_1byte(DISP_CTRLOPEN);
		if(temp)
		{FunSend16Bit(COOR_POSIZION);	}
		else
		{FunSend16Bit(NTSC_POSIZION);	}
	//	FunSend16Bit(WRITE_POSITION);
	/*
		for(i=0;i<15;i++)
		{
			FunSend16Bit((0xc000|character_list[MONSCREEN[i]]));					
		}
		
		FunSend16Bit(0xc000);					
		FunSend16Bit(0xc000);					
		FunSend16Bit(0xc000|((1/10)&0xff));					
		FunSend16Bit(0xc000|(1%10));
			
		for(i=0;i<5;i++)
		{
			FunSend16Bit((0xc010));					
		}

		for(i=0;i<15;i++)
		{
			FunSend16Bit((0xc000|character_list[VIDEOMODEL[i]]));					
		}
		
		for(i=0;i<4;i++)
		{
			FunSend16Bit((0xc200|character_list[SELECTPAL[i]]));					
		}
		*/
}


void	FunInitExt6464A(void)
{
	unsigned char temp;
	
		FunSend16Bit(EXIT_TEST);
		Send_1byte(CLR_RAM);
	//	Send_1byte(VIDIOMODE_PAL);
		temp=PAL;
		if((temp))
		Send_1byte(VIDIOMODE_PAL);	/*视频模式选择PAL/NTSC PAL-N PAL-M SCAREAM */
		else
		{Send_1byte(VIDIOMODE_NTSC);}
		
		Send_1byte(EXTOSC_OPEN);
		Send_1byte(DISP_CTRLOPEN);
		Send_1byte(CHARBLACKFRAMEEXT); 
		//FunSend16Bit(COOR_POSIZION);
		if(temp)
		{FunSend16Bit(COOR_POSIZION);	}
		else
		{FunSend16Bit(NTSC_POSIZION);	}
}

void cpu_init(void)
{
	SCON=0x50;				/*22.1184MHz,baud=19.2k*/
	//PCON=0x80;				/*SMOD=1*/
	TMOD=0x21;
	TH1=0xfd;
	TL1=0xfd;
	
	TR1=1;ET1=0;ES=1;
}

void FunSetPosition(unsigned char cPositionx,unsigned char cPositiony)
{
	unsigned int cPosition;
	
	cPosition=cPositionx<<5 | cPositiony | 0x8800;
	FunSend16Bit(cPosition);
}


void init(void)
{
	unsigned char i,j;
	
	for(i=0;i<0xff;i++)
	{for(j=0;j<0xff;)j++;}	
	
	WDI();
	
	readTxcnt=0;
	writeTxcnt=0;
	readRxcnt=0;
	writeRxcnt=0;
	bTxEmpty=0;	//0:empty	1:unempty
	bRxEmpty=0;	
	
	c_status=0;
	
	bInMenu=0;
	
	CS_NORMAL();
	
//	FunInitInter6464A();//2004.7.28 add
	//CS_MENU();
	
	cpu_init();
}



void FunProcessRec(void)
{
	unsigned char temp;
	bit	b_blink;
	
	switch(c_status)
	{
		case 0:
			temp=get_char();
			rec_row=temp & 0xf;
			temp=temp & 0xf0;
			
			if(temp==0x90){c_status=1;}
			break;
		case 1:
			temp=get_char();
			rec_col=temp& 0x1f;
			temp=temp & 0xe0;
			if(temp==0xa0){c_status=2;if(bInMenu==0){bInMenu=1;CS_MENU();FunInitInter6464A();}}
			else{c_status=0;}
			break;
		case 2:
			temp=get_char();
			if(temp==0x84){FunInitExt6464A();c_status=0;CS_NORMAL();bInMenu=0;}
			else if(temp==0x85){FunSetPosition(0,0);c_status=3;b_blink=0;}//display command
			else if(temp==0x87){c_status=4;b_blink=1;}//flash command
			else if(temp==0x86){c_status=4;b_blink=0;}//unflash command
			else{c_status=0;}
			break;
		case 3:
			temp=get_char();
			//put_char(temp);
			if(temp==0x84){c_status=0;}
			else
			{
				FunDispData(temp,b_blink);
			}	
			break;
		case 4:
			temp=get_char();
			FunSetPosition(rec_row,rec_col);
			
			FunDispData(temp,b_blink);
			
			c_status=0;
			break;
		default :
			c_status=0;
			break;
	}
}

void main()
{
//	unsigned char i,j;
	
	EA=0;
	
	init();
	
	EA=1;
	
	//FunInitInter6464A();
	
	WDI();
	/*
	for(i=0;i<12;i++)
	{
		for(j=0;j<24;j++)
		FunDispData('A',0);
		WDI();
	}*/
	
	while(1)
	{
		if(bRxEmpty)
		{
			FunProcessRec();
		}
		WDI();
		
	}
}

void serial_interrupt() interrupt 4
{
	if(TI)
	{
 		TI=0;
 		if(writeTxcnt!=readTxcnt)
 		{
 			SBUF=Txbuf[readTxcnt];
 			readTxcnt++;
 			if(readTxcnt==olen)
 				readTxcnt=0;
 			bTxEmpty=1;
 		}else{bTxEmpty=0;}
	}

	if(RI)
	{
		RI=0;
		
		Rxbuf[writeRxcnt]=SBUF;

		writeRxcnt++;
		if(writeRxcnt==inlen)
			writeRxcnt=0;
	//	if(readRxcnt==writeRxcnt){put_char(0x55);bRxFull=1;}
		
		bRxEmpty=1;
	}	
}

⌨️ 快捷键说明

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