并行口实现数字0~9、A~F、L、U、P、n总共19个键盘,将按键的结果用7段数码管(例如:7SEG-MPX-CA-BLUE)显示(可选——按键控制移位)出来

要求:掌握动态显示、动态扫描键盘的工作原理及硬、软件的设计、调试方法, 掌握80C51接口硬件电路设计方法及软件编程方法,了解80C51外部中断的使用和编程方法

电路图:

并行口实现数字0~9、A~F、L、U、P、n总共19个键盘,将按键的结果用7段数码管(例如:7SEG-MPX-CA-BLUE)显示(可选——按键控制移位)出来_第1张图片

#include
#define uchar unsigned char
#define uint unsigned int 

//0-9,A-F,LUPN
uchar code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,
					   0x92,0x82,0xf8,0x80,0x90,
					   0x88,0x83,0xc6,0xa1,0x86,
					   0x8e,0xc7,0xc1,0x8c,0xc8,0xFF};
//上次按键和当前按键序号,改矩阵中序号范围为0-19,20表示无按键
uchar Pre_KeyNo=20,KeyNo=20;

//延时子程序
void Delay(uint ms)
{
	uchar t;
	while(ms--)
		for(t=0;t<120;t++);
}

//键盘扫描程序
void Keys_Scan()
{
	uchar Tmp;
	//P1端低四位接列、列的判断
	P1=0x0F;
	P3=0xE0;
	Delay(1);
	Tmp=P1^0x0F;
	switch(Tmp)
	{
		case 1:	KeyNo=0;break;
		case 2: KeyNo=1;break;
		case 4: KeyNo=2;break;
		case 8: KeyNo=3;break;
		default:KeyNo=20;//无键按下
	}
	//P3端口0-4五位接行,行的判断
	//翻转进行判断
	P1=0xF0;
	P3=0x1F;
	Delay(1);
	Tmp=P3^0x1F;
	switch(Tmp)
	{
		case 1:	KeyNo+=0;break;
		case 2: KeyNo+=4;break;
		case 4: KeyNo+=8;break;
		case 8: KeyNo+=12;break;
		case 16:KeyNo+=16;break;
		default:break;
	}
}

void main()
{
	P0=0xFF;
	while(1)
	{
	//	P1=0xf0;
	//	if(P1!=0xF0)
			Keys_Scan();
		if(Pre_KeyNo!=KeyNo)
		{
			P0=DSY_CODE[KeyNo];
			Pre_KeyNo=KeyNo;
		}
		Delay(100);
	}

}


你可能感兴趣的:(单片机89C51)