📄 user.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 + -