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

📄 signal_show.c

📁 简易示波器 (采样点在屏上显示虚线曲线)
💻 C
📖 第 1 页 / 共 2 页
字号:
	x=x+8;
	show_num(x,y,CC00S);// s
	x=x+8;
	show_num(x,y,CC0ZZ);// /
	x=x+8;
	showchinese(x,y,CB8F1);//格

//	showchinese(10,140,CC6B5);
//	showchinese(27,140,CC6D7);
}
/***************************************************************
*名称:initall(void)
*描述:初始化液晶屏
*参数:
*返回:
****************************************************************/
void initall(void)
{
	lcd_cs=0;
	turnoff();
	init();
	initram();
	turnon();
	lcd_cs=1;
	DrawFrame();
//	DrawGrid();
}
/***************************************************************
*名称:uchar adc0804(void)
*描述:AD0804采样一次
*参数:
*返回:采样值
****************************************************************/
/*uchar adc0804(void)
{
	uchar idata ad_data ;
	P0=0xff;
	Adc_cs = 0 ;
//	lcd_rd = 1 ;
	lcd_wr = 0 ;
	lcd_wr = 1 ;
	while(Adc_busy) ;
	//lcd_rd = 0 ;
	lcd_a0=0;
	ad_data = P0 ;
	//lcd_rd = 1 ;
	lcd_a0=1;
	Adc_cs = 1 ;
	return ad_data ;
}*/
void clear(unsigned int x,unsigned int y,unsigned char ll)
{
	unsigned int idata address;
	uchar idata addh,addl;
	uchar idata m;
//	x=24;y=0;
	address=0x01f9+x/8+y*AP;
	addh=address>>8;//addh=address/256;
	addl=(uchar)address;//addl=address%256;
	lcd_cs=0;
	lcd_a0=1;
	outcode(0x46);
	lcd_a0=0;
	outdata(addl);
	outdata(addh);
	lcd_a0=1;
	outcode(0x4f);
	outcode(0x42);
	lcd_a0=0;
	for(m=0;m<ll;m++)
	{
		EA=0;
		lcd_a0=0;
		P0=0xff;
		lcd_rd=0;
	//	aaa=busy;
		while(busy==1);		   //aaa=busy
		lcd_rd=1;
		lcd_a0=0;
		EA=1;
		//for(m=0;m<2;m++)
		outdata(0);
	}
	lcd_cs=1;
}
void clear_1(unsigned int x,unsigned int y)
{
	unsigned int idata address;
	uchar idata addh,addl;
	uchar idata n;
//	uchar temp;
//	bit aaa;
//	x=24;y=0;
	address=0x01f9+x/8+y*AP;
	addh=address>>8;//addh=address/256;
	addl=(uchar)address;//addl=address%256;
	lcd_cs=0;
	lcd_a0=1;
	outcode(0x46);
	lcd_a0=0;
	outdata(addl);
	outdata(addh);
	lcd_a0=1;
	outcode(0x4f);
	outcode(0x42);
	lcd_a0=0;
	for(n=0;n<200;n++)
	{
/*		EA=0;
		lcd_a0=0;
		P0=0xff;
		lcd_rd=0;
	//	aaa=busy;
		while(busy==1);		   //aaa=busy
		lcd_rd=1;
		lcd_a0=0;
		EA=1;*/
		//for(m=0;m<2;m++)
		outdata(0);
	}
	lcd_cs=1;
}
/***************************************************************
*名称:Adc_work(void)
*描述:AD0804采样
*参数:
*返回:采样值数组
****************************************************************/
/*void Adc_work(void)	
{
	unsigned int k=0  ;
	unsigned char temp_data1,temp_data2;
	unsigned int x,y;	

	clear(24,0,200);
	x=32;y=35;
	clear(x,y,21);

//	while(!Adc_en) ;
	P0=0xff;
	temp_data1 = adc0804() ;
	WriteD(25,(temp_data1>>1)+35);
	y=y+21;
	clear(x,y,21);
//	while(!Adc_en) ;
	
	for(k=1;k<Sam_N;k++)
	{
//		while(!Adc_en) ;
		P0=0xff;
		temp_data2 = adc0804() ;

		WriteD(k+25,(temp_data2>>1)+35);
		
		if(k%8==0)
		{
			x=x+8;
			y=0;
		}
		else y=y+21;
		test=1;
		clear(x,y,21);
		test=0;
		
//		while(!Adc_en) ;
		temp_data1=temp_data2;
	}
}*/
/***************************************************************
*名称:showsine (void)
*描述:显示采样的结果,采64个点但显示256点
*参数:xr_temp[]显示数组,N_temp数组元素个数,
	   start_add图形开始的x地址,last上次显示最后一个元素
*返回:
****************************************************************/
/*void showsine (uchar xr_temp[],uchar N_temp,uchar start_add,uchar last)
{
	uchar i ;
	WriteD(start_add,xr_temp[1]>>1);
	vector(start_add-1,last>>1,xr_temp[1]>>1);
	for(i=2;i<N_temp;i++)
	{
		WriteD(i-1+start_add,xr_temp[i]>>1);
		vector(i-2+start_add,xr_temp[i-1]>>1,xr_temp[i]>>1);
	}
}*/
void led_display(uchar i)
{
    uchar j,mask;
	mask=0x01;
	for(j=0;j<8;j++){
		LED_CLK=0;
		LED_DAT=( (LED_FONT[i]) & mask);
		mask<<=1;
		LED_CLK=1;   //上升沿移位
	}
}
void refresh_led()
{
	led_display(10);
	led_display(value[0]);
	led_display(value[1]);
	led_display(value[2]);
	led_display(value[3]);
	led_display(value[4]);
}
void init_interrupt()
{ 
	EA=0;
	EX1=1;
	PX1=1;
	IE1=0;
	IT1=1;        //外部中断1为跳变触发方式

	PX0=1;
	EX0=1;
	IE0=0;
	IT0=1;        //外部中断0为跳变触发方式
}
void show_f(unsigned int freq)
{
	unsigned int idata time,temp;
	uchar x,y;
	time = 25000/freq;
	x=10;y=162;
	temp=time/1000;
	show_num(x,y,CC000+(temp<<4));		
	x=x+8;
	temp=(time%1000)/100;
	show_num(x,y,CC000+(temp<<4));
	x=x+8;
	temp=(time%100)/10;
	show_num(x,y,CC000+(temp<<4));
	x=x+8;
	temp=time%10;
	show_num(x,y,CC000+(temp<<4));
}
void main()
{
	unsigned int idata k=0  ;
	unsigned int idata x,y;	
	unsigned char idata value_index;
	unsigned int idata freq,freq_2;
	bit flag_grid=0;

	lcd_a0=1;
	lcd_wr = 1 ;
	initall() ;
	showchin() ;
	refresh_led();
	show_f(5000);
	init_interrupt();

	TMOD = 0x01;// 定时器相关设置
	ET0 = 1;
	TR0 = 1;
		
	k=1;
	num = 0;
	value_index=0;
	Adc_cs = 0 ;
	lcd_wr = 0 ;
	lcd_wr = 1 ;
	Adc_cs = 1 ;
	EX1=1;
	TH0 = dH;
	TL0 = dL;
	ET0=1;
	EA = 1;

	clear_1(8,0);
	clear_1(16,0);
	clear_1(24,0);

	clear_1(32,0);
	x=32;y=25;
	clear(x,y,21);

    while(1)
    {
		if(key_pressed==ON)
       	{  
			EX0=0;
       		switch(key_no)
   			{
   				case key0:
				case key1: 
				case key2: 
				case key3: 
        		case key4: 
        		case key5:
        		case key6:
        		case key7:
        		case key8:
        		case key9:
        			if(value_index<5)
        			{
        				value[value_index]=key_no;
        				value_index++;
        			}
					refresh_led();
        			break;
				case key_enter:
					freq=value[0]*10000+value[1]*1000+value[2]*100+value[3]*10+value[4];
					if(freq>7000)
					{
						freq=7000;
						freq_2=0xff71;
						value[0]=0;
						value[1]=7;
						value[2]=0;
						value[3]=0;
						value[4]=0;
					}
					else if(freq<50)
					{
						freq=50;
						freq_2=0xb1df;
						value[0]=0;
						value[1]=0;
						value[2]=0;
						value[3]=5;
						value[4]=0;
					}
					else freq_2=0xffff-(1000000/freq);
					refresh_led();
					dH=freq_2>>8;
					dL=(uchar)freq_2;
					show_f(freq);
					value_index=0;
					break;
				case key_mod:
					flag_grid=!flag_grid;
					if(flag_grid)DrawGrid();
					else{
						initram_2();
						DrawFrame();
					}
				default :break;
			}
			key_pressed=OFF;
			EX0=1;
		}
		
		if(k<=num)
		{
			lcd_cs=0;
			turnon();			
			WriteD(k+24,(x_data[k]>>1)+40);
		
			if(k%8==0)
			{
				x=x+8;
				y=25;
			}
			else y=y+21;				
			
			clear(x,y,21);
			if(k==127)
			{
				lcd_cs=0;
				turnon();
				clear_1(24,0);
				num = 0;
				Adc_cs = 0 ;
				lcd_wr = 0 ;
				lcd_wr = 1 ;
				Adc_cs = 1 ;
				EX1=1;
				TH0 = dH;
				TL0 = dL;
				ET0=1;
				EA = 1;

				clear_1(8,0);
				clear_1(16,0);
				clear_1(24,0);
				clear_1(32,0);
				clear_1(40,0);

				x=32;y=25;
				clear(x,y,21);
	
				WriteD(24,(x_data[0]>>1)+40);
				y=y+21;
				clear(x,y,21);
				k=0;
			}
			k++;
		}
    }
}

