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