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

📄 user.c

📁 这里有很多我自己做的凌阳单片机源程序
💻 C
字号:
//用户接口函数文件
#include<spce061a_chf.h>
#include"zhonghe.h"
#include"bit.h"
unsigned char pin_lv[]="f=1438Hz";//要显示的频率
unsigned int fu_du[]="v=6.0";
extern uiData_DA;
extern sin_flag;
extern san_flag;
///////////////////////////////////////////
//函数:void AD_done(void)
//描述: AD采集处理和显示函数
//参数:无
//返回:无
/////////////////////////////////////////////
void AD_done(void)
{	
	float fvoltage_data2=0.0;
	unsigned int i;		
	for(i=0;i<100;i++)
	{
		fvoltage_data2+=AD_tranfer();
	}
	fvoltage_data2=fvoltage_data2/100;	
	v_data_to(fvoltage_data2);//将浮点数转成字符串	
	
}
///////////////////////////////////////////
//函数:float AD_tranfer(void)
//描述:进行AD采集,并将结果处理成浮点数
//参数:无
//返回:返回采集到的电压
/////////////////////////////////////////////	
float AD_tranfer(void)
{
	
	float fvoltage=0.0;
	unsigned int AD_value_to;
	if(Line_selet(0x0003)>0xe880)
	{
		AD_value_to=Line_selet(0x0002);
		if((AD_value_to>0xaa80)&(AD_value_to<0xbb8c))//大于2V
		{
			AD_value_to+=30;
		}
		else if((AD_value_to>0x5540)&(AD_value_to<0xaa80))
		{
			AD_value_to+=1128;
		}
		else if((AD_value_to<0xeff0)&(AD_value_to>0xbb8c))
		{
			AD_value_to-=700;
		}
		else if(AD_value_to>0xeff0)
		{
			AD_value_to+=14000;
		}
		fvoltage=(float)AD_value_to/0xffc0*3.3;
		AD_value_to=Line_selet(0x0001);
		fvoltage+=(float)AD_value_to/0xffc0*3.3;
	}
	else
	{	
		AD_value_to=Line_selet(0x0003);
		if((AD_value_to>0x5540)&(AD_value_to<0xaa80))
		{
			AD_value_to+=684;
		}
		else if(AD_value_to>0xaa80)
		{
			AD_value_to+=800;
		}
		else if((AD_value_to>0x3f)&(AD_value_to<0x5540))
		{
			AD_value_to+=3861;
		}
		fvoltage=(float)AD_value_to/0xffc0*3.3;
	}
	return(fvoltage);
}
///////////////////////////////////////////
//函数:unsigned int Line_selet(unsigned int Line_num)
//描述:对Line_num通道的电压进行采集
//参数:Line_num为相应的通道
//返回:返回采集的电压的数字量
/////////////////////////////////////////////
unsigned int Line_selet(unsigned int Line_num)
{
	unsigned long int uiData_AD,i;
	Set_ADC_MUX_Ctrl(Line_num);//选择通道1(IOA0)
	Set_ADC_Ctrl(0x0001);//允许AD转换
	uiData_AD=Get_ADC_LineIn_Data();//通过读取P_ADC_LINEIN_Data积存器的值启动AD转换
	uiData_AD=0;
	for(i=0;i<16;i++)
	{
		*P_Watchdog_Clear=0x01;
		uiData_AD+=AD();
	}
	uiData_AD>>=4;	
	return(uiData_AD);
}
//////////////////////////////////////////////////
//函数:void v_data_to(float v_float)
//描述:将float型的数字转成字符串并显示
//参数:v_float--要转换的电压值
//返回:无	
///////////////////////////////////////////////////
void v_data_to(float v_float)
{	
	unsigned int AD_value;	
	unsigned char v_data2[]="V=0.000V";
	AD_value=(unsigned int)(v_float*1000);	
	v_data2[2]=AD_value/1000+48;		
	v_data2[3]='.';
	v_data2[4]=(AD_value%1000)/100+48;
	v_data2[5]=(AD_value%100)/10+48;		
	v_data2[6]=AD_value%10+48;
	init_IO_lcd();
	lcd_init();		
	lcd_display(v_data2,sizeof(v_data2),0);
	*P_Watchdog_Clear=0x01;	
}
//////////////////////////////////////////////////
//函数:void lcd_display(unsigned char *value,unsigned int length,unsigned int addr)
//描述:将要显示的字符串进行显示
//参数:*value--字符串地址;length--字符串的长度
//返回:无	
///////////////////////////////////////////////////
void lcd_display(unsigned char *value,unsigned int length,unsigned int addr)
{
	unsigned int i;		
	addr=0x80+addr;
	write_command(addr);	
 	for(i=0;i<length-1;i++)
	{
		write_data(value[i]);
	}
}
//////////////////////////////////////////////////
//函数:void init_IO_lcd(void)
//描述:初始化LCD使用的IO口
//参数:无
//返回:无	
///////////////////////////////////////////////////
void init_IO_lcd()
{
	PB_Dir->byte.byteh=0x00;
	PB_Attrib->byte.byteh=0xff;
	PB->byte.byteh=0xff;
	PB_Dir->bit.bit5=1;
	PB_Dir->bit.bit6=1;
	PB_Dir->bit.bit7=1;
	
	PB_Attrib->bit.bit5=1;
	PB_Attrib->bit.bit6=1;
	PB_Attrib->bit.bit7=1;
	P1_5=0;
	P1_6=0;
	P1_7=0;
}
//////////////////////////////////////////////////
//函数:void lcd_init(void)
//描述:初始化LCD显示设置
//参数:无
//返回:无	
///////////////////////////////////////////////////
void lcd_init(void)
{		
	write_command(0x38);//显示模式的设置		
	write_command(0x08);//显示关闭*/		
	write_command(0x0c);//整体显示,关光标,不闪烁
	write_command(0x06);//显示光标移动设置
	write_command(0x01);	//显示清屏
}
///////////////////////////////////////////
//函数:unsigned int get_keyvalue(void)
//描述:读取键值函数
//参数:无
//返回:返回键值
/////////////////////////////////////////////
unsigned int get_keyvalue(void)
{
	unsigned int keyhang[4]={0x01,0x02,0x04,0x08};//行扫描码	
	unsigned int keyi=0;
	for(keyi=0;keyi<4;keyi++)
	{		
		PA->byte.byteh=keyhang[keyi];
		if(P0_12==1)
		{
			while(P0_12==1)
			{
				*P_Watchdog_Clear=0x01;
			}
			return(keyi*4);
		}
		else if(P0_13==1)
		{
			while(P0_13==1)
			{
				*P_Watchdog_Clear=0x01;
			}
			return(keyi*4+1);
		}
		else if(P0_14==1)
		{
			while(P0_14==1)
			{
				*P_Watchdog_Clear=0x01;
			}
			return(keyi*4+2);
		}
		else if(P0_15==1)
		{
			while(P0_15==1)
			{
				*P_Watchdog_Clear=0x01;
			}
			return(keyi*4+3);
		}		
	}	
	return 16;//返回16则说明按键错误	
}
///////////////////////////////////////////
//函数:unsigned int key_scan_delay(void)
//描述:加消抖的键盘扫描函数
//参数:无
//返回:返回1--有键按下,否则没有键按下
/////////////////////////////////////////////
unsigned int key_scan_delay(void)
{	
	init_IO_key();	
	if(PA->byte.byteh==0x0f)
	{
		return 0;
	}
	else
	{
		delay();
		if(PA->byte.byteh==0x0f)
		{
			return 0;
		}
		else
		{
			return 1;
		}	
	}
}
///////////////////////////////////////////
//函数:void do_key(void)
//描述:由EXIT2中断进入的键盘处理函数
//参数:无
//返回:无
/////////////////////////////////////////////
void do_key(void)
{
	unsigned int key_value=0;
	unsigned int key_f=0;
	while((key_f==0)|(key_value==16))
	{
		key_f=0;
		key_f=key_scan_delay();
		*P_Watchdog_Clear=0x01;
		key_value=get_keyvalue();
	}	
	switch(key_value)
	{
		case pinlv:P0_7=1;pinlv_do();break;
		case fudu:P0_7=1;fudu_do();break;
		case sin:P0_7=1;sin_flag^=0xffff;sin_1();break;
		case san:P0_7=1;san_flag^=0xffff;san_1();break;
		default:do_key();break;//若不是设置上面两个键则,等待
	}	
	init_IO_lcd();
	lcd_init();		
	lcd_display(pin_lv,sizeof(pin_lv),0);//分两行显示,一行显示频率,一行显示幅度
	lcd_display(fu_du,sizeof(fu_du),0x40);
}
///////////////////////////////////////////
//函数:void pinlv_do(void)
//描述:频率设置函数
//参数:无
//返回:无
/////////////////////////////////////////////
void pinlv_do(void)
{
	unsigned int count_i=2;
	unsigned int key_temp1=0;
	unsigned int key_f1=0;	
	unsigned int pin_value=0;//设置的频率值
	unsigned int f_Timer=32768;//开始的计数频率	
	while(count_i<6)
	{
		while((key_f1==0)|(key_temp1==16))
		{
			key_f1=key_scan_delay();
			*P_Watchdog_Clear=0x01;
			key_temp1=get_keyvalue();			
		}	
		key_f1=0;	
		pin_lv[count_i]=key_temp1+48;
		if(count_i==2)
		{
			P0_3=1;
			pin_value+=key_temp1*1000;
		}
		else if(count_i==3)
		{
			P0_4=1;
			pin_value+=key_temp1*100;
		}
		else if(count_i==4)
		{
			P0_5=1;
			pin_value+=key_temp1*10;
		}
		else
		{
			P0_6=1;
			pin_value+=key_temp1;
		}
		key_temp1=0;
		count_i++;
	}
	key_temp1=0;
	P0_7=0;
	while(key_temp1!=15)
	{
		key_f1=0;
		while(key_f1==0)
		{
			key_f1=key_scan_delay();
			*P_Watchdog_Clear=0x01;
		}
		key_temp1=get_keyvalue();
	}
	P0_7=1;//按下确认键后指示	
	f_Timer=0xffff-32768/(2*pin_value)+425;	
	*P_TimerA_Data=f_Timer;
}
///////////////////////////////////////////
//函数:void fudu_do(void)
//描述:幅度设置函数
//参数:无
//返回:无
/////////////////////////////////////////////
void fudu_do(void)
{	
	unsigned int key_temp2=0;
	unsigned long int ks=0;
	float fudu_value=0.0;//保存键入的幅度
	unsigned int count_j=2;
	unsigned int key_f2=0;
	while(count_j<5)
	{
		while((key_f2==0)|(key_temp2==16))
		{
			key_f2=key_scan_delay();
			*P_Watchdog_Clear=0x01;
			key_temp2=get_keyvalue();
		}
		key_f2=0;		
		fu_du[count_j]=key_temp2+48;
		if(count_j==2)
		{
			P0_3=1;
			fudu_value=(float)key_temp2;
		}
		else if(count_j==4)
		{
			P0_5=1;
			fudu_value+=(float)key_temp2*0.1;
		}
		else
		{
			P0_4=1;
			fu_du[3]='.';
		}
		key_temp2=0;
		count_j++;		
	}	
	key_temp2=0;
	key_f2=0;
	P0_7=0;
	while((key_temp2!=15)|(key_f2==0))
	{
		while(key_f2==0)
		{
			key_f2=0;
			key_f2=key_scan_delay();
			*P_Watchdog_Clear=0x01;
		}
		key_temp2=get_keyvalue();
	}
	P0_7=1;
	ks=(unsigned long int)fudu_value*0xffc0;
	uiData_DA=ks/6;	
}
///////////////////////////////////////////
//函数:void delay(void)
//描述:延时函数
//参数:无
//返回:无
/////////////////////////////////////////////
void delay(void)
{
	unsigned int timer_i=500;
	while(timer_i--);
}
///////////////////////////////////////////
//函数:void sin_1(void)
//描述:正弦波切换函数
//参数:无
//返回:无
/////////////////////////////////////////////
void sin_1(void)
{
	if(sin_flag)
	{		
		*P_INT_Ctrl=0x0600;
	}
	else
	{		
		*P_INT_Ctrl=0x1200;
	}
}	
///////////////////////////////////////////
//函数:void san_1(void)
//描述:三角切换函数
//参数:无
//返回:无
/////////////////////////////////////////////
void san_1(void)
{
	if(san_flag)
	{		
		*P_INT_Ctrl=0x0600;
	}
	else
	{		
		*P_INT_Ctrl=0x1200;
	}
}
///////////////////////////////////////////
//函数:void init_sysytem(void)
//描述:系统的初始化和指示灯的IO口的初始化
//参数:无
//返回:无
/////////////////////////////////////////////
void init_system(void)
{
	PA_Dir->bit.bit0=0;
	PA_Attrib->bit.bit0=0;
	PA_Buffer->bit.bit0=0;
	PA_Dir->bit.bit1=0;
	PA_Attrib->bit.bit1=0;
	PA_Buffer->bit.bit1=0;
	PA_Dir->bit.bit2=0;
	PA_Attrib->bit.bit2=0;
	PA_Buffer->bit.bit2=0;	
	PA_Dir->bit.bit3=1;
	PA_Attrib->bit.bit3=1;
	PA_Buffer->bit.bit3=0;
	PA_Dir->bit.bit4=1;
	PA_Attrib->bit.bit4=1;
	PA_Buffer->bit.bit4=0;
	PA_Dir->bit.bit5=1;
	PA_Attrib->bit.bit5=1;
	PA_Buffer->bit.bit5=0;	
	PA_Dir->bit.bit6=1;
	PA_Attrib->bit.bit6=1;
	PA_Buffer->bit.bit6=0;
	PA_Dir->bit.bit7=1;
	PA_Attrib->bit.bit7=1;
	PA_Buffer->bit.bit7=0;
	
	PB_Dir->bit.bit2=0;
	PB_Attrib->bit.bit2=0;
	PB_Buffer->bit.bit2=0;
	PB_Dir->bit.bit3=0;
	PB_Attrib->bit.bit3=0;
	PB_Buffer->bit.bit3=0;
	
	*P_SystemClock=0x0013;
	*P_TimerA_Ctrl=0x0032;//A--32768;B--1	
	*P_TimerA_Data=0xfff5;
	*P_TimerB_Ctrl=0x0031;//A--32768;B--1	
	*P_TimerB_Data=0xfffe;
	*P_DAC_Ctrl=0x0000;		
	*P_INT_Ctrl=0x0300;
	asm("irq on");	
}
///////////////////////////////////////////
//函数:void init_sysytem(void)
//描述:键盘指示灯的IO口的初始化
//参数:无
//返回:无
/////////////////////////////////////////////
void init_IO_key(void)
{	
	PA_Dir->bit.bit8=1;
	PA_Attrib->bit.bit8=1;
	PA_Buffer->bit.bit8=0;
	PA_Dir->bit.bit9=1;
	PA_Attrib->bit.bit9=1;
	PA_Buffer->bit.bit9=0;
	PA_Dir->bit.bit10=1;
	PA_Attrib->bit.bit10=1;
	PA_Buffer->bit.bit10=0;
	PA_Dir->bit.bit11=1;
	PA_Attrib->bit.bit11=1;
	PA_Buffer->bit.bit11=0;
	PA_Dir->bit.bit12=0;
	PA_Attrib->bit.bit12=0;
	PA_Buffer->bit.bit12=0;
	PA_Dir->bit.bit13=0;
	PA_Attrib->bit.bit13=0;
	PA_Buffer->bit.bit13=0;
	PA_Dir->bit.bit14=0;
	PA_Attrib->bit.bit14=0;
	PA_Buffer->bit.bit14=0;
	PA_Dir->bit.bit15=0;
	PA_Attrib->bit.bit15=0;
	PA_Buffer->bit.bit15=0;	
}	

⌨️ 快捷键说明

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