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

📄 t10a2_display.c

📁 AVR单片机基础程序实例! 十个程序源代码。
💻 C
📖 第 1 页 / 共 5 页
字号:
		if (Waiting_Step < 10)
		{
			Waiting_Step++;
		}
		else
		{
			Waiting_Step = 0;
		}
	}

	switch (Waiting_Step)
	{
		case 0:	
			WriteMod(64,16,Star001);
			break;
		case 1:
			WriteMod(110,16,Star001);
			WriteMod(64,16,Star002);
			break;
		case 2:
			WriteMod(110,16,Star002);
			WriteMod(64,16,Star003);
			WriteMod(32,8,Star002);
			break;
		case 3:
			WriteMod(110,16,Star002);
			WriteMod(64,16,Star004);
			WriteMod(32,8,Star003);
			break;
		case 4:
			WriteMod(110,16,Star003);
			WriteMod(64,16,Star005);
			WriteMod(80,8,Star001);
			break;
		case 5:
			//WriteMod(110,16,Star004);
			WriteMod(64,16,Star006);
			WriteMod(80,8,Star002);
			WriteMod(8,12,Star001);
			break;
		case 6:
			WriteMod(110,16,Star005);
			//WriteMod(64,16,Star007);
			//WriteMod(16,24,Star001);
			WriteMod(80,8,Star003);
			WriteMod(8,12,Star002);
			break;
		case 7:
			WriteMod(110,16,Star006);
			//WriteMod(100,16,Star001);
			WriteMod(16,24,Star001);
			WriteMod(8,12,Star003);
			break;

		default:
			Waiting_Step = 0;
			break;

	}		
	
	if (SccrollY_PT < 126)
	{
		SccrollY_PT++;
	}
	else
	{
		SccrollY_PT = -64;
	}
	
	WriteMod(SccrollY_PT,8,Avlight_Tab);
}

/******************************************************************************/
//	Function:	开机画面
//	Input:		none
//	Output: 	none
/******************************************************************************/
unsigned char Initial_Display()
{
	static	unsigned char	delay=0,starseq=0,acttimer,arr=0,lettdelay,lettarr;
	unsigned char	tmp;
	unsigned char	x,y;
    while(!(time_flag&BIT(FLAG_5MS)));
    time_flag&=~BIT(FLAG_5MS);
    //Lighten_VFD();

	if(arr==0)
    	{
       		for(tmp=0;tmp<80;tmp++)
	    	{
		    Spectrum_Temporary1[tmp]=0;
    		}
		acttimer=1;
		lettdelay=50;
		lettarr=0;
	}
	acttimer--;
	if(acttimer!=0)return 0;
	acttimer=20;
	arr++;
	x=0;
	y=0;
	if(delay==0)
	{
		x=StarLib[starseq][0];
		y=x>>5;
		x=x&0x1f;
		if(x&16)
		{
			x=-(x&15);
		}
		if(y&4)
		{
			y=-(y&3);
		}
		delay=StarLib[starseq][1];
		starseq++;
		if(starseq>=(60/2))starseq=0;
	}
	delay--;
	
	Lock_VFD(1);
	StarSetOut(x,y);
	lettdelay--;
	if(lettdelay==0)
	{
		lettarr++;
		lettdelay=D90a_Appear(lettarr);
	}
	else
	{
		D90a_Appear(lettarr);
	}

	Lock_VFD(0);

	if(arr==100)
	{
		arr=0;
		return 1;
	}
	else
	{
		return	0;
	}
}

