|
P1.0~P1.3接行 P1.4~P1.7接列
#include
#define uchar unsigned char
#define uint unsigned int
uchar num,temp,num1;
uchar i=0,j=0;
uchar code table[]={0x02,0X9F,0x25,0x0D,0x99,0x49,0x40,0x1F,0x00,0x08 };
//延时函数
void delay(uint i)
{
uint j;
for(;i>0;i--)
for(j=100;j>0;j--);
}
//主函数
main()
{
uchar key;
while(1)
{
key=keyscan();
delay(5);
}
}
//键盘扫描函数
uchar keyscan()
{
uchar code_h; //行扫描。
uchar code_l; //列扫描。
P1=0xf0; //P1.0~P1.3发全0,准备读列状态
if((P1&0Xf0))!=0xf0) //如果P1.4~p1.7不全位0,怎有键被按下
{
delay();
if((P1&0XF0))!=0xf0) //确认有键按下
{
code_h=0xfe; //P1.0置为0,开始行扫描
while((code_h&0x10)!=0xf0) //判断是不是最后1行,若不是,继续扫描
{
P1=code_h; //P1口输出行扫描
if((P1&0XF0)!=0xf0) //如果P1.4~P1.7不全1,该行有键按下
{
code_1=(P1&0XF0|0X0F) ; //保留P1搞四位,第四位变为1,作为列值。
return((~code_h)+(~code_l)); //键码值=行扫描值+列扫描值,返回主程序
}
else //若该行无键按下,行扫描左移,扫描下一行
code_h=(code_h<<1)|0x01;
}
}
}
}
return (0); //无键按下,返回0.
为什么while((code_h&0x10)!=0xf0) 可以判断判断是不是最后1行呢,
|
|