下面的程序是想实现 顺序按下矩阵键盘后,在数码管上依次显示0~F,不按显示 — 但是现在不管按什么键都只显示— 电路原理图如下
程序如下
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
unsigned char code smgDx[17]={0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,0x80,0x90,
0x88,0x83,0xc6,0xa1,0x86,0x8e,0xbf};//0~F - 段码
void DelayMs(uint xms);
uchar ScanKey(void);
void main()
{
P2 = 0x00;
while(1)
{
P0 = smgDx[ScanKey()];
}
}
uchar ScanKey(void)
{
uchar i, temp, m, n;//m为列号,n为行号
bit find = 0;//有键按下标志
P1 = 0xff;
for(i=0; i<4; i++)
{
P1 = 0xef<<i;//逐列送低电平
temp = ~P1;
temp &= 0x0f;//屏蔽高四位,得出行值
while(temp!=0x00)//判断有无按键按下,为0则无键按下
{
DelayMs(10);//消抖
temp = ~P1;
temp &= 0x0f;//屏蔽高四位,得出行值
while(temp!=0x00)
{
find = 1;//有键按下
m = i;//列值
switch(temp)
{
case 0x01: n=0; break; //第0行
case 0x02: n=1; break; //第1行
case 0x04: n=2; break; //2
case 0x08: n=3; break; //3
default: break;
}
}
}
if(!find) return 16;
return (n*4+m);
}
}
void DelayMs(uint xms)
{
uint i,j;
for(i=0;i<xms;i++)
for(j=0;j<110;j++);
}
请大家帮我看看哪里出了问题,先谢谢各位了。
|