📄 vectors08.c
字号:
/*-----------------------------------------------------*
*文件名:vectors08.c *
*功 能:用于定义中断矢量表 *
*-----------------------------------------------------*/
/*[头文件]*/
#include "GP32C.H"
#include "KB.h"
#include "SCI.h"
#pragma interrupt_handler isrKBI
int result(unsigned char m[]);
extern void lcdshow(unsigned char *str);
extern void LcdInit(void);
extern void Lcd_Command(unsigned char cmd);
unsigned char n[32]={" "};
unsigned char m[32];
unsigned char mn[32];
unsigned char KB_valve,i,s2,x,t1,s1=0,t=0;
int mm;
unsigned char i1,i2,i3,i4,i41,i42,i5,i6,i7,i8,i9;
unsigned char sign1[16],sign2[16];
int r[16];
int res;
int result(unsigned char m[])
{
for(i1=0;i1<16;i1++)r[i1]=0;
i1=0;i2=0;i3=0;i4=0;i5=0;i6=0;i7=0;
while(m[i1]!='='&&m[i1]!='')
{i1++;i2++;}
if(m[0]=='-')i3=1;
for(;i3<=i2;i3++)
{if(m[i3]=='+'||m[i3]=='-'||m[i3]=='*'||m[i3]=='/'||m[i3]=='=')
{sign1[i4]=m[i3];sign2[i4]=i3;i4++;}}
i41=i4;i42=i4;
if(m[0]=='-')i5=1;
while(i41--)
{
for(;i5<sign2[i6];i5++)
r[i7]=r[i7]*10+m[i5]-'0';
i5++;i6++;i7++;
}
if(m[0]=='-')r[0]=0-r[0];
for(i8=0;i8<i42-1;i8++)
{if(sign1[i8]=='*')
{r[i8+1]=r[i8]*r[i8+1];r[i8]=0;
if(i8>0&&sign1[i8-1]=='-')sign1[i8]='-';
else sign1[i8]='+';}
if(sign1[i8]=='/')
{r[i8+1]=r[i8]/r[i8+1];r[i8]=0;
if(i8>0&&sign1[i8-1]=='-')sign1[i8]='-';
else sign1[i8]='+';}}
res=r[0];
for(i9=0;i9<i42-1;i9++)
{
if(sign1[i9]=='+')res=res+r[i9+1];
if(sign1[i9]=='-')res=res-r[i9+1];
}
return res;
}
/*键盘中断处理函数------------------------------------*/
void isrKBI(void)
{
unsigned char KB_valve;
asm("SEI"); //关总中断
INTKBSCR|= (1<<IntBit); //屏蔽键盘中断(IMASKK=1)
x=1;
if(x==1)
{
x=0;
KB_valve=KB_Scan(); //扫描键值
KB_valve=KB_Def(KB_valve); //键值转化为定义值
switch(KB_valve)
{
case '1':n[t++]='1';s1=0;break;
case '2':n[t++]='2';s1=0;break;
case '3':n[t++]='3';s1=0;break;
case '4':n[t++]='4';s1=0;break;
case '5':n[t++]='5';s1=0;break;
case '6':n[t++]='6';s1=0;break;
case '7':n[t++]='7';s1=0;break;
case '8':n[t++]='8';s1=0;break;
case '9':n[t++]='9';s1=0;break;
case '0':n[t++]='0';s1=0;break;
case '<':while(n[t-1]==' ')t--;if(t!=0)n[--t]=' ';s1=2;break;
case '+':if(s1==1)
{
s2=0;
while(n[s2]!='=')s2++;
for(i=0;i<t-s2;i++)n[i]=n[i+s2+1];
for(i=t-s2;i<32;i++)n[i]=' ';
t=t-s2-1;
}
if(t==0)break;
else n[t++]='+';
s1=0;break;
case '-':if(s1==1)
{
s2=0;
while(n[s2]!='=')s2++;
for(i=0;i<t-s2;i++)n[i]=n[i+s2+1];
for(i=t-s2;i<32;i++)n[i]=' ';
t=t-s2-1;
}
else n[t++]='-';
s1=0;break;
case '*':if(s1==1)
{
s2=0;
while(n[s2]!='=')s2++;
for(i=0;i<t-s2;i++)n[i]=n[i+s2+1];
for(i=t-s2;i<32;i++)n[i]=' ';
t=t-s2-1;
}
if(t==0)break;
else n[t++]='*';
s1=0;break;
case '/':if(s1==1)
{
s2=0;
while(n[s2]!='=')s2++;
for(i=0;i<t-s2;i++)n[i]=n[i+s2+1];
for(i=t-s2;i<32;i++)n[i]=' ';
t=t-s2-1;
}
if(t==0)break;
else n[t++]='/';
s1=0;break;
case '=':
n[t++]='=';
for(i=0;i<t;i++)
m[i]=n[i];
mm=result(m);
if(t<17)
{n[t-1]=' ';n[16]='=';t=17;}
if(mm<0)
{
n[t++]='-';
mm=0-mm;
}
t1=0;
if(mm==0)n[t++]='0';
else
{
while(mm)
{
mn[t1++]=mm%10+'0';
mm=mm/10;
}
while(t1>0)n[t++]=mn[--t1];}
s1=1;break;
}
Lcd_Command(0b00001100);
lcdshow(n);
if(t>32)
{
for(i=0;i<32;i++)n[i]=' ';
lcdshow(n);
t=t%32;
}
if(s1==2)
{
lcdshow(n);
s1=0;
}
}
KB_Init(); //重新初始化键盘
INTKBSCR&= ~(1<<IntBit); //打开键盘中断(IMASKK=0)
asm("CLI"); //开总中断
}
//未定义的中断处理函数,本函数不能删除
#pragma interrupt_handler isrDummy
void isrDummy(void)
{
}
//中断矢量表,需定义中断函数,可修改下表中的相应项目
//(interrupt service routine,isr 中断处理程序)
#pragma abs_address:0xffdc //中断向量表起始地址
void (* const _vectab[])(void) = {
isrDummy, //时基中断
isrDummy, //AD转换中断
isrKBI, //键盘中断
isrDummy, //SCI TC/TE
isrDummy, //SCI RF/IDLE
isrDummy, //SCI PE/FE/NF/OR
isrDummy, //SPI TE
isrDummy, //SPI MOD/OVR/RF
isrDummy, //TIM2溢出中断
isrDummy, //TIM2通道1
isrDummy, //TIM2通道0
isrDummy, //TIM1溢出中断
isrDummy, //TIM1通道1
isrDummy, //TIM1通道0
isrDummy, //CGM
isrDummy, //IRQ
isrDummy //SWI
//RESET也是中断,定义在 crt08.o中
};
#pragma end_abs_address
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -