越详细越好,我很急. 谢谢谢谢谢谢谢谢谢谢谢谢谢
ççè¿ä¸¤ä¸ªå§ãä¸ãvoid delay(void) //5ms
{
unsigned char a,b;
for(b=19;b>0;b--)
for(a=130;a>0;a--);
}
unsigned char scanf(void)
{
unsigned char recode,i,j;
for(i=0;i<4;i++)
{
P1=~(0x01<<i);
recode=P1>>4;
if(recode<0x0f)
{
for(j=0;j<4;j++){if(!(recode&0x01<<j))break;}
return (i<<2)+(j+1); //è¿åé®å¼ 1-16
}
delay(); //延æ¶5ms
}
return 0; //æ æé®è¿å
}äºãvoid delay() //延æ¶åç¨åº{ unsigned char n, m; for (n = 100; n > 0; n--) for (m = 300; m > 0; m--); }unsigned char Keycan(void) //æé®æ«æç¨åº P1.0--P1.3为è¡çº¿ P1.4--P1.7为å线{ unsigned char rcode, ccode; P1 = 0xF0; // åå ¨0è¡æ«æç ï¼å线è¾å ¥ if((P1&0xF0) != 0xF0) // è¥æé®æä¸ { delay();// 延æ¶å»æå¨ if((P1&0xF0) != 0xF0) { rcode = 0xFE; // éè¡æ«æåå¼ while((rcode&0x10) != 0) { P1 = rcode; // è¾åºè¡æ«æç if((P1&0xF0) != 0xF0) // æ¬è¡æé®æä¸ { ccode = (P1&0xF0)|0x0F; do{;}while((P1&0xF0) != 0xF0); //çå¾ é®éæ¾ return ((~rcode) + (~ccode)); // è¿åé®ç¼ç } else rcode = (rcode<<1)|0x01; // è¡æ«æç 左移ä¸ä½ } } } return 0; // æ é®æä¸ï¼è¿åå¼ä¸º0}
{
unsigned char a,b;
for(b=19;b>0;b--)
for(a=130;a>0;a--);
}
unsigned char scanf(void)
{
unsigned char recode,i,j;
for(i=0;i<4;i++)
{
P1=~(0x01<<i);
recode=P1>>4;
if(recode<0x0f)
{
for(j=0;j<4;j++){if(!(recode&0x01<<j))break;}
return (i<<2)+(j+1); //è¿åé®å¼ 1-16
}
delay(); //延æ¶5ms
}
return 0; //æ æé®è¿å
}äºãvoid delay() //延æ¶åç¨åº{ unsigned char n, m; for (n = 100; n > 0; n--) for (m = 300; m > 0; m--); }unsigned char Keycan(void) //æé®æ«æç¨åº P1.0--P1.3为è¡çº¿ P1.4--P1.7为å线{ unsigned char rcode, ccode; P1 = 0xF0; // åå ¨0è¡æ«æç ï¼å线è¾å ¥ if((P1&0xF0) != 0xF0) // è¥æé®æä¸ { delay();// 延æ¶å»æå¨ if((P1&0xF0) != 0xF0) { rcode = 0xFE; // éè¡æ«æåå¼ while((rcode&0x10) != 0) { P1 = rcode; // è¾åºè¡æ«æç if((P1&0xF0) != 0xF0) // æ¬è¡æé®æä¸ { ccode = (P1&0xF0)|0x0F; do{;}while((P1&0xF0) != 0xF0); //çå¾ é®éæ¾ return ((~rcode) + (~ccode)); // è¿åé®ç¼ç } else rcode = (rcode<<1)|0x01; // è¡æ«æç 左移ä¸ä½ } } } return 0; // æ é®æä¸ï¼è¿åå¼ä¸º0}
温馨提示:答案为网友推荐,仅供参考
第1个回答 2013-08-23
如果放一个具体电路就好讲了。现在只能给你说可以用两种方式来1。逐行扫描的方式2。行反转的方式这些你可以字网上找找。应该有的。