void StarSetOut(signed char speedx,signed char speedy)
{
	signed char x,y;
	unsigned char l,tmp;
	unsigned char __flash    *p2star;
	CLEAR_VFD();
	if(speedx | speedy)
	{
		l=0;
		while(Spectrum_Temporary1[l]!=0)
		{
			l+=5;
			if(l>=(16*5))
			{
				l=0;
				break;
			}
		}
    		Spectrum_Temporary1[l++]=speedx;
	    	Spectrum_Temporary1[l++]=speedy;
		Spectrum_Temporary1[l++]=64;
       		Spectrum_Temporary1[l++]=20;
		Spectrum_Temporary1[l]=0;
        }
	for(l=0;l<16*5;)
	{
        	speedx=Spectrum_Temporary1[l];
        	speedy=Spectrum_Temporary1[l+1];
        	if(!(speedx || speedy))
        	{
			    l+=5;
			    continue;
		    }
        	if(speedx>0)
        	{
        		Spectrum_Temporary1[l]++;
        	}
        	else
        	{
        		if(speedx<0)
        		{
        			Spectrum_Temporary1[l]--;
        		}
        	}
        	l++;
        	if(speedy>0)
        	{
        		Spectrum_Temporary1[l]++;
        	}
        	else
        	{
        		if(speedy<0)Spectrum_Temporary1[l]--;
        	}
        	l++;
		x=Spectrum_Temporary1[l];
		x+=speedx;
		if(x < 0)
		{
			Spectrum_Temporary1[l-2]=0;
			Spectrum_Temporary1[l-1]=0;
			l+=3;
			continue;
		}
		Spectrum_Temporary1[l++]=x;
		y=Spectrum_Temporary1[l];
		y+=speedy;
		if(y < 0 || y > 32)
		{
            		Spectrum_Temporary1[l-3]=0;
            		Spectrum_Temporary1[l-2]=0;
            		l+=2;
			continue;
		}
		Spectrum_Temporary1[l++]=y;
		tmp=Spectrum_Temporary1[l];
		if(tmp<9)tmp++;
		Spectrum_Temporary1[l++]=tmp;
		switch(tmp)
		{
			case 0:
				continue;
			case 1:
				VFD_Point(x+4,y+4,1);
				continue;
			case 2:
				p2star=Star001;
				break;
			case 3:
				p2star=Star002;
				break;
			case 4:
				p2star=Star003;
				break;			
			case 5:
				p2star=Star004;
				break;
			case 6:
				p2star=Star005;
				break;
			case 7:
				p2star=Star006;
				break;
			case 8:
				p2star=Star007;
				break;
			case 9:
				p2star=Star008;
				break;
		}
		WriteMod(x,y,p2star);
	}
}

unsigned char D90a_Appear(unsigned char step)
{
	unsigned char VFD_Scan_Count=1;
	switch(step)
	{
			case 0:
				break;
			case 1:
				WriteMod(127-21,14,SLANT_T);
				break;
			case 2:
				WriteMod(127-48,14,SLANT_T);
				break;
			case 3:
				WriteMod(127-75,14,SLANT_T);
				break;
			case 4:
				WriteMod(127-90,14,SLANT_T);
				break;
			case 5:
				WriteMod(127-103,14,SLANT_T);
				break;
			case 6:
				WriteMod(127-103,14,SLANT_T);
				WriteMod(127-10,14,SLANT_H);
				break;
			case 7:
				WriteMod(127-37,14,SLANT_H);
				WriteMod(127-103,14,SLANT_T);
				break;
			case 8:
				WriteMod(127-64,14,SLANT_H);
				WriteMod(127-103,14,SLANT_T);
				break;
			case 9:
				WriteMod(127-92,14,SLANT_H);
		                WriteMod(127-103,14,SLANT_T);
				VFD_Scan_Count = VFD_Scan_Count*2;
				break;
			case 10:
				WriteMod(127-92,14,SLANT_H);
		                WriteMod(127-103,14,SLANT_T);
				WriteMod(127-24,14,SLANT_G);
				break;
			case 11:
				WriteMod(127-51,14,SLANT_G);
				WriteMod(127-92,14,SLANT_H);
		                WriteMod(127-103,14,SLANT_T);
				break;
			case 12:
				WriteMod(127-92,14,SLANT_GH);
	        		WriteMod(127-103,14,SLANT_T);
				VFD_Scan_Count = VFD_Scan_Count*2;
				break;
			case 13:
				WriteMod(127-92,14,SLANT_GH);
	        		WriteMod(127-103,14,SLANT_T);
				WriteMod(127-15,9,SLANT_I);
				break;
			case 14:
				WriteMod(127-42,9,SLANT_I);
				WriteMod(127-92,14,SLANT_GH);
				WriteMod(127-103,14,SLANT_T);
				break;
			case 15:
				WriteMod(127-92,9,SLANT_IGH);
				WriteMod(127-103,14,SLANT_T);
				VFD_Scan_Count = VFD_Scan_Count*5;
				break;
			case 16:
				WriteMod(127-92,9,SLANT_IGH);
				WriteMod(127-103,14,SLANT_T);
				WriteMod(127-9,9,SLANT_L);
				break;
			case 17:
				WriteMod(127-36,9,SLANT_L);
				WriteMod(127-92,9,SLANT_IGH);
				WriteMod(127-103,14,SLANT_T);
				break;
			case 18:
				WriteMod(127-92,9,SLANT_LIGH);
				WriteMod(127-103,14,SLANT_T);
				VFD_Scan_Count = VFD_Scan_Count*2;
				break;
			case 19:
				WriteMod(127-92,9,SLANT_LIGH);
				WriteMod(127-103,14,SLANT_T);
				WriteMod(127-2,14,SLANT_V);
				break;	
			case 20:
				WriteMod(127-21,14,SLANT_V);
		                WriteMod(127-92,9,SLANT_LIGH);
	        	        WriteMod(127-103,14,SLANT_T);
				break;
			case 21:
		                WriteMod(127-92,9,SLANT_VLIGH);
	        		WriteMod(127-103,14,SLANT_T);
				VFD_Scan_Count = VFD_Scan_Count*2;
				break;
			case 22:
				WriteMod(127-14,9,SLANT_A);
		                WriteMod(127-92,9,SLANT_VLIGH);
	        		WriteMod(127-103,14,SLANT_T);
				break;
			case 23:
				WriteMod(127-41,9,SLANT_A);
		                WriteMod(127-92,9,SLANT_VLIGH);
	        		WriteMod(127-103,14,SLANT_T);					
				VFD_Scan_Count = VFD_Scan_Count*16;  //保持显示AVLIGHT的时间
				break;


			case 24:
            	WriteMod(127-82,12,APPEAR_D90_9);					
				VFD_Scan_Count = VFD_Scan_Count*100;   //保持显示D90A的时间
                break;
	        default:
	        	VFD_Scan_Count = VFD_Scan_Count*100;
	        	break;
		}
			return	VFD_Scan_Count;
	
}


