原创 CVAVR--IO及外部中断操作

2009-4-1 22:11 2623 4 4 分类: MCU/ 嵌入式

点击开大图


//含IO操作,外部中断操作 By AnalogMaster
#include <mega8.h>   
#define uchar unsigned char
#define uint  unsigned int
#define SEI   SREG|=0x80
//uchar dtab[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳
uchar dtab[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共阴
uchar num;
void delayms(void)
{
  uint i;
  for(i=1;i<1140;i++){;}
}
void delaynms(uint n)
{
  uint i;
  i="0";
  while(i<n)
  {
  delayms();
  i++;
  }
}


uchar keyscan(void)          //单键扫描
{
  if (PINC.0==0)             //读入IO电平状态
  {
  delaynms(10);
  if (PINC.0==0)
  {
  for(;;){if (PINC.0==1){return 10;}}   //等待按下键释放
  }
  else return 0;
  }
  else return 0;
}


void INT_Init(void)
{
      SEI;            //全局中断使能
      MCUCR|=0x0a;    //INT0 INT1下降沿
      GICR|=0xc0;     //INT0 INT1使能
      GIFR&=0x3f;     //清除INT0 INT1中断标志
}


interrupt [EXT_INT0] void INT0_INT(void)   //INT0中断服务函数,
{                                            //中断标志自动清除
      num++;
      if (num==10){num=0;}
      PORTB="dtab"[num];
}


interrupt [EXT_INT1] void INT1_INT(void)   //INT1中断服务函数
{
      if (num==0){num=9;}
      else {num--;}     
      PORTB="dtab"[num];
}


void main(void)      
{
  DDRD.0=1;           //PD0引脚为输出
  PORTD.0=1;          //IO输出设置:DDRX.n=1;之后PORTX.n=0则输出0;PORTX.n=1则输出1.
  DDRC.0=0;           //PC0为读入
  PORTC.0=1;          //IO读入设置:DDRX.n=0;之后PORTX.n=1;则该IO设为读入方式.
  DDRD.2=0;
  PORTD.2=1;
  DDRD.3=0; 
  PORTD.3=1;
  DDRB="0xff";
  PORTB="dtab"[0];
  INT_Init();
  while (1)          
  {
      if (keyscan()==10)
      {
      num++;
      if (num==10){num=0;}
      PORTB="dtab"[num];
      while(1)
      {
      delaynms(50);    //延时
      PORTD.0=~PORTD.0;
      if (keyscan()==10){break;}
      }
      }
  }
}

文章评论0条评论)

登录后参与讨论
我要评论
0
4
关闭 站长推荐上一条 /2 下一条