📄 test23.c
字号:
/*4X4键盘的扫描程序,使用中断的算法进行实现的*/
#include<msp430x14x.h>
const unsigned char Seg[]={
0x84, //0
0xbd, //1
0xe0, //2
0xb0, //3
0x99, //4
0x92, //5
0x82, //6
0xbc, //7
0x80, //8
0x90, //9
0xa0, //a
0x83, //b
0xc6, //c
0xa1, //d
0xc2, //e
0xca, //f
};
unsigned char result=0;
void ShowKey(void);
void Delay(unsigned int i);
void main(void)
{
WDTCTL=WDTPW+WDTHOLD;
P5DIR=0x0f;
P4DIR=0xff;
P4OUT=0xff; //Show nothing at first
P1DIR=0xf0;
P1OUT=0x00;
P1IE=0x0f;
P1IES=0x0f;
P1IFG&=~0x0f;
_EINT();
for(;;)
{
//LPM3; //这里是不能使用低功耗来关闭CPU的,因为数码管使用的
//是动态扫描的方法,是不能关闭CPU的,除非使用定时器
//定期来唤醒CPU解决
ShowKey();
}
}
#pragma vector=PORT1_VECTOR
__interrupt void Port1(void)
{
char low;
char i;
switch(P1IFG&0x0f)
{
case 0x01:low=1;break;
case 0x02:low=2;break;
case 0x04:low=3;break;
case 0x08:low=4;break;
}
//先关闭中断,这里是非常重要的,因为下面的中断处理函数的
//算法的原因(或许是列扫描的原因),必须关闭中断,否则会有
//中断的嵌套,得不到最终的结果的
P1IE&=0xf0;
for(i=0;i<4;i++)
{
P1OUT=BIT4<<i;
if((P1IN&0x0f) == 0x0f)
{
result=4*i+low;
break;
}
}
P1OUT=0x00;
while((P1IN&0x0f) != 0x0f)
/*do nothing*/;
P1IE|=0x0f; //打开中断,并清除中断标志
P1IFG&=0xf0;
//LPM3_EXIT;
result=17-result;
}
void ShowKey()
{
if(result<10)
{
P5OUT=0x04;
P4OUT=Seg[0];
Delay(1000);
P5OUT=0x08;
P4OUT=Seg[result];
Delay(1000);
}else{
P5OUT=0x04;
P4OUT=Seg[result/10];
Delay(1000);
P5OUT=0x08;
P4OUT=Seg[result%10];
Delay(1000);
}
}
void Delay(unsigned int i)
{
unsigned int temp =i;
for(temp=i;temp>0;temp--)/*do nothing*/;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -