📄 interrupt.c
字号:
//必须使用连续的8位IO口,且高四位为输出口
//如IOA0-7 IOA0- 3输入 IOA4 - 7输出
// IOA8-15 IOA8-11输入 IOA12-15输出
// IOB0-7 IOB0- 3输入 IOB4 - 7输出
// IOB8-15 IOB8-11输入 IOB12-15输出
// | | | |
//IOA7(OUT) |(key0)------|(key1)----|(key2)----|(key3)----(可以是IOA7 IOB7 IOA15 IOB15)
// | | | |
//IOA6(OUT)-|(key4)---- -|(key5)----|(key6)----|(key7)----(可以是IOA6 IOB6 IOA14 IOB14)
// | | | |
//IOA5(OUT)-|(key8)------|(key9)----|(key10)---|(key11)---(可以是IOA5 IOB5 IOA13 IOB13)
// | | | |
//IOA4(OUT)-|(key12)-- --|(key13)---|(key14)---|(key15)---(可以是IOA4 IOB4 IOA12 IOB12)
// | | | |
// IOA3(IN) IOA2(IN) IOA1(IN) IOA0(IN)
// IOB3 IOB3 IOB1 IOB0
// IOA11 IOA10 IOA9 IOA8
// IOB11 IOB10 IOB9 IOB8
#include "SPCE061V004.H"
#include "Hardware.H"
#define Contrl_Data_Max 4095
#include "s480.h"
#include "Hardware.h"
unsigned int KeyVal;
unsigned int KeyScan();
unsigned int cnt;
unsigned int Set_Flag=0;
unsigned int Flag_StepAhead;
unsigned int Flag_StepBack;
unsigned int Flag=1;
unsigned int Flag_Key_Up;
unsigned int Flag_Key_Down;
unsigned int Convert_Value;
unsigned int ENTER_Down; //确认键按下
unsigned int Count;
unsigned int V_Time=0; //次数变量
unsigned int Sum=0;
unsigned int Adverage_Convert_Value; //平均采集值
extern Voice;
extern Set_Value;
extern ShowData[5];
extern SampleData[4];
extern Contrl_Data;
//=============================================================================================================
//BREAK
//=============================================================================================================
void BREAK(void) __attribute__ ((ISR));
void BREAK(void)
{
}
//=============================================================================================================
//FIQ
//=============================================================================================================
void FIQ(void) __attribute__ ((ISR));
void FIQ(void)
{
*P_Watchdog_Clear=C_WDTCLR;
if((*P_INT_Ctrl&C_FIQ_TMA)==0x2000)
{
int temp;
if(Voice==1)
{
*P_INT_Clear=C_FIQ_TMA;
SACM_S480_ServiceLoop();
*P_Watchdog_Clear=C_WDTCLR;
}
else
{
KeyVal=KeyScan();
if(KeyVal==0xFFFF)
Flag_Key_Up=1; //没有键按下
else
Flag_Key_Down=1; //有键按下
switch(KeyVal)
{
case 4: if((Flag_Key_Down==1)&&(Flag_Key_Up==1)) //按下SET键
{
cnt++;
Flag_Key_Down=0;
Flag_Key_Up=0;
}
Set_Flag=1;
if(cnt>4)
{
cnt=0;
}
break;
case 0: if((Flag_Key_Down==1)&&(Flag_Key_Up==1))
{
cnt=0;
Set_Flag=0;
Flag_Key_Up=0;
ENTER_Down=1; //表示确认键已经按下
}
break;
//按下ENTER键
case 3: {
if((Flag_Key_Down==1)&&(Flag_Key_Up==1))
{
Flag_StepAhead=1;
Flag_Key_Up=0;
}
break;
} //按下步进+键
case 1: {
if((Flag_Key_Down==1)&&(Flag_Key_Up==1))
{
Flag_StepBack=1;
Flag_Key_Up=0;
}
break;
} //按下步进-键
}
if(Set_Flag==1)
{
switch(KeyVal)
{
case 15: temp=9;ShowData[cnt]=temp;break;
case 14: temp=8;ShowData[cnt]=temp;break;
case 13: temp=7;ShowData[cnt]=temp;break;
case 11: temp=6;ShowData[cnt]=temp;break;
case 10: temp=5;ShowData[cnt]=temp;break;
case 9: temp=4;ShowData[cnt]=temp;break;
case 7: temp=3;ShowData[cnt]=temp;break;
case 6: temp=2;ShowData[cnt]=temp;break;
case 5: temp=1;ShowData[cnt]=temp;break;
case 2: temp=0;ShowData[cnt]=temp;break;
}
Flag=1;
}
*P_INT_Clear=C_FIQ_TMA;
}
}
else
{
*P_IOB_Data^=0x2000; //CS拉低
F_Send_Clock(2); //送两个脉冲
Convert_Value=F_Read_Data();
if(V_Time<15)
{
Sum+=Convert_Value;
V_Time++;
}
else
{
Adverage_Convert_Value=Sum/15;
Sum=0;
V_Time=0;
}
*P_IOB_Data^=0x2000; //CS拉高
F_Delay(3);
*P_Watchdog_Clear=C_WDTCLR; //清狗
SampleData[0]=Adverage_Convert_Value/1000;
SampleData[1]=Adverage_Convert_Value%1000/100;
SampleData[2]=Adverage_Convert_Value%1000%100/10;
SampleData[3]=Adverage_Convert_Value%10;
*P_INT_Clear=C_FIQ_TMB;
}
*P_Watchdog_Clear=C_WDTCLR; //清狗
}
//=============================================================================================================
//IRQ0
//=============================================================================================================
void IRQ0(void) __attribute__ ((ISR));
void IRQ0(void)
{
}
//=============================================================================================================
//IRQ1
//=============================================================================================================
void IRQ1(void) __attribute__ ((ISR));
void IRQ1(void)
{
}
//=============================================================================================================
//IRQ2
//=============================================================================================================
void IRQ2(void) __attribute__ ((ISR));
void IRQ2(void)
{
}
//=============================================================================================================
//IRQ3
//=============================================================================================================
void IRQ3(void) __attribute__ ((ISR));
void IRQ3(void)
{
}
//=============================================================================================================
//IRQ4
//=============================================================================================================
void IRQ4(void) __attribute__ ((ISR));
void IRQ4(void)
{
*P_Watchdog_Clear=C_WDTCLR; //清狗
Count++;
if(Count>=15)
{
Set_Value=ShowData[1]*1000+ShowData[2]*100+ShowData[3]*10+ShowData[4];
if(Set_Flag==0)
{
if(Set_Value>Adverage_Convert_Value)
{
if(Contrl_Data<Contrl_Data_Max)
Contrl_Data++;
}
else
{
if(Set_Value<Adverage_Convert_Value)
if(Contrl_Data>0)
Contrl_Data--;
}
}
Count=0;
}
*P_INT_Clear=C_IRQ4_1KHz;
}
//=============================================================================================================
//IRQ5
//=============================================================================================================
void IRQ5(void) __attribute__ ((ISR));
void IRQ5(void)
{
}
//=============================================================================================================
//IRQ6
//=============================================================================================================
void IRQ6(void) __attribute__ ((ISR));
void IRQ6(void)
{
}
//=============================================================================================================
//IRQ7
//=============================================================================================================
void IRQ7(void) __attribute__ ((ISR));
void IRQ7(void)
{
}
//=============================================================================================
//函数: Key_Scan()
//描述:键盘扫描函数
//参数:无
//返回:按键代码
//=============================================================================================
unsigned int KeyScanTemp=0;
unsigned int KeyScan()
{
KEYIODATA=KEYIODATA&0xFF0F; //IOx.7.6.5.4=0
KeyScanTemp=KEYIODATA;
KeyScanTemp=KeyScanTemp&0x000F;
if(KeyScanTemp!=0x000F) //可能有键按下
{
for(KeyScanTemp=0;KeyScanTemp<10;KeyScanTemp++);//延时消抖
KeyScanTemp=KEYIODATA&0x000F;
if(KeyScanTemp!=0x000F) //确认有按键按下
{
KEYIODATA=KEYIODATA|0x00F0; //IOx.6.5.4=1
KEYIODATA=KEYIODATA&0xFF70; //IOx.7=0
KeyScanTemp=KEYIODATA&0x000F; //GOT IOx.8-IOx11
switch(KeyScanTemp)
{
case 0x0007: return(KeyNum0);break; //nub.0 key was pressed
case 0x000B: return(KeyNum1);break; //because the exist of "return()"
//so "break"is not necessary
case 0x000D: return(KeyNum2);break;
case 0x000E: return(KeyNum3);break;
default : break;
}
KEYIODATA=KEYIODATA|0x00F0; //IOx.6.5.4=1
KEYIODATA=KEYIODATA&0xFFBF; //IOx.6=0
KeyScanTemp=KEYIODATA&0x000F;
switch(KeyScanTemp)
{
case 0x0007: return(KeyNum4);break;
case 0x000B: return(KeyNum5);break;
case 0x000D: return(KeyNum6);break;
case 0x000E: return(KeyNum7);break;
default : break;
}
KEYIODATA=KEYIODATA|0x00F0; //IOx.6.5.4=1
KEYIODATA=KEYIODATA&0xFFDF; //IOx.5=0
KeyScanTemp=KEYIODATA&0x000F;
switch(KeyScanTemp)
{
case 0x0007: return(KeyNum8);break;
case 0x000B: return(KeyNum9);break;
case 0x000D: return(KeyNum10);break;
case 0x000E: return(KeyNum11);break;
default : break;
}
KEYIODATA=KEYIODATA|0x00F0; //IOx.6.5.4=1
KEYIODATA=KEYIODATA&0xFFEF; //IOx.4=0
KeyScanTemp=KEYIODATA&0x000F;
switch(KeyScanTemp)
{
case 0x0007: return(KeyNum12);break;
case 0x000B: return(KeyNum13);break;
case 0x000D: return(KeyNum14);break;
case 0x000E: return(KeyNum15);break;
default : break;
}
return(NoKey);
}
else //假信号
return(NoKey);
}
else //无键按下
return(NoKey);
}
//=============================================================================================================
//
//=============================================================================================================
int F_Send_Clock(int x)
{
int i,j,k;
i=2*x;
for(j=0;j<i;j++)
{
*P_IOB_Data^=0x1000;
for(k=0;k<5;k++)
*P_Watchdog_Clear=C_WDTCLR;
}
}
//=============================================================================================================
//
//=============================================================================================================
int F_Read_Data()
{
int temp1,i;
int temp2=0;
for(i=0;i<13;i++)
{
*P_IOB_Data^=0x1000; //拉低时钟电平
temp1=*P_IOB_Data;
*P_IOB_Data^=0x1000; //拉高时钟电平
if((temp1&0x4000)==0x4000)
temp2|=1;
temp2=temp2<<1;
}
temp2=temp2>>1;
temp2&=0x1FFF;
return(temp2);
}
//=============================================================================================================
//
//=============================================================================================================
int F_Delay(int x)
{
int i,j;
i=x;
for(j=0;j<i;j++)
*P_Watchdog_Clear=C_WDTCLR;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -