freetech

HCS08入门之——独立按键实验

0
阅读(2799)

本实验通过按动按键,驱动相应的灯进行指示。学习i/o口的输入功能。IO口做输入涉及的几个寄存器:

1、PTxD,IO口数据寄存器,对应的值为0 时表示IO口是低电平,为1时表示IO口是高电平。单个使用时是PTxD_PTxDn(x为A、B、C、D……,n为1、2、3……)。如本例中的“ if( PTFD_PTFD7 == 0”是判断PTFD7脚是否为低电平。

2、PTxDD,IO口方向寄存器,对应的值为0时IO口做输入,为1时IO口做输出。单个使用是PTxDD_PTxDDn(x为A、B、C、D……,n为1、2、3……),本例中的“PTADD_PTADD7=0;”等效于“PTADD &= ~(1<<7);”是将PTAD7脚设为输入。

3、PTxPE,IO口上拉使参寄存器,对应的值为0时关闭IO口上拉功能,为1时打开IO口的上拉功能。单个使用是PTxPE_PTxPEn(x为A、B、C、D……,n为1、2、3……),本例中的“PTAPE_PTAPE7 = 1;”等效于“PTAPE &= ~(1<<7);”是使能PTAD7脚上拉功能。

程序代码如下:

#include <hidef.h> /* for EnableInterrupts macro */
#include "derivative.h" /* include peripheral declarations */

/***************************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;      
}

/***************************延时函数*******************************/
void delay(uchar x){

    uchar i,j;
    for(i=0;i<x;i++) { 
        for(j=0;j<25;j++)
        {__RESET_WATCHDOG();}
    }
}

uchar ReadKey(void) {
    if( PTFD_PTFD7 == 0){
        return 1;
      }
    else if( PTAD_PTAD7 == 0){
        return 2;
    }
    return 0;
}

void main(void) {

  EnableInterrupts; /* enable interrupts */
  /* include your code here */
  //MCU_INIT();
  IO_INIT();

  for(;;) {
    __RESET_WATCHDOG(); /* feeds the dog */
    if(ReadKey() == 1){
      PTBD = ~PTBD;
    }else if(ReadKey() == 2){
      if( ( PTBD == 0x0F )||( PTBD == 0xF0 ) ){
        PTBD = 0x55;
      }else{
        PTBD = 0x0F;
      }
    }
  } /* loop forever */
  /* please make sure that you never leave main */
}