void CLEAR_VFD(void)
{
	unsigned char *point;
	point=*Display_Buffer;
	do
	{
		*point=0;
	}while(++point<(*Display_Buffer+512));

}

void ini_CLEAR_VFD(void)
{
	unsigned char *point;
	point=*Display_Memory;
	do
	{
		*point=0;
	}while(++point<(*Display_Memory+512));

}


void Initial_VFD(void)
{
	unsigned char s;
	SccrollX_PT = -16;
	SccrollY_PT = -64;
	VFD_Scan_Timer = 0;
	VFD_Scan_Count = 0;
	SETB_VFD_BKG;
	SPCR=0;
	CLR_VFD_SID;
	
	for(s=0;s<64;s++)
	{
		asm("nop");
		CLR_VFD_CLKG;
		CLR_VFD_CLKD;
		asm("nop");
		SETB_VFD_CLKG;
		SETB_VFD_CLKD;
	}
	
	VFD_Display_Mode = Initial_DisMode;

	//SETB_VFD_CLKG;
	//SETB_VFD_CLKD;
	//CLR_VFD_LATCH;
	//SETB_VFD_BKD;
	ini_CLEAR_VFD();
	CLEAR_VFD();	
}

/*
void Lighten_VFD()
{
	unsigned char DISPLAYSTEP,BYTESTEP;
	unsigned char SPICache;
	unsigned char *DISPLAYPOINT;
	
	ETIMSK = 0x00; //extended timer interrupt sources	
	SPICache = Display_Buffer[0][0];
	DISPLAYPOINT = Display_Buffer[0];
	for(DISPLAYSTEP=0;DISPLAYSTEP<64;DISPLAYSTEP++)
	{
		CLR_BIT(SPCR,6);

		
		if(DISPLAYSTEP==0 || DISPLAYSTEP==1)
		{
			SETB_VFD_SID;
		}
		else
		{
			CLR_VFD_SID;
		}
		
		SETB_VFD_BKG;
		NOP();
		SETB_VFD_LATCH;
		CLR_VFD_CLKG;
		NOP();
		SETB_VFD_CLKG;
		CLR_VFD_LATCH;
		CPL_VFD_BKD;	
		Delay_Xus(20);	
		CLR_VFD_BKG;
		CLR_VFD_SID;		

		SET_BIT(SPCR,6);
		
		for(BYTESTEP=0;BYTESTEP<8;BYTESTEP++)
		{		
			SPDR = SPICache;
			DISPLAYPOINT++;
			SPICache = *DISPLAYPOINT;
			while(!TEST_BIT(SPSR,7));			
		}
	}
	SETB_VFD_BKG;
	ETIMSK = 0x04; //extended timer interrupt sources	
}
*/

void Temperature_Detect(void)
{
	//Temperature_Value;
	ADCSRA=0x83;
	ADMUX=64+32+AD_TEMP;
	SET_BIT(ADCSRA,1);
	ADC_ON;
	while(TEST_BIT(ADCSRA,6));
	Temperature_Value=ADCH;
}

void inline DisplayBuffer_Write(unsigned char *place,unsigned char y,unsigned char mode)
{
	switch(mode)
	{
		case 0:
			*place^=y;//取反
			break;
		case 1:
			*place|=y;//置位
			break;
		case 2:
			*place&=~y;//清零
			break;
    default:
			break;
	}
}

