这个是单独的键盘扫描子程序,你可以借鉴一下..
我使用的P3口接的矩阵键盘,你可以根据需要适当改变. 还要注意我的键值可能和你不一样,这就要看你的硬件电路是怎么设计的了.
uint keyscan(void)//键盘扫描函数,使用行列反转扫描法
{
uint cord_h,cord_l,cord;//行列值
P3=0x0f; //行线输出全为0
cord_h=P3&0x0f; //读入列线值
if(cord_h!=0x0f) //先检测有无按键按下
{
delay(); //去抖
if(cord_h!=0x0f)
{
cord_h=P3&0x0f; //读入列线值
P3=cord_h|0xf0; //输出当前列线值
cord_l=P3&0xf0; //读入行线值
for(;;)
{
P3=0x0f;
if(P3==0x0f)
break;
}
P10=0;
delayring();
P10=1;
switch(cord_h+cord_l)
{
case 0x7e:P0=led[1];cord=1;break;
case 0x7d:P0=led[2];cord=2;break;
case 0x7b:P0=led[3];cord=3;break;
case 0x77:P0=led[4];cord=4;break;
case 0xbe:P0=led[5];cord=5;break;
case 0xbd:P0=led[6];cord=6;break;
case 0xbb:P0=led[7];cord=7;break;
case 0xb7:P0=led[8];cord=8;break;
case 0xde:P0=led[9];cord=9;break;
case 0xdd:P0=led[0];cord=0;break;
case 0xee:cord=13;break;
case 0xed:cord=14;break;
case 0xeb:cord=15;break;
case 0xe7:cord=16;break;
}
P2=h;
return(cord);//键盘最后组合码值
}
}return(0xff); //返回该值
}
如果有按键,就会返回按键值, 如果没按键则返回 0XFF, 通过读取返回值可以判断是否有按键, 在程序开头可以加上全局变量的断码表, 这就看你用的是共阴的还是共阳的数码管了~~
祝您的问题早日得到解决. 谢谢
我自己写的,有共阴的,共阳的,给你看看,希望对你有用
共阴的如下:
#include
#define uchar unsigned char
#define uint unsigned int
char code zhi[]={0xee,0xed,0xeb,0xe7,0xde,0xdd,0xdb,0xd7,
0xbe,0xbd,0xbb,0xb7,0x7e,0x7d,0x7b,0x77,};
char code shu[]={0x3f,0x66,0x7f,0x39,0x06,0x6d,0x6f,0x5e,
0x5b,0x7d,0x77,0x79,0x4f,0x07,0x7c,0x71,};
uchar temp,num1,i;
void delay(uint z)
{
uchar x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void main()
{
while(1)
{
P1=0xf0;
delay(10);
if(P1!=0xf0)
{
temp=P1;
if(P1==temp)
{
P1=0x0f;
num1=P1|temp;
for(i=0;i<16;i++)
{
if(num1==zhi[i])
{
P0=shu[i];
break;
}
}
}
}
}
}
共阳的如下,
共阳的我是用三极管驱动的,所以只要控制基极,给他低电平就可以让是对应管亮,
这里是用四位的数码管,四个数码管显示的是一样的
#include
#define uchar unsigned char
#define uint unsigned int
char code zhi[]={0xee,0xed,0xeb,0xe7,0xde,0xdd,0xdb,0xd7,
0xbe,0xbd,0xbb,0xb7,0x7e,0x7d,0x7b,0x77,};
char code shu[]={0xb0,0xf8,0x83,0x8e,0xa4,0x82,0x88,0x86,
0xf9,0x92,0x90,0xa1,0xc0,0x99,0x80,0xc6,};
uchar temp,num,i;
void delay(uint z)
{
uchar x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void main()
{
while(1)
{
P2=0xe0;
P1=0xf0;
delay(10);
if(P1!=0xf0)
{
temp=P1;
if(P1==temp)
{
P1=0x0f;
num=P1|temp;
for(i=0;i<16;i++)
{
if(num==zhi[i])
{
P0=shu[i];
break;
}
}
}
}
}
}