void keys_Scan()
{
uchar tmp;
P2=0x0f;
delay(5);
tmp=P2^0x0f;
switch(tmp)
{
case 1:keyno=0;break;
case 2:keyno=1;break;
case 4:keyno=2;break;
case 8:keyno=3;break;
//default:keyno=32;
}
P1=0xf0;
delay(5);
tmp=P1>>4^0x0f;
switch(tmp)
{
case 1:keyno=keyno+0;break;
case 2:keyno=keyno+4;break;
case 4:keyno=keyno+8;break;
case 8:keyno=keyno+12;
}
}
你好,谢谢你给我提供的资料,我也有同一个端口的4*4键盘扫描我会写,但是不同端口的老出错,现有一段程序,麻烦您帮我看下谢谢。以下是我的程序 :以P2.0~P2.3为列,P1.0~P1.3为先做4*4的扫描,但数码管只显示列的数。
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar code DSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
uchar Pre_keyno=32;keyno=32;
void delay(uint x)
{
uint y;
while(x--)
for(y=0;y<120;y++);
}
void keys_Scan()
{
uchar tmp;
P2=0x0f;
delay(5);
tmp=P2^0x0f;
switch(tmp)
{
case 1:keyno=0;break;
case 2:keyno=1;break;
case 4:keyno=2;break;
case 8:keyno=3;break;
//default:keyno=32;
}
P1=0xf0;
delay(5);
tmp=P1>>4^0x0f;
switch(tmp)
{
case 1:keyno=keyno+0;break;
case 2:keyno=keyno+4;break;
case 4:keyno=keyno+8;break;
case 8:keyno=keyno+12;
}
}
void main()
{
P3=0x38;
P0=0x00;
while(1)
{
if(P2^0x0f!=0x0f)keys_Scan();
if(Pre_keyno!=keyno)
{
P0=DSY_CODE[keyno];
Pre_keyno=keyno;
}
delay(100);
}
}
一周热门 更多>