//-------------------------------------------------------------------------* interrupt void isrKeyBoard(void) {
uint8 value,KeyDef; uint16 i;
for(i=0; i<1000; i++);
DisableInterrupt(); //关总中断 DisableKBint(); //屏蔽键盘中断
value = KBScanN(10); //扫描键值,存于value中 if(value!=0xFF) {
KeyDef=KBDef(value);
if(KeyDef=='*') {
flag=0; //键值按下标志位 start=1; //启动减数 Buzzer=0; //关闭蜂鸣器 //对数码管重新回到计时初值 ledbuf[0]='0'; ledbuf[1]='0'; ledbuf[2]='1'; ledbuf[3]='0'; num=11; }
if(KeyDef!='*'&&num>0) {
start=0;
//用flag来对数据进行锁存 if(flag==0) {
第 16 页
ledbuf[0]=KeyDef; flag=1; } } }
KBInit(); //键盘初始化键盘中断 EnableKBint(); //开放键盘中断 EnableInterrupt() ; //开总中断 }
//-------------------------------------------------------------------------* //函数名: isrT1Out * //功能: 定时器1溢出中断处理函数,以秒为最小单位计时, * //并清定时器1溢出标志位 * //参 数: 无 * //返 回: 无 * //说 明: 无 * //-------------------------------------------------------------------------* interrupt void isrT1Out(void) //溢出时间0.5s {
uint8 temp;
DisableInterrupt(); //禁止总中断
if(start==1) {
//数码管显示数值每隔1s减1 if(num!=0)num--; else num=0;
//判断数码管状态是否减到0,若没有则数码管减1显示 if(num!=0) {
ledbuf[2]='0';
第 17 页
ledbuf[3]=num-1+'0'; } else {
//数码管则显示“0000”并闪烁 LEDdata=0xc0; LEDcs1=0x03; LEDcs2=0x0c;
Delay(7); //延时使数码管显示闪烁 LEDdata=0xff; Delay(7); LEDdata=0xc0; //实现蜂鸣器的报警鸣叫 Buzzer=1; Delay(30); } }
if(start==0) {
//数码管则显示“0000”并闪烁 if(num>0) {
//如果在10s内有键按下,则LED显示抢答者编号以及当前时间,并闪烁显示
LEDshow(ledbuf); LEDcs1=0x03; LEDcs2=0x0c;
Delay(3); //延时使数码管显示闪烁 LEDdata=0xff;Delay(3);
第 18 页
LEDshow(ledbuf); }
if(num==0) {
//如果在10s内没有键按下,则LED显示0000并闪烁显示 LEDdata=0xc0; LEDcs1=0x03; LEDcs2=0x0c;
Delay(3); //延时使数码管显示闪烁 LEDdata=0xff;Delay(3); LEDdata=0xc0; } }
TPM_MODH(1) = 0x7a; TPM_MODL(1) = 0x12;
//清定时器1溢出标志位
temp = TPM_CSTR(1); //读取定时器1状态和控制寄存器TPM1SC
TPM_CSTR(1) &= ~(TPM1SC_TOF_MASK); //向定时器溢出标志位TOF写0
EnableInterrupt(); //开放总中断 }
//未定义的中断处理函数,本函数不能删除 interrupt void isrDummy(void) { }
//中断处理子程序类型定义 typedef void( *ISR_func_t)(void);
//中断矢量表,如果需要定义其它中断函数,请修改下表中的相应项目
第 19 页
const ISR_func_t ISR_vectors[] @0xFFCC = {
isrDummy, //时基中断 isrDummy, //IIC中断 isrDummy, //ADC转换中断 isrKeyBoard, //键盘中断 isrDummy, //SCI2发送中断 isrDummy, //SCI2接收中断 isrDummy, //SCI2错误中断 isrDummy, //SCI1发送中断 isrDummy, //SCI1接收中断 isrDummy, //SCI1错误中断 isrDummy, //SPI中断
isrDummy, //TPM2溢出中断
isrDummy, //TPM2通道1输入捕捉/输出比较中断 isrDummy, //TPM2通道0输入捕捉/输出比较中断 isrT1Out, //TPM1溢出中断
isrDummy, //TPM1通道5输入捕捉/输出比较中断 isrDummy, //TPM1通道4输入捕捉/输出比较中断 isrDummy, //TPM1通道3输入捕捉/输出比较中断 isrDummy, //TPM1通道2输入捕捉/输出比较中断 isrDummy, //TPM1通道1输入捕捉/输出比较中断 isrDummy, //TPM1通道0输入捕捉/输出比较中断 isrDummy, //ICG的PLL锁相状态变化中断 isrDummy, //低电压检测中断 isrDummy, //IRQ引脚中断 isrDummy, //SWI指令中断
//RESET是特殊中断,其向量由开发环境直接设置(在本软件系统的Start08.o文件中) };
第 20 页