void interrupt_handle() interrupt 2 using 1
{ 	
	uchar idata temp_data;				
    EA=0;                //CPU关中断
	lcd_cs=1;
	if(num!=127)
	{
		Adc_cs = 0 ;
		P0=0xff;
		lcd_a0=0;
	 	temp_data=P0;
		lcd_a0=1;
		Adc_cs = 1 ;
		if(num==0)
		{
			if((temp_data>125)&(temp_data<135))
			{
				x_data[0]=temp_data;
				num++;
			}
			
		}
		else if(num==1)
		{
			if(temp_data<x_data[0])
			{
				x_data[1]=temp_data;
				num++;
			}
			else if((temp_data>125)&(temp_data<135))
			{
				x_data[0]=temp_data;
				num=1;
			}
			else num=0;

		}
		else{
			x_data[num]=temp_data;
	 		num++;
		}
		EX1=1;
	}
	else EX1=0;
	lcd_cs=0;
	EA=1;
                    
}

void timer0(void) interrupt 1 using 1
{
	EA=0;
	lcd_cs=1;
	if(num!=127)
	{
		Adc_cs = 0 ;
		lcd_wr = 0 ;
		lcd_wr = 1 ;
		Adc_cs = 1 ;
		TH0 = dH;
		TL0 = dL;
		ET0 = 1;
	}
	else ET0 = 0;	
	lcd_cs=0;
	EA=1;
}
void wait(void)
{
	unsigned int i;
	for(i=0;i<5000;i++);
}
void interrupt_handle_key() interrupt 0	using 1
{ 						
    EA=0;                //CPU关中断
	lcd_cs=1;
    wait();			//键盘消抖延时
	if (Int_wire==0)
	{
		key_pressed=ON;
		P2=0xFF;
        key_no=P2&0x0F;        //读取P2口的低四位显示数据编码	
    }        
    lcd_cs=0;
    EA=1;                   //CPU开中断
}

⌨️ 快捷键说明

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