📄 main.c
字号:
//=========================================================================================
//作 者:华侨大学 张维纬 叶媲舟 刘灿
//题 目:数控直流恒流源
//备 注:
// 2005年全国大学生电子竞赛
//=========================================================================================
#include "SPCE061V004.H"
#include "lab_parameter.h"
char b0="0",b1="1",b2="2",b3="3",b4="4",b5="5",b6="6",b7="7",b8="8",b9="9",b=".";
char bb ,*p=0;
unsigned int k0=0,u=0,a11=0,a22=0,a33=0,b11=0,b22=0,b33=0;
extern shu; //数
extern kong; //控
extern heng; //恒
extern liu; //流
extern yuan; //源
extern shi; //实
extern ji; //际
extern ce; //测
extern liang; //量
extern yu; //预
extern xian; //先
extern she; //设
extern ding; //定
unsigned int key_value=0,ooo=0,tm0=0,tm1=0,tm2=0,tm3=0,tm[4]={0};
int key=0,i=0,value_h=0,j=0,k=0;
unsigned long int key_in_value=2000,j0=0,binary=0,xx=0;
unsigned int key_in[10]={0},key_i=0;
unsigned int Da_data1=0x7ee0,Da_data2=0x7ee0,Da_data_flag=0,Ad_data=0;
float Ad_data_f=0,Data_f=0,Data_i_f=0;
float n=3.47,Ns=2.7285,Nb=30,R=0.334;//R=0.3157;
//=========================================================================================
//
//=========================================================================================
unsigned int get_key_value(void)
{
SP_Init_IOB(0x0f00,0x0f00,0x0f00); //设置IOA8—IOA11为高电平输出,设置IOA12—IOA15为低电平输入
for(i=0;i<3;i++) //在时钟频率为49M时,延时1us使IO口能反应过来
*P_Watchdog_Clear = 1;
if(*P_IOB_Data & 0xf000 ) //如果有键值
{
for(i=0;i<0x3c00;i++) //在时钟频率为49M时,延时15ms去抖
*P_Watchdog_Clear = 1;
if(*P_IOB_Data & 0xf000) //如果真有键值
{
value_h = *P_IOB_Data & 0xf000 ;
SP_Init_IOB(0xf000,0xf000,0xf000); //设置IOA8—IOA11为低电平输入,设置置IOA12—IOA15为高电平输出
for(i=0;i<3;i++) //在时钟频率为49M时,延时1us使IO口能反应过来
*P_Watchdog_Clear = 1;
key = *P_IOB_Data & 0x0f00 ;
key = value_h | key;
while( *P_IOB_Data & 0x0f00)
*P_Watchdog_Clear = 1; //等待弹起
return key;
}
return 0x0000;
}
return 0x0000;
*P_Watchdog_Clear = 1;
}
//=========================================================================================
//
//=========================================================================================
void key_scan(void)
{
ooo = get_key_value();
switch( ooo )
{
case 0x8100: key_value = 0;//0
key_in[key_i] = key_value;
key_i += 1;
break;
case 0x4100: key_value = 1;//1
key_in[key_i] = key_value;
key_i += 1;
break;
case 0x2100: key_value = 2;//2
key_in[key_i] = key_value;
key_i += 1;
break;
case 0x1100: key_value = 3;//3
key_in[key_i] = key_value;
key_i += 1;
break;
case 0x8200: key_value = 4;//4
key_in[key_i] = key_value;
key_i += 1;
break;
case 0x4200: key_value = 5;//5
key_in[key_i] = key_value;
key_i += 1;
break;
case 0x2200: key_value = 6;//6
key_in[key_i] = key_value;
key_i += 1;
break;
case 0x1200: key_value = 7;//7
key_in[key_i] = key_value;
key_i += 1;
break;
case 0x8400: key_value = 8;//8
key_in[key_i] = key_value;
key_i += 1;
break;
case 0x4400: key_value = 9;//9
key_in[key_i] = key_value;
key_i += 1;
break;
case 0x2400: key_value = 10;//10 输入数值确认功能键
key_in_value=0;
for(j=0,j0=1;j<key_i;j++,j0*=10)
key_in_value += key_in[key_i-j-1]*j0;
Da_data1 = 32.283*key_in_value; //0xffc0/2160=30.283
Da_data2 = 32.283*key_in_value;
key_i = 0;
break;
case 0x1400: key_value = 11;//11
break;
case 0x8800: key_value = 12;//12 步进 "+"
if(Da_data_flag)
{
if(Da_data1<0xffc0) //0xfd40=0xffc0-64*10
{
Da_data1 += 64;
key_in_value +=1;
}
Da_data_flag = 0;
}
else
{
if(Da_data2<0xffc0) //0xfd40=0xffc0-64*10
{
Da_data2 += 64; //第七位加1步进1mv;临时乘10方便调试步进10mv
key_in_value +=1;
}
Da_data_flag = 1;
}
break;
case 0x4800: key_value = 13;//13 步进 "-"
if(Da_data_flag)
{
if(Da_data1>0x0280)
{
Da_data1 -= 64;
key_in_value -=1;
}
Da_data_flag = 0;
}
else
{
if(Da_data2>0x0280)
{
Da_data2 -= 64; //第七位加1步进1mv;临时乘10方便调试步进10mv
key_in_value -=1;
}
Da_data_flag = 1;
}
break;
case 0x2800: key_value = 14;//14
if(Da_data_flag)
{
if(Da_data1<0xffc0) //0xfd40=0xffc0-64*10
{
Da_data1 += 64*10;
key_in_value +=10;
}
Da_data_flag = 0;
}
else
{
if(Da_data2<0xffc0) //0xfd40=0xffc0-64*10
{
Da_data2 += 64*10; //第七位加1步进1mv;临时乘10方便调试步进10mv
key_in_value +=10;
}
Da_data_flag = 1;
}
break;
case 0x1800: key_value = 15;//15
if(Da_data_flag)
{
if(Da_data1>0x0280)
{
Da_data1 -= 64*10;
key_in_value -=10;
}
Da_data_flag = 0;
}
else
{
if(Da_data2>0x0280)
{
Da_data2 -= 64*10; //第七位加1步进1mv;临时乘10方便调试步进10mv
key_in_value -=10;
}
Da_data_flag = 1;
}
break;
default:
break;
}
}
//=========================================================================================
//
//=========================================================================================
void LCD_ini(void)
{
Init_sys();
FG_InitGraphic();
FG_ClearScreen(0);
FG_SetBMPMode(DG_BMP_COVER); //设置位图模式 函数定义在Splc501sys.asm
FG_PutBitmap(&shu,127-24,48); //显示汉字 函数定义在Splc501sys.asm
FG_PutBitmap(&kong,127-24-16,48); //显示汉字 函数定义在Splc501sys.asm
FG_PutBitmap(&heng,127-24-16*2,48);
Clear_Watch_Dog();
FG_PutBitmap(&liu,127-24-16*3,48);
FG_PutBitmap(&yuan,127-24-16*4,48);
FG_PutStr("--HuaQiao university",0,105,20);
for(j=0;j<=30;j++) //延时
for(i=0;i<0xffff;i++)
Clear_Watch_Dog();
//FG_ClearScreen(0);
//FG_PutStr(".",0,128-x,y);
}
//=========================================================================================
//
//=========================================================================================
void fenli(void)
{
tm3=(binary/1000)%10;
tm2=(binary/100)%10;
tm1=(binary/10)%10;
tm0=binary%10;
tm[0]=tm0;
tm[1]=tm1;
tm[2]=tm2;
tm[3]=tm3;
}
//=========================================================================================
//
//=========================================================================================
void show(void)
{
FG_ClearScreen(0);
FG_PutBitmap(&yu,127,64);
FG_PutBitmap(&xian,127-16,64);
FG_PutBitmap(&she,127-16*2,64);
FG_PutBitmap(&ding,127-16*3,64);
FG_PutStr(":",3,127-16*4,60);
for(i=0;i<4;i++)
{
bb=*(&b0 + tm[i]);
FG_PutStr(bb,3,(i+1)*10+27,45);
}
FG_PutStr("mA",3,25,45);
}
//=========================================================================================
//
//=========================================================================================
show1()
{
FG_PutBitmap(&shi,127,32);
FG_PutBitmap(&ji,127-16,32);
FG_PutBitmap(&ce,127-16*2,32);
FG_PutBitmap(&liang,127-16*3,32);
FG_PutStr(":",3,127-16*4,28);
for(i=0;i<4;i++)
{
bb=*(&b0 + tm[i]);
FG_PutStr(bb,3,(i+1)*10+27,13);
}
FG_PutStr("mA",3,25,13);
//for(i=0;i<0xffff;i++)
Clear_Watch_Dog();
}
//=========================================================================================
//主函数
//=========================================================================================
main()
{
*P_SystemClock = C_Fosc + C_32K_Work + C_StrongMode + C_Fosc_49M;
LCD_ini();
*P_IOA_Dir = 0xfff0;
*P_IOA_Attrib = 0xfff0;
*P_IOA_Data = 0x0000;
*P_IOB_Dir = 0xffff;
*P_IOB_Attrib = 0xffff;
*P_IOB_Data = 0x0000;
*P_DAC_Ctrl = C_DA1_Direct;
*P_ADC_Ctrl = 1;
*P_ADC_MUX_Ctrl = 1;
Ad_data = *P_ADC_LINEIN_Data;
///////////////////
while(1)
{
key_scan();
*P_IOA_Dir = 0xfff0;
*P_IOA_Attrib = 0xfff0;
*P_IOA_Data = 0x0000;
*P_IOB_Dir = 0xffff;
*P_IOB_Attrib = 0xffff;
*P_IOB_Data = 0x0000;
/////////////////////
//Da_data1 = 32.283*key_in_value;
//Da_data2 = 32.283*key_in_value;
//////////////////////////////////////////////
if(Data_i_f*1000 < key_in_value-3)
{
Da_data1 += 64;
Da_data2 += 64;
}
if(Data_i_f*1000 > key_in_value+3)
{
Da_data1 -= 64;
Da_data2 -= 64;
}
*P_DAC1 = Da_data1;
*P_DAC2 = Da_data2;
///////////////////////////////////////////////
/////////////////////
while(!(*P_ADC_MUX_Ctrl&0x8000))
*P_Watchdog_Clear = 1;
Ad_data = *P_ADC_LINEIN_Data;
Ad_data_f = (float)Ad_data/0xffc0*3.472;
////////////////////////////////////////
Data_f = Ad_data_f / n;
Data_i_f = Data_f / R;
if(Data_i_f < 1)
Data_i_f = Data_f / R;
/////////////////////////////////////////
if(xx==2500)
{
binary = key_in_value;
fenli();
show();
binary = Data_i_f*1000;
fenli();
show1();
*P_IOA_Dir = 0xfff0;
*P_IOA_Attrib = 0xfff0;
*P_IOA_Data = 0x0000;
*P_IOB_Dir = 0xffff;
*P_IOB_Attrib = 0xffff;
*P_IOB_Data = 0x0000;
xx = 0;
}
xx += 1;
/////////////////////
*P_Watchdog_Clear = 1;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -