freetech

HCS08入门之——键盘中断

0
阅读(2788)

本实验主要学习键盘中断用到的几个寄存器:

1、PTxSC,IO口中断状态和控制寄存器。下面是以PTA口为例的寄存器描述:

image

2、PTxPS,IO口中断引脚选择寄存器,其每一位对应IO口的每一位。为0时引脚不用于产生中断,为1时引脚用于产生中断。

3、PTxES,IO口中断边沿选择寄存器,其每一位对应IO口的每一位。为0时引脚的下降沿产生中断,为1时引脚的上升沿产生中断。

实验现象:
    按一下按键(如S2)对应的LED指示灯(D7)发光(熄灭),再一次按下按键对应的
LED指示灯熄灭(发光。
按一下SW1,D5点亮,再按一下SW1,D5熄灭
按一下SW2,D7点亮,再按一下SW2,D7熄灭
按一下SW3,D6点亮,再按一下SW3,D6熄灭
按一下SW4,D8点亮,再按一下SW4,D8熄灭

 

程序代码如下:
/*****************头文件****************************************/
#include <hidef.h> /* for EnableInterrupts macro */
#include "derivative.h" /* include peripheral declarations */
byte kbi_value=0;//全局变量
/*********************变量和函数定义****************************/
void IO_INIT(void);
void KB_INIT(void);
void MCU_INIT(void);
void DELAY(word x);

/*********************主函数************************************/
void main(void) {
    EnableInterrupts;      /* enable interrupts */
    MCU_INIT();
    IO_INIT();
      KB_INIT();
    for(;;) {
       __RESET_WATCHDOG(); /* feeds the dog */
    } /* loop forever */
  /* please make sure that you never leave main */
}

/***************************MCU初始化函数*******************************/
void MCU_INIT(void){

    MCGC1=0x04;    //内部时钟二分频,微调
    MCGC2=0x40;
    MCGTRM=0xa8;
    SOPT1=0x42;    //看门狗
    SOPT2=0x00;

}

/***********************I/O初始化********************************/
void IO_INIT(void){

    PTBDD = 0xFF;//LED输出
    PTCDD_PTCDD3=1;
    PTADD_PTADD7=0;//键盘输入
    PTFDD_PTFDD7=0;
    PTAPE_PTAPE7 = 1;//上拉使能
    PTFPE_PTFPE7 = 1;//上拉使能
    PTBD = 0xF0;
    PTCD_PTCD3 = 1;      
}

/************************KB初始化********************************/
void KB_INIT(void){

    PTAPE_PTAPE7 = 1;
    PTAPS_PTAPS7 = 1;
    PTAES_PTAES7 = 0;
    PTASC_PTAMOD = 0;
    PTASC_PTAIE = 0;
    PTASC_PTAACK = 1;
    PTASC_PTAIE = 1;
}

/********************************键盘中断**************************/
interrupt 22 void   KBI_ISR(void) {
   PTASC_PTAACK=1;
   if(PTAD_PTAD7==0) {
    PTBD = ~PTBD;
   }

}