⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vectors08.c

📁 基于HC908GP32的计算器完整程序
💻 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 + -