矩阵键盘proteus仿真+程序(行列扫描法)

1.要求:

        按下4x4矩阵按键,共阳数码管显示按键代表的数字。

        1    2   3   4

        5    6   7   8

        9   10 11 12

        13 14 15 16

2.proteus电路
2.理论:

          将P3口低四位做行线,高四位做列线。先给P3口为0x0F。

        <1>.判断按钮是否按下。     

                一直判断P3口等不等于0x0F,若不等于,则有按钮按下。

        <2>.找出哪个按钮被按下。     

                本来低四位是 0000 ,现在给  1000,如果是第一行的按钮被按下,那么再判断c1,c2,c3,c4哪个等于 1,找出即为被按下的那个。然后第二行,第三行循环此操作。

3.代码
#include<reg51.h>
sbit c1 = P3^4;
sbit c2 = P3^5;
sbit c3 = P3^6;
sbit c4 = P3^7;
sbit wei1 = P2^0;
sbit wei2 = P2^1;
unsigned char code duan[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};   //0-9
void delay(unsigned char i){
	unsigned char j=124;
	while(i--){
		while(j--) ;
	}
}
void printf(unsigned char num){
	P0 =  duan[num%10];
	wei1 = 0;
	wei2 = 1;
	delay(1); 
	P0 = 0xff;	
	P0 = duan[num/10];
	wei1 = 1;
	wei2 = 0;
	delay(1);
	P0 = 0xff;
}
int checkBut(){
   	  unsigned char i,temp;
	  P3 = 0xfe;
	  for(i=0;i<4;i++){
	  	 //第一行
	  //r1 = 1;r2 = 0;r3 = 0; r4 = 0;
	  //temp = ~(P3 & 0xfe) & 0x0f;
	 
	  if(c1 == 0){
	  	temp = 1+i*4; //第i行第一列被按下
		break;
	  }
	  if(c2 == 0){
	  	temp = 2+i*4; //第i行第二列被按下
		break;
	  }
	  if(c3 == 0){
	  	temp = 3+i*4; //第i行第三列被按下
		break;
	  }
	  if(c4 == 0){
	  	temp = 4+i*4; //第i行第四列被按下
		break;
	  }
	   P3 = ((P3<<1) | 0x01);
	 }
	 return temp;
	 
}
void main(){
	unsigned char temp = 0,i;
	P3 = 0xf0;

	while(1){
		
		if(P3 != 0xf0){
			//delay(10); //消抖
			if(P3 != 0xf0){
			   temp = checkBut();
			  	
			   P3 = 0xf0;
			}		
		}else{
			printf(temp);
		}	
	}
}
4.结果

         

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值