msp430 按键 中断 轮询

msp430 数码管 key 中断 轮询

仿真见我的上传资源

/******************************************************************
* 实验名称:IO特性(MSP430F249) 
*        
* 实验说明:
*     通设置系统主时钟(MCLK=8Mhz ) 、辅助时钟(ACLK=8Mhz )、
*      子系统时钟(SMCLK=8Mhz )
* 编译软件:Embedded Workbench 5.3  
******************************************************************/ 

#include <MSP430x24x.h>
#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 ;
  
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值