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

📄 user.c

📁 这里有很多我自己做的凌阳单片机源程序
💻 C
字号:
#include<spce061a_chf.h>
#include"bit.h"
#include"renwu2.h"
unsigned char pin_lv[]="f=0000Hz";//要显示的频率
unsigned int fu_du[]="v=000";
extern uiData;
extern sin_flag;
extern san_flag;
//键盘接口初始化函数
void init_keyIO(void)
{	
	Set_IOA_Dir(0xff0f);
	Set_IOA_Attrib(0xff0f);
	Set_IOA_Data(0x000f);
}
//键盘取值函数
unsigned int get_keyvalue(void)
{
	unsigned int keyhang[4]={0x01,0x02,0x04,0x08};//行扫描码	
	unsigned int keyi=0;
	for(keyi=0;keyi<4;keyi++)
	{		
		PA_Buffer->byte.bytel=keyhang[keyi];
		if(P0_4==1)
		{
			while(P0_4==1)
			{
				*P_Watchdog_Clear=0x01;
			}
			return(keyi*4);
		}
		else if(P0_5==1)
		{
			while(P0_5==1)
			{
				*P_Watchdog_Clear=0x01;
			}
			return(keyi*4+1);
		}
		else if(P0_6==1)
		{
			while(P0_6==1)
			{
				*P_Watchdog_Clear=0x01;
			}
			return(keyi*4+2);
		}
		else if(P0_7==1)
		{
			while(P0_7==1)
			{
				*P_Watchdog_Clear=0x01;
			}
			return(keyi*4+3);
		}		
	}	
	return 16;//返回16则说明按键错误	
}
//加按键消抖的键盘扫描函数
unsigned int key_scan_delay(void)
{	
	PA_Dir->byte.bytel=0x0f;
	PA_Attrib->byte.bytel=0x0f;
	PA_Buffer->byte.bytel=0x0f;
	if(PA->byte.bytel==0x0f)
	{
		return 0;
	}
	else
	{
		delay();
		if(PA->byte.bytel==0x0f)
		{
			return 0;
		}
		else
		{
			return 1;
		}	
	}
}	

//////////////////////////////////////////
//函数:void init_system(void)
//描述:定时器初始化函数
//参数:无
//返回:无
//////////////////////////////////////////	
void init_sys(void)
{	
	init_keyIO();
	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=0x1200;
	asm("irq on");	
}
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_13=1;pinlv_do();break;
		case fudu:P0_14=1;fudu_do();break;
		case sin:P0_12=1;sin_flag^=0xffff;sin_1();break;
		case san:P0_8=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)
{
	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_8=1;
			pin_value+=key_temp1*1000;
		}
		else if(count_i==3)
		{
			P0_9=1;
			pin_value+=key_temp1*100;
		}
		else if(count_i==4)
		{
			P0_10=1;
			pin_value+=key_temp1*10;
		}
		else
		{
			P0_11=1;
			pin_value+=key_temp1;
		}
		key_temp1=0;
		count_i++;
	}
	key_temp1=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_15=1;//按下确认键后指示	
	f_Timer=0xffff-32768/(2*pin_value);	
	*P_TimerA_Data=f_Timer;
}
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_8=1;
			fudu_value=(float)key_temp2;
		}
		else if(count_j==4)
		{
			P0_10=1;
			fudu_value+=(float)key_temp2*0.1;
		}
		else
		{
			P0_9=1;
			fu_du[3]='.';
		}
		key_temp2=0;
		count_j++;		
	}	
	key_temp2=0;
	key_f2=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_15=1;
	ks=(unsigned long int)fudu_value*0xffc0;
	uiData=ks/6;	
}
void delay(void)
{
	unsigned int timer_i=500;
	while(timer_i--);
}
void sin_1(void)
{
	if(sin_flag)
	{
		//san_flag^=0xffff;		
		*P_INT_Ctrl=0x0600;
	}
	else
	{		
		*P_INT_Ctrl=0x1200;
	}
}	
void san_1(void)
{
	if(san_flag)
	{
		//sin_flag^=0xffff;	
		*P_INT_Ctrl=0x0600;
	}
	else
	{		
		*P_INT_Ctrl=0x1200;
	}
}

⌨️ 快捷键说明

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