在学习五一单片机开发板的时候,我学会了一个键盘检测,利用的是一个简单的交叉检测,显示第几个按键按下(数码管显示),这是一个很简单的程序。就是先来拉低行四列,再拉低列四列检测一下是否为低电平,看了一下硬件电路
#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);
}
}
实现效果
总结:
嵌入式就是如此,要软硬结合同时排查功能,有时候真的如此,单单是一个功能能够实现,反而组合在一起反而就不行了,总结,敢于尝试,动手动手动手!!!