struct
{
	unsigned char frqField[7];
	unsigned char latest;
	unsigned char timeField;
}FreqData;


union Word2Byte
{
	unsigned int word;
	signed int sword;
	unsigned char byte[2];
	signed char sbyte[2];
};


void Refresh_FreqData(unsigned char mode/*,void (*display)(void)*/)
{
	static unsigned char step=0,fustep,fdstep,limite=255,lstcond;
	unsigned char tmp;
	union Word2Byte itmp;
	unsigned int total;
	#define limit 220
	if(mode&FreqSenseMode_CleanVFD)
	{
		CLEAR_VFD();
	}
	if(mode&FreqSenseMode_ForceInitial)
	{
		CLEAR_VFD();
		step=0;
	}
	if(mode&FreqSenseMode_SenseUp)
	{
		itmp.byte[0]=OCR1AL;
		itmp.byte[1]=OCR1AH;
		if(itmp.word!=1)itmp.word--;
		OCR1AL=itmp.byte[0];
		OCR1AH=itmp.byte[1];
	}
	if(mode&FreqSenseMode_SenseDown)
	{
    		itmp.byte[0]=OCR1AL;
	    	itmp.byte[1]=OCR1AH;
    		if(itmp.word!=0x018f)itmp.word++;
	    	OCR1AL=itmp.byte[0];
    		OCR1AH=itmp.byte[1];
	}
	tmp=PORT_AD_SEL;
	switch(step&15)
	{
		case 0:
			DDR_ADC=DDR_ADC & ~(1<<AD_FRQ | 1<<AD_TIME);
			DDR_AD_SEL=DDR_AD_SEL | (1<<AD_SEL_A | 1<<AD_SEL_B | 1<<AD_SEL_C);
			tmp&=~(1<<AD_SEL_A | 1<<AD_SEL_B | 1<<AD_SEL_C);
			SET_BIT(DDRB,5);
			ChangeSpectDisp();
			ADMUX=64+32;
			ADCSRA=0x83;
			ADCSRB=0;
			TIMSK=TIMSK & (~0x3c);
			ETIMSK=ETIMSK & (~1);
			TCCR1A=0xc2;
			TCCR1C=0;
			ICR1=250;
			OCR1A=120;
			TCNT1H=0;
			TCNT1L=0;
			TCCR1B=0x19;
			FreqData.frqField[0]=0;
			FreqData.frqField[1]=0;
			FreqData.frqField[2]=0;
			FreqData.frqField[3]=0;
			FreqData.frqField[4]=0;
			FreqData.frqField[5]=0;
			FreqData.frqField[6]=0;
			break;
		case 1:
			tmp &= ~(1<<AD_SEL_A | 1<<AD_SEL_B);
			tmp |= 1<<AD_SEL_C;
			break;
		case 2:
			tmp &= ~(1<<AD_SEL_A | 1<<AD_SEL_C);
			tmp |= 1<<AD_SEL_B;
			break;
		case 3:
			tmp &= ~(1<<AD_SEL_A);
			tmp |= (1<<AD_SEL_C | 1<<AD_SEL_B);
			break;
		case 4:
			tmp &= ~(1<<AD_SEL_C | 1<<AD_SEL_B);
			tmp |= 1<<AD_SEL_A;
			break;
		case 5:
			tmp &= ~(1<<AD_SEL_B);
			tmp |= (1<<AD_SEL_C | 1<<AD_SEL_A);
			break;
		case 6:
			tmp &= ~(1<<AD_SEL_C);
			tmp |= (1<<AD_SEL_B | 1<<AD_SEL_A);
			break;
		case 7:
			tmp=tmp | (1<<AD_SEL_A | 1<<AD_SEL_B | 1<<AD_SEL_C);
			break;
		case 8:
			SET_BIT(ADCSRA,1);
			tmp=tmp & ~(1<<AD_SEL_A | 1<<AD_SEL_B | 1<<AD_SEL_C);
			step=16;
			break;
	}
	PORT_AD_SEL=tmp;
	ADMUX=64+32+AD_TIME;
	ADCSRA=0x83;
	ADC_ON;
	Delay_Xus(40);
	while(TEST_BIT(ADCSRA,6));
	FreqData.timeField=ADCH;
	if((step-1)&16)
	{
		ADMUX=64+32+AD_FRQ;
		ADC_ON;
		//Delay_Xus(40);
		tmp=(step&15)-1;
		FreqData.latest=tmp;
		while(TEST_BIT(ADCSRA,6));
		FreqData.frqField[tmp]=ADCH;
	}
	if(step==0x17)
	{
		if(Current_Spect!=TimeDisp)
		{
		total=0;

⌨️ 快捷键说明

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