⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 test23.c

📁 MSP430 F149的单片机 键盘 便于相应计时器的操作
💻 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 + -