80C51矩阵键盘相关代码和电路设计

本文主要记录两种方式:

1 扫描法


#include<reg51.h>
//扫描法
//键盘扫描用P0口,数码管显示用P2口
	#define keyport P0
	#define seg7port P2
	//共阳极八段数码管编码
	unsigned char coding[]={
	0xc0,0xf9,0xa4,0xb0,
	0x99,0x92,0x82,0xf8,
	0x80,0x90,0x88,0x83,
	0xc6,0xa1,0x86,0x8e
	};
	void display(unsigned char temp);
	void delay(unsigned int i);
	void main()
	{
		while(1)
		{
		 keyport=0x0f;
		 if((keyport&0x0f)!=0x0f)
		 	{
				delay(10);//去抖动proteus仿真需要根据实际情况调节
				if((keyport&0x0f)!=0x0f)
				{
					//扫描开始
					keyport=0xef;//扫描第一列
					if((keyport&0x0f)!=0x0f)
						{  switch(keyport&0x0f){
						 	case 0x0e:	display(0); break;
						 	case 0x0d:	display(1); break;
					 	 	case 0x0b:	display(2); break;
						 	case 0x07:	display(3); break;
							}
						break;
						}
					keyport=0xdf;//扫描第二列
					if((keyport&0x0f)!=0x0f)
						{  switch(keyport&0x0f){
					 		case 0x0e:	display(4); break;
					 		case 0x0d:	display(5); break;
					 		case 0x0b:	display(6); break;
					 		case 0x07:	display(7); break;
							}
						break;
						}
			  		keyport=0xbf;//扫描第三列
					if((keyport&0x0f)!=0x0f)
						{  switch(keyport&0x0f){
					 		case 0x0e:	display(8); break;
					 		case 0x0d:	display(9); break;
					 		case 0x0b:	display(10); break;
					 		case 0x07:	display(11); break;
							}
						break;
						}
			 		keyport=0x7f;//扫描第四列
					if((keyport&0x0f)!=0x0f)
						{  switch(keyport&0x0f){
					 		case 0x0e:	display(12); break;
					 		case 0x0d:	display(13); break;
					 		case 0x0b:	display(14); break;
					 		case 0x07:	display(15); break;
							}
						break;
						}
				}
			}
		}
	}

	void delay(unsigned int i){
	unsigned char j=0;
	for(j=255;j>0;j--)
		for(;i>0;i--);
	}

	void display(unsigned char temp){
	seg7port=coding[temp];
	} 

2 线反转法


#include<reg51.h>
//线反转法
//键盘扫描用P0口,数码管显示用P2口
	#define keyport P0
	#define seg7port P2
	//共阳极八段数码管编码
	unsigned char code coding[4][4]={
	{0xc0,0xf9,0xa4,0xb0},
	{0x99,0x92,0x82,0xf8},
	{0x80,0x90,0x88,0x83},
	{0xc6,0xa1,0x86,0x8e}
	};
	unsigned char x,y;//x为行号,y为列号
	void display(unsigned char temp);
	void delay(unsigned int i);
	void main()
	{
		while(1)
		{
		 keyport=0x0f;//列输出0
		 if((keyport&0x0f)!=0x0f)//行不全为1说明有键按下
		 	{
				delay(10);//去抖动proteus仿真需要根据实际情况调节
				if((keyport&0x0f)!=0x0f)
				{
				  switch(keyport&0x0f){
				  	case 0x0e:	x=0; break; //行号为0
					case 0x0d:	x=1; break;	//行号为1
					case 0x0b:	x=2; break;	//行号为2
					case 0x07:	x=3; break;	//行号为3
					}
				  keyport=0xf0;//行输出0
				  switch(keyport&0xf0){
					case 0xe0:  y=0; break; //列号为0
					case 0xd0:	y=1; break; //列号为1
					case 0xb0:	y=2; break; //列号为2
					case 0x70:	y=3; break; //列号为3
					}
				  display(coding[x][y]);  
				}
			}
		}
	}

	void delay(unsigned int i){
	unsigned char j=0;
	for(j=255;j>0;j--)
		for(;i>0;i--);
	}

	void display(unsigned char temp){
	seg7port=temp;
	} 


  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值