📄 vectors08.c
字号:
/*-----------------------------------------------------*
*文件名:vectors08.c *
*功 能:用于定义中断矢量表 *
*-----------------------------------------------------*/
#include "GP32C.H"
#include "SCI.h" //串行通信头文件
#include "KB.h"
/*[相应寄存器定义]*/
#define TSTOPBit 5 //定时器计数停止位
#define TOFBit 7 //定时器溢出标志位
/*isrTIMER1:定时器溢出中断处理函数---------------------*
*功 能:给内存单元Time[0-2](时分秒)赋值 *
*-----------------------------------------------------*/
extern unsigned char time[3], naozhong,KB_valve; //H M S
extern unsigned int data[3];
extern unsigned char alart[2];
unsigned char flat=0,f1=0,f2=0;
unsigned char getmonthdays(unsigned int year,unsigned char month)/*得到某月的天数*/
{
unsigned char days;
switch (month)
{
case 4:
case 6:
case 9:
case 11:days=30;
break;
case 2: if((year%4==0&&year%100!=0)||(year%400==0)) days=29;
else days=28;
break;
default:days=31;
break;
}
return days;
}
#pragma interrupt_handler isrTIMER1
void isrTIMER1(void)
{
unsigned char i;
asm("SEI"); //关总中断
//------------------------------
if(((time[0]==0)&&(time[1]==0))||((time[1]==alart[0])&&(time[2]==alart[0])))naozhong=1;
time[0]++; //秒数加1
if (time[0]!=60) goto isrTIMER1_exit; //秒数未增加到60,转
time[0]=0; time[1]++; //秒数增加到60,清0,分钟数加1
if (time[1]!=60) goto isrTIMER1_exit; //分钟数未增到60,转
time[1]=0; time[2]++; //分钟数增加到60,清0,小时数加1
if (time[2]!=24) goto isrTIMER1_exit; //小时数未增到24,转
time[2]=0; data[0]++; //时数增加到24,清0,日期增1
if(data[0]!=getmonthdays(data[2],data[1])) goto isrTIMER1_exit; //天数数未增到月尾值,转
data[0]=0;data[1]++; //天数增加到月尾值,清0,月数加1
if(data[1]!=13)goto isrTIMER1_exit; //月数增加未增加到12,转
data[1]=0;data[2]++; //月数增加到12,清0,年数加1
isrTIMER1_exit:
//------------------------------
//清除定时器溢出标志位
T1SC&=~(1<<TOFBit);
asm("CLI"); //开总中断
}
/*isrRe:接收中断处理函数-------------------------------*
*功 能:接收3字节基准时分秒放入内存单元Time[0-2] *
*-----------------------------------------------------*/
#pragma interrupt_handler isrRe
void isrRe(void)
{
asm("SEI"); //禁止所有中断
//接收数据
SCIReN(3,time);
asm("CLI"); //开放总中断
}
/*键盘中断处理函数------------------------------------*/
#pragma interrupt_handler isrKBI
void isrKBI(void)
{
asm("SEI"); //关总中断
INTKBSCR|= (1<<IntBit); //屏蔽键盘中断(IMASKK=1)
KB_valve=KB_Scan(); //扫描键值
KB_valve=KB_Def(KB_valve); //键值转化为
isrKBI_exit:
KB_Init(); //重新初始化键盘
INTKBSCR&= ~(1<<IntBit); //打开键盘中断(IMASKK=0)
asm("CLI"); //开总中断
}
//未定义的中断处理函数,本函数不能删除
#pragma interrupt_handler isrDummy
void isrDummy(void)
{
}
#pragma abs_address:0xffdc //中断向量表起始地址
void (* const _vectab[])(void) = {
isrDummy, //时基中断
isrDummy, //AD转换中断
isrKBI, //键盘中断
isrDummy, //SCI TC/TE
isrRe, //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
isrTIMER1, //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 + -