×
单片机 > 单片机程序设计 > 详情

msp430 按键 中断 轮询

发布时间:2020-09-01 发布时间:
|

msp430 数码管 key 中断 轮询


仿真见我的上传资源


/******************************************************************

* 实验名称:IO特性(MSP430F249) 

*        

* 实验说明:

* 通设置系统主时钟(MCLK=8Mhz ) 、辅助时钟(ACLK=8Mhz )、

* 子系统时钟(SMCLK=8Mhz )

* 编译软件:Embedded Workbench 5.3  

******************************************************************/ 

#include

#define uchar unsigned char

#define uint unsigned int

 

void delayms();

uchar key = 0;

uchar   table[16] ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,

                0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

 

uchar   key_table[4][4] = { 1,2,3,4,

           5,6,7,8,

  9,10,11,12,

13,14,15,16};  //  键值编码,对应一个4×4 矩阵

uchar  position[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};

uchar  num_table[8]= {0,0,0,0,0,0,0,0};

uchar  row_table[4]= {0xef,0xdf,0xbf,0x7f};

void show(uchar pos,uchar num)

{

P4OUT  = 0x00;   // tobe all turn off 

P6OUT |= 0x40;   // DUAN 1

P4OUT  = table[num];  //DUAN NUM

P6OUT &= 0XBF;   // DUAN 0

        P4OUT  = 0XFF;

P5OUT |= 0X20;

P4OUT &= position[pos];

        P5OUT &= 0XDF;

 

}

 

uchar key_scan(int num)

{

uchar line = 0,temp = 0;

P1OUT = row_table[num];

temp = P1IN&0x0f;

if(temp != 0x0f)

{

delayms(10);

temp =P1IN&0x0f;

if(temp != 0x0f)

{

while(temp ==0x0f){temp =P1IN&0x0f;} //wait button off

switch(temp)

{

case 0x0e:  line = 0;break;

case 0x0d:  line = 1;break;

case 0x0b:  line = 2;break;

case 0x07:  line = 3;break;

}

          

return key_table[num][line];

}

      

return 0;

}

        

return 0;

}

 

uchar Key_scan()

{

 uchar i=0;

  i = key_scan(0); if(i != 0) return i;

  i = key_scan(1); if(i != 0) return i;

  i = key_scan(2); if(i != 0) return i;

  i = key_scan(3);

  return i;

}

 

void delayms(uint t)

{

    uint i;

    while(t--)

      for(i=1330;i>0;i--);//进过参数的调整 

}

 

 

 

 

void main(void)

{

uchar i=0,key1=0;

    P1DIR = 0XFF;P1OUT = 0XFF;

    P2DIR = 0XFF;P2OUT = 0XFF;

    P3DIR = 0XFF;P3OUT = 0XFF;

    P4DIR = 0XFF;P4OUT = 0XFF;

    P5DIR = 0XFF;P5OUT = 0XFF;

    P6DIR = 0XFF;P6OUT = 0XFF;

 

    P6DIR |= 0X40;   // p6^6 output

    P5DIR |=0X20;    // P5^5 OUTPUT

    P4DIR  = 0XFF;   //  P4 OUTPUT

    P1SEL = 0;       //  

    P1DIR = 0xF0;    //p1.0--p1.3 IN ,p1.4--p1.7 OUT

    P1OUT |= 0XF0;  

    P1IE |= 0x08;

    P1IES |= 0X08;

   // P1IFG &= ~0x08;

    _EINT();

    WDTCTL=WDTPW + WDTHOLD; // 关闭看门狗

  

/*while(1)

    {

          show(0,key);

          delayms(10);

       //按键中断测试程序   

    }*/

 

   /*轮询按键测试程序 

    while(1)

    {

     i = key_scan(0); 

     if(i!=0) key1 = i;

     show(0,key1);

    }*/

}

 

 

 

 

#pragma vector = PORT1_VECTOR

__interrupt void PORT1_ISR(void)

{

  

  key++;

  if(key == 9) key = 0;

  P1IFG &= ~0x08;  

  return ;

  

}



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
基于AT91M42800A的LED显示系统设计