/********各位大虾为什么显示出了毛病,首先P1口接数码管的数据口,P0接矩阵键盘
以下程序显示可以,但是大家看看没有松手检测,所以就容易误判,但是加了
松手检测部分也有问题了,按下去时候未松开此时显示就出故障了,请各位分析下*/
#include<reg52.h>
//#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
void delayms(uchar);/****延时声明******/
void display(uchar dat);/***显示声明*****/
void keyscan(); /******键盘扫描声明****/
sbit LS138A=P2^2; /*****led的位选******/
sbit LS138B=P2^3; /*****led的位选******/
sbit LS138C=P2^4; /*****led的位选******/
void keydown(void);
uchar code dis[] = { 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0XD8,0x80,0x90,
0x88,0x83,0xc6,0xa1,0x86,0x8e,0x89,0x86,0xc7,0xff};
uchar temp,num,wel[2],key,disbuf;
void main()
{
while(1)
{
P0=0xFF;
keydown();
display(disbuf);
}
}
void delayms(uchar ms)
{
uchar i;
while(ms--)
for(i=0;i<125;i++);
}
void keydown(void) //*****判断是否有键按下*****
{
P0=0xF0;
if(P0!=0xF0)
{
keyscan();
//while(P0=0xf0); //松手检测部分,要了这个就显示出问题了
}
}
void keyscan() //****键盘扫描***
{
temp = 0;
P0=0xF0; //高四位输入 行为高电平 列为低电平
delayms(1);
temp=P0; //读P1口
temp=temp&0xF0; //屏蔽低四位
temp=~((temp>>4)|0xF0);
if(temp==1) // p1.4 被拉低
key=0;
else if(temp==2) // p1.5 被拉低
key=1;
else if(temp==4) // p1.6 被拉低
key=2;
else if(temp==8) // p1.7 被拉低
key=3;
else
key=16;
P0=0x0F; //低四位输入 列为高电平 行为低电平
delayms(1);
temp=P0; //读P1口
temp=temp&0x0F;
temp=~(temp|0xF0);
if(temp==2) // p1.1 被拉低
key=key+0;
else if(temp==4) // p1.2 被拉低
key=key+4;
else if(temp==8) // p1.3 被拉低
key=key+8;
else
key=16;
disbuf=key;
}
void display(uchar dat)
{
uchar j;
wel[0]=dis[dat/10];
wel[1]=dis[dat%10];
for(j=0;j<2;j++)
{
P1=wel[j];//****数据口****
switch(j)
{
case 0:LS138A=0; LS138B=0; LS138C=0; break;
case 1:LS138A=1; LS138B=0; LS138C=0; break;
}
delayms(1);
}
} |