我的51单片机开发板bug寻找之矩阵键盘检测用数码管来显示与LED灯的冲突,来讨论一下硬件的排查问题

在学习五一单片机开发板的时候,我学会了一个键盘检测,利用的是一个简单的交叉检测,显示第几个按键按下(数码管显示),这是一个很简单的程序。就是先来拉低行四列,再拉低列四列检测一下是否为低电平,看了一下硬件电路

 

 

 


#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
	
sbit dula=P2^6;
sbit wela=P2^7;

sbit led1 = P1^0;
sbit led2 = P1^1;
sbit led3 = P1^2;
sbit led4 = P1^3;
sbit led5 = P1^4;
sbit led6 = P1^5;
sbit led7 = P1^6;
sbit led8 = P1^7;

sbit LE=P2^5;
uchar code table[]={
	0x3f,0x06,0x5b,0x4f,
	0x66,0x6d,0x7d,0x07,
	0x7f,0x6f,0x77,0x7c,
	0x39,0x5e,0x79,0x71
	
};
	uchar temp;
	uchar num=0;
  uchar hang;
	uchar lie;
void Delay10ms()		//@11.0592MHz
{
	unsigned char i, j;

	i = 18;
	j = 235;
	do
	{
		while (--j);
	} while (--i);
}

void display(uchar num)
{
	wela=1;
	P0=0x00;
	wela=0;
	dula=1;
	P0 = table[num];
	dula=0;
	Delay10ms();
	
}
void keyscan()
{

	P3=0xF0;    //先拉低行4个

	temp=P3;
	switch(temp)
	{
		case 0xE0:
		     lie=0;
		     break;
		case 0xD0:
			   lie=1;
		     break;
		case 0xB0:
			   lie=2;
		     break;
		case 0x70:
			   lie=3;
		     break;
		default:
			lie=0;
			break;
	}

		P3=0x0F; //再拉低列四个
		temp=P3;
	 switch(temp)
	{
		case 0x0E: 
		     num=lie;
		     break;
		case 0x0D:
			   num=lie+4;
		     break;
		case 0x0B:
			   num=lie+8;
		     break;
		case 0x07:
			   num=lie+12;
		     break;
		default:
			num=0;
			break;
	}
		
	
		
}

void main()
{
	

	while(1)
	{

	keyscan();
	display(num);

	}
}

能够正常实现功能

 

 

 看似好像没什么问题,根据原理图进行编程,不是有手就行哈,可是我发现那个P1口接的那几个灯怎么是在亮呢,把他关掉,看的都糟心。根据原理图,把他全部置1就可以关掉了

 主函数的修改

void main()
{
	
  
	while(1)
	{

	keyscan();
	display(num);

	led1=1;
		//Delay10ms();
  led2=1;
		//Delay10ms();
  led3=1;
		//Delay10ms();
  led4=1;
		//Delay10ms();
  led5=1;
		//Delay10ms();
  led6=1;
		//Delay10ms();
  led7=1;
		//Delay10ms();
  led8=1;		
		//Delay10ms();
	}
}

可是,灯还在那里亮着。。。。。。。。

 先用仿真调试一下

没有任何问题。。。。。

但是我怀疑是不是或者说是LED灯坏了,所以先把键盘检测先注释掉,单单亮个灯先

void main()
{
	
  
	while(1)
	{

	//keyscan();
	//display(num);

	led1=1;
		//Delay10ms();
  led2=1;
		//Delay10ms();
  led3=1;
		//Delay10ms();
  led4=1;
		//Delay10ms();
  led5=1;
		//Delay10ms();
  led6=1;
		//Delay10ms();
  led7=1;
		//Delay10ms();
  led8=1;		
		//Delay10ms();
	}
}

可是灯又能正常的全灭,这把我整无语了,我开始翻之前的原理图,去寻找是不是有引脚有问题,我现在的初步判断是P3口与P1口之间有哪个硬件出现了某些问题。(我开始去思考硬件方面的问题)

我开始排查使得P3与P1口互相连接的硬件电路,有没有可能是烧坏了?

这时候,只有两个电路模块有可能,那就是DAC和ADC模块。

 这时候,我一个动作使得整个局面豁然开朗,我去扭了一下那个ADC的滑动发现这个旋钮居然能控制灯能否亮,把我给整懵了。。。。

 

我从此判断,应该是ADC芯片出了问题,联想到我之前借了这款单片机给一位老哥,回来的时候连51单片机都插反了,应该是烧坏了ADC的这颗芯片,那怎么验证呢?

很简单

拔掉!!!

 

 

完美实现流水功能,这时就实现了流水灯与键盘检测功能的全部实现。

稍稍改了一下主程序,也算是有了一个LED灯显示的功能

void main()
{
	

	while(1)
	{
  P1=num;
	keyscan();
	display(num);


	}
}

实现效果

 

 总结:

嵌入式就是如此,要软硬结合同时排查功能,有时候真的如此,单单是一个功能能够实现,反而组合在一起反而就不行了,总结,敢于尝试,动手动手动手!!!

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值