3X3键盘扫描-砸门班长的代码 大家参考一下 我没试过

3X3键盘扫描

一、  任务

利用8255的PC口实现3X3键盘扫描(硬件电路参见3X3KEY_8255.DSN)。当1~8号键独立按下时,连接在PA口对应的LEDx点亮(即1号键按下时LDE1亮,2号键按下时LDE2亮),当9号键按下时,所有LED点亮,当没有键按下时,所有LED熄灭。

二、  设计参考:

 
 

① 8255控制字格式:

② 8255端口地址分配:

PA                       0000H

PB                       0400H

PC                       0800H

控制口                 0C00H

#include<absacc.h>
#include<reg51.h>
#define uchar unsigned char
#define init_8255 XBYTE[0x7fff]
#define PA XBYTE[0x73ff]
#define PB XBYTE[0x7bff]
uchar key_date=9,key,key_temp;

uchar keytab[]={0xdb,0xdd,0xde,0xbb,0xbd,0xbe,0x7b,0x7d,0x7e};

void delay(uchar date)
{
	uchar i,j;
	for(i=date;i>0;i--)
		for(j=110;j>0;j--);
}

void disply(uchar date)
{
	switch(date)
	{
		case 0: PA = 0xfe; break;
		case 1: PA = 0xfd; break;	
		case 2: PA = 0xfb; break;
		case 3: PA = 0xf7; break;
		case 4: PA = 0xef; break;
		case 5: PA = 0xdf; break;
		case 6: PA = 0xbf; break;
		case 7: PA = 0x7f; break;
		case 8: PA = 0x00; break;		
		default : PA = 0xff; break;
	}
}

void keyfun()
{
	uchar code_h,code_l,i;
	PB=0xf0;
	code_l=PB;
	code_l = code_l&0xf0;
	if(code_l!=0xf0)
	{
		delay(10);
		code_l=PB;
		code_l = code_l&0xf0;		
		if(code_l!=0xf0)
		{
			code_h = 0xfe;
			for(i=0;i<3;i++)
			{
				PB = code_h;
				code_l = PB;
				code_l = code_l&0xf0;		
				if(code_l == 0xf0)
				{
					code_h=(code_h<<1)|0x01;
				}
				else break;
			}	
			code_h=code_h&0x0f;
			key=code_h+code_l;
			for(key_date=0;key_date<9;key_date++)
			{
				if(key==keytab[key_date])
				{
					break;
				}
			}	
			PB = 0xe8;
			key_temp = PB;
			while(key_temp!=0xe8)
			{		
				key_temp = PB;
				disply(key_date);
			}
		}
	}
}

void main()
{
		init_8255 = 0x80;
		while(1)
		{
			keyfun();
			PA = 0xff;
		}
}

自己参考一下哈哈 双一流班长写的本人没有仿真过,因为仿真坏了。大家自行参考,可能会有点问题,源码不行的话,可以试着修改宏定义中几个值的地址口,改成题目给出的地址再试试。完了





猜你喜欢

转载自blog.csdn.net/qq_31131773/article/details/80612192