📄 main0601.c
字号:
port0=0x00;
x2=port5;
while ((x2&0x0f)!=0x0f)
{
x2=port5;
port0=0x00;
}
for(i=0;i<7500;i++);
x2=port5;
while ((x2&0x0f)!=0x0f)
{
x2=port5;
port0=0x00;
}
switch(key_NO)
{
case 1 :
case 2 :
case 3 :
case 4 :
case 5 :
case 6 :
case 7 :
case 8 :
case 9 :
case 10 : if (input_state==FALSE) /* deal with data keyboard */
break;
if (dot_state)
input_dotbit--;
input_value=input_value*10+key_NO-1;
inputdata_num++;
break;
case 11 : if (input_state==FALSE) /* deal with radix point keyboard */
break;
if (dot_state)
break;
if (inputdata_num!=0)
{
input_dotbit=3;
dot_state=TRUE;
break;
}
case 12 : if (input_state==FALSE) /* deal with data keyboard */
break;
if (sign_state) /* deal with sign keyboard */
sign_state=FALSE;
else
{
sign_state=TRUE;
position=0;
CAP_A=CAP_B=CAP_C=0;
CAP2_flag=FALSE;
CAP3_flag=FALSE;
run_state=1;
PBDATDIR=0x0702;
}
break;
case 13 : init_SRM();
/*input_value=360;*/
PBDATDIR = 0x0701; /* outputs IOPA0–IOPA2, IOPA0 set high */
input_state=TRUE;
break;
case 14 : display_order++;
if (display_order==4)
display_order=1;
break;
case 15 :
run_state=1;
drive_SRM();
break;
case 16 :
run_state=0;
PBDATDIR = 0x0703; /* outputs IOPA0–IOPA2, IOPA0 set high */
break;
default : break;
}
}
}
/*************************************/
/* ISR for A/D and keyboard interrupt */
void c_int6()
{
unsigned int ADCfifo_data,adc1data,channel;
int ADCfifo_status;
/*PCDATDIR=0x0700; */
IFR=0x0020;
/*do {
/* ADCfifo_data= ADCFIFO1; /* read value */
/* ADCfifo_status = ADCTRL2 & 0x0c0; /* read status register, mask bits */
/* }
while (ADCfifo_status != 0); */
ADCfifo_data= ADCFIFO1;
adc1data= ADCFIFO1;
if (adc1data!=0)
ADCfifo_data=adc1data;
channel=ADCTRL1 & 0x0e;
switch(channel)
{
case 6: if (ADCfifo_data>=IB_max)
PADATDIR=PADATDIR & 0x070d;
else if (ADCfifo_data<=IB_min)
PADATDIR=PADATDIR | 0x02;
ADCTRL1=0xc908;
ADCTRL1=0xca09;
break;
case 8:
if (ADCfifo_data>=IC_max)
PADATDIR=PADATDIR & 0x070b;
else if (ADCfifo_data<=IC_min)
PADATDIR=PADATDIR | 0x04;
ADCTRL1=0xc904;
ADCTRL1=0xca05;
break;
default:
case 4: if (ADCfifo_data>=IA_max)
PADATDIR=PADATDIR & 0x070e;
else if (ADCfifo_data<=IA_min)
PADATDIR=PADATDIR | 0x01;
ADCTRL1=0xc906;
ADCTRL1=0xca07;
break;
}
/*ADC_channel++;
if (ADC_channel>4)
ADC_channel=2;
ADCTRL1=0xca00 + (ADC_channel<<1);
ADCTRL1=ADCTRL1 | 1; */
/*PCDATDIR=0x0701; */
}
void SCI_init()
{SCICCR=0x0017; /* 1 stop bit,no odd check,8 data bits,
asynchronism mode,idle line */
SCICTL1=0x0013; /* inner clock,enable recive and transmit,disable
receive erro int ,sleep and woke */
SCICTL2=0x0002; /* enable recive int and disable transmit int */
SCIHBAUD=0x0000;
SCILBAUD=0x002a; /* Baud rate=28800 kbps */
SCIPC2=0x0022; /* enable recive port and transmit port */
SCICTL1=0x0033; /* let SCI return from reset state */
/*SCIPRI=0x0020; /* RX int is low-priority int */
SCIPRI=0x0000;
}
/* transmit data */
void mit()
{int x3,TXRDY;
x3=SCICTL2;
for (;x3&0x0080==0;);
if (x3&0x0080)
{TXRDY=1; /* ready to receive next data to be transmited */
SCITXBUF=TX_data; /* transmit next data */
}
}
/* receive int and ISR */
void receive_ISR()
{ unsigned int i,h ;
switch (RX_data ) /* recive data is call code */
{ case 'H' :
for(;(SCICTL2 & 0x80)==0;);
TX_data ='A'; /* send back answer code */
mit() ;
break;
case 'Q': /* receive start_command code */
run_state=1;
drive_SRM();
break ;
case 'T': /* recive stop_command code */
/* stop SRM */
run_state=0;
/*IMRC = 0x0; disable CAP_int */
PBDATDIR = 0x0703; /* outputs IOPA0–IOPA2, IOPA0 set high */
break;
case 'F':
if (input_state==FALSE) /* deal with data keyboard */
break;
if (sign_state) /* deal with sign keyboard */
sign_state=FALSE;
else
{
sign_state=TRUE;
position=0;
CAP_A=CAP_B=CAP_C=0;
CAP2_flag=FALSE;
CAP3_flag=FALSE;
run_state=1;
PBDATDIR=0x0702;
}
break;
case 'G':
init_SRM();
/*input_value=360;*/
PBDATDIR = 0x0701; /* outputs IOPA0–IOPA2, IOPA0 set high */
input_state=TRUE;
break;
case 'R': /* recive require_resend code */
TX_data ='N';
mit() ;
TX_data ='';
mit() ;
break;
default:
TX_data ='N';
mit() ;
TX_data ='';
mit() ;
break;
}
}
/**************************************/
/* display data on LCD */
void display(display_value,dot_bit)
unsigned long display_value; /* the value want to be displayed */
int dot_bit; /* dot bit */
{
unsigned long bit_value[4];
unsigned int x,port1_value;
port1_value=0;
if (display_value>=2000)
port1_value=port1_value|0x40;
bit_value[3]=display_value%10; /* the lowest bit data */
bit_value[2]=(display_value/10)%10;
bit_value[1]=(display_value/100)%10;
bit_value[0]=display_value/1000; /* the highest bit data */
if (bit_value[0]==1)
port1_value=port1_value|0x02;
if (sign_state)
port1_value=port1_value|0x01;
x=dot_bit;
if ((x>=1)&&(x<=3))
port1_value=port1_value|(1<<(x+1)); /* show radix point */
port1=port1_value;
if ((dot_bit!=1)&&(dot_bit!=2)&&(bit_value[0]==0)&&(bit_value[1]==0))
port2=0x0f;
else
port2=bit_value[1];
if (((dot_bit==3)&&(bit_value[1]==0)&&(bit_value[0]==0))||((dot_bit==4)&&(bit_value[0]==0)&&(bit_value[1]==0)&&(bit_value[2]==0)))
port3=0x0f;
else
port3=bit_value[2];
port4=bit_value[3];
}
/* refresh LCD */
void LCD_refresh()
{
unsigned long velocity;
int i;
struct CAP_INT * p1;
unsigned long delta_count;
if (display_times>=1000)
{
display_times=0;
switch (display_order)
{
case 1: /* read velocity */
delta_count=0;
p1=CAP_p;
for(i=1;i<=6;i++)
{
delta_count=delta_count+p1->delta_count;
p1=p1->next;
}
if (delta_count==0)
velocity=0;
else
velocity=VELOCITY_CONST*60/delta_count;
velocity_value=(unsigned int)velocity;
velocity_dotbit=4;
display(velocity_value,velocity_dotbit);
break;
case 2: /* read position */
position=800;
position_value=position;
if (position_value%10)
{
position_value=position;
position_dotbit=3;
if (position_value>2000)
{
position_value=position/10;
position_dotbit=4;
}
}
else
{
position_value=position;
position_dotbit=4;
}
display(position_value,position_dotbit); break;
case 3: display(input_value,input_dotbit); break;
default: break;
}
}
}
/* ***************************************************************** */
/* The main program
/* ***************************************************************** */
main()
{int i,x1;
int speed_now;
unsigned long velocity;
unsigned int INT1_status;
disable_interrupts();
dsp_setup();
eventmgr_init();
init_SRM();
enable_interrupts();
for(;;)
{
port0=0x00;
INT1_status=XINT1CR;
if (INT1_status & 0x8000)
{
keyboard_ISR();
XINT1CR=0x0006;
}
/* deal with the RX event */
/* deal with the TX event */
if (T1overflow_counter>=5) /* sample time about speed is about 1ms */
{ T1overflow_counter=0;
if (CAP_p->delta_count==0)
velocity=0;
else
velocity=VELOCITY_CONST/CAP_p->delta_count;
speed_now=(unsigned int)velocity;
if (run_state==0)
endtime=endtime+1;
if (endtime>=100 )
{speed_now=0;
run_state=10;}
if (speed_now>5)
{ data=speed_now;
LSB =data & 0x3f;
MSB =data>>6;
for(;(SCICTL2 & 0x80)==0;);
TX_data=MSB; /* transmit speed MSB */
SCITXBUF=TX_data;
for(;(SCICTL2 & 0x80)==0;);
TX_data=LSB ; /* transmit speed LSB */
for (i=0;i<2000;i++)
{}
SCITXBUF=TX_data;
}
}
LCD_refresh();
if (run_state)
{
if (input_value)
{
if (input_value<=15)
{
run_state=0;
PBDATDIR=0x0701;
/*PBDATDIR=align_PBvalue; */
}
else
{
if (sign_state)
{if ((input_value*8.5)<=position)
run_state=3;
}
else if ((input_value*8)<=position)
run_state=3;
if ((input_value*10-75)<=position)
{
run_state=0;
PBDATDIR=0x0701;
/*PBDATDIR=align_PBvalue;*/
}
}
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -