• 已解决 73482 个问题
  • 已帮助 5993 位优秀工程师

矩阵键盘不能正常扫描

七月在野 2017-03-11 浏览量:1115

问题描述:按下第一个键有正确显示,再按下其他键时,没有应答;

对应开发板原理图

不多赘述,代码如下:

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int 
sbit beep=P1^5;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
		0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
/////延时函数////////
void delay(uint num)
{
	uint i,j;
	for(i=num;i>0;i--);				                                                                       
	 for(j=110;j>0;j--);
} 
//显示函数/////////
void display(uchar num)
{
		uint i;
	while(1)
	{
	for(i=0;i<8;i++)
	{
		switch(i)
		{
			case(0):LSC=0;LSB=0;LSA=0;break;
			case(1):LSC=0;LSB=0;LSA=1;break;
			case(2):LSC=0;LSB=1;LSA=0;break;
			case(3):LSC=0;LSB=1;LSA=1;break;
			case(4):LSC=1;LSB=0;LSA=0;break;
			case(5):LSC=1;LSB=0;LSA=1;break;
			case(6):LSC=1;LSB=1;LSA=0;break;
			case(7):LSC=1;LSB=1;LSA=1;break;
			
		}
		 P0=table[num];
		 delay(10);
		 P0=0x00;
	}
	}		
} 

 void keyscanf()
 {
 	uchar temp,key;
	P1=0x7f;
	temp=P1;
	temp=temp&0x0f;	   //原设低四位为高电平,当按键按下后,低四位必有一位变成低电平,再与0X0F做与运算,必然不会等于0x0f;
	if(temp!=0x0f)
	{
		delay(10);
		if(temp!=0x0f)
		{
			temp=P1;
			switch(temp)					  //
			{
				case 0x77:key=0;break;
				case 0x7B:key=1;break;
				case 0x7D:key=2;break;
				case 0x7E:key=3;break;
			}
			while(temp!=0x0f)         //当不符合条件时,跳出循环
			{
				temp=P1;
				temp=temp&0x0f;
			}
			display(key);	
		}
	}


	P1=0xbf;
	temp=P1;
	temp=temp&0x0f;
	if(temp!=0x0f)
	{
		delay(10);
		temp=P1;
		temp=temp&0x0f;
		if(temp!=0x0f)
		{
			temp=P1;
			switch(temp)
			{
				case 0xb7:key=4;break;
				case 0xbb:key=5;break;
				case 0xbd:key=6;break;
				case 0xbe:key=7;break;
			}
			while(temp!=0x0f)
			{
				temp=P1;
				temp=temp&0x0f;
			}
			display(key);	
		}
	}


	P1=0xdf;
	temp=P1;
	temp=temp&0x0f;
	if(temp!=0x0f)
	{
		delay(10);
		temp=P1;
		temp=temp&0x0f;
		if(temp!=0x0f)
		{
			temp=P1;
			switch(temp)
			{
				case 0xd7:key=8;break;
				case 0xdb:key=9;break;
				case 0xdd:key=10;break;
				case 0xde:key=11;break;
			}
			while(temp!=0x0f)
			{
				temp=P1;
				temp=temp&0x0f;
			}
			display(key);
		}
	}


	P1=0xef;
	temp=P1;
	temp=temp&0x0f;
	if(temp!=0x0f)
	{
		delay(10);
		temp=P1;
		temp=temp&0x0f;
		if(temp!=0x0f)
		{
			temp=P1;
			switch(temp)
			{
				case 0xe7:key=12;break;
				case 0xeb:key=13;break;
				case 0xed:key=14;break;
				case 0xee:key=15;break;
			}
			while(temp!=0x0f)
			{
				temp=P1;
				temp=temp&0x0f;
			}
			display(key);
		}
	}				   
 }

 void main()
 {
 	while(1)
	{
		keyscanf();	   //一直执行键盘扫描程序
	}
 }

0 0 收起

我来回答

上传资料:
选择文件 文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
  • 基本上讀Register還是宣告volatile,比較保險,消抖要先讀值不是後面讀,這樣沒意義XD

    volatile uchar temp;
    
    void keyscanf()
     {
     	uchar temp,key;
    	P1=0x7f;
    	temp=P1;
    	temp=temp&0x0f;	   //原设低四位为高电平,当按键按下后,低四位必有一位变成低电平,再与0X0F做与运算,必然不会等于0x0f;
    	if(temp!=0x0f)
    	{
    		delay(10);
    		temp=P1; //再次讀值,消抖判斷
                    temp=temp&0x0f;
    		if(temp!=0x0f)
    		{
    			switch(temp)					  //
    			{
    				case 0x77:key=0;break;
    				case 0x7B:key=1;break;
    				case 0x7D:key=2;break;
    				case 0x7E:key=3;break;
    			}
    			while(temp!=0x0f)         //当不符合条件时,跳出循环
    			{
    				temp=P1;
    				temp=temp&0x0f;
    			}
    			display(key);	
    		}
    	}
    
    
    	P1=0xbf;
    	temp=P1;
    	temp=temp&0x0f;
    	if(temp!=0x0f)
    	{
    		delay(10);
    		temp=P1;
    		temp=temp&0x0f;
    		if(temp!=0x0f)
    		{
    			switch(temp)
    			{
    				case 0xb7:key=4;break;
    				case 0xbb:key=5;break;
    				case 0xbd:key=6;break;
    				case 0xbe:key=7;break;
    			}
    			while(temp!=0x0f)
    			{
    				temp=P1;
    				temp=temp&0x0f;
    			}
    			display(key);	
    		}
    	}
    
    
    	P1=0xdf;
    	temp=P1;
    	temp=temp&0x0f;
    	if(temp!=0x0f)
    	{
    		delay(10);
    		temp=P1;
    		temp=temp&0x0f;
    		if(temp!=0x0f)
    		{
    			switch(temp)
    			{
    				case 0xd7:key=8;break;
    				case 0xdb:key=9;break;
    				case 0xdd:key=10;break;
    				case 0xde:key=11;break;
    			}
    			while(temp!=0x0f)
    			{
    				temp=P1;
    				temp=temp&0x0f;
    			}
    			display(key);
    		}
    	}
    
    
    	P1=0xef;
    	temp=P1;
    	temp=temp&0x0f;
    	if(temp!=0x0f)
    	{
    		delay(10);
    		temp=P1;
    		temp=temp&0x0f;
    		if(temp!=0x0f)
    		{
    			switch(temp)
    			{
    				case 0xe7:key=12;break;
    				case 0xeb:key=13;break;
    				case 0xed:key=14;break;
    				case 0xee:key=15;break;
    			}
    			while(temp!=0x0f)
    			{
    				temp=P1;
    				temp=temp&0x0f;
    			}
    			display(key);
    		}
    	}				   
     }
    


    • 发布于 2017-03-12
    • 举报
    • 评论 0
    • 0
    • 0

其他答案 数量:3

  • 74HC573没有位选正常使能,添加响应函数
    • 发布于2017-03-11
    • 举报
    • 评论 0
    • 0
    • 0

  • 你这个延时函数怎么这样写?

    另外,你这个问题还是说一次正常一次不正常,说明按键查找那部分程序没问题,

    不过你每次触发中断之后应该要消除掉中断触发的标志,你这个部分程序里面没有体现啊

    • 发布于2017-03-12
    • 举报
    • 评论 0
    • 0
    • 0

相关问题

问题达人换一批

矩阵键盘不能正常扫描