本帖最后由 zg779660079 于 2012-7-27 18:52 编辑
在百度发现了一个非常牛b的程序,看了看没看懂,主要是在按下一个键盘后P3口怎么变化的和我理解的也许不一样,求教高手指点,帮我分析下键盘扫描那段程序,谢谢!
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;
sbit wela=P2^7;
uchar num;
uchar bai,shi,ge;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x7c};
void delayms(uint z)
{
uchar i,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--);
}
void display(uchar bai,uchar shi,uchar ge)
{
wela=1;
P0=0xfe;
wela=0;
dula=1;
P0=table[bai];
dula=0;
delayms(5);
wela=1;
P0=0xfd;
wela=0;
dula=1;
P0=table[shi];
dula=0;
delayms(5);
wela=1;
P0=0xfb;
wela=0;
dula=1;
P0=table[ge];
dula=0;
delayms(5);
}
uchar keyscan()
{
uchar cord_h,cord_l;
P3=0x0f;
cord_h=P3&0x0f;
if(cord_h!=0x0f)
{
delayms(100);
cord_h=P3&0x0f;
if(cord_h!=0x0f)
{
P3=cord_h|0xf0;
cord_l=P3&0xf0;
return(cord_h+cord_l);
}
}
return (0xff);
}
void main()
{
uchar key;
while(1)
{
key=keyscan();
switch(key)
{
case 0xee:num=0;break;
case 0xde:num=1;break;
case 0xbe:num=4;break;
case 0x7e:num=9;break;
case 0xed:num=16;break;
case 0xdd:num=25;break;
case 0xbd:num=36;break;
case 0x7d:num=49;break;
case 0xeb:num=64;break;
case 0xdb:num=81;break;
case 0xbb:num=100;break;
case 0x7b:num=121;break;
case 0xe7:num=144;break;
case 0xd7:num=169;break;
case 0xb7:num=196;break;
case 0x77:num=225;break;
}
bai=num/100;
shi=num%100/10;
ge=num%10;
display(bai,shi,ge);
}
} |