借鉴了别人的键盘部分,发现其他都还可以,为什么我按清楚就不正确了
按了个 8 8 8,清掉一个8 显示8 8,再按其他的建 9,结果显示 8 9,按道理说该是显示 8 8 9才对,看了下这时显示的i的值是 1,不是2 ,肯定是删除时i这个变量变了,按照这个输的数字 三个数按完后i的值是3,按了删除 该是2 这样才会显示 8 8 9没看明白怎么就变了呢
void keyscan(void)
{
unsigned char temp;
unsigned char result;
keys=0;
PORTC=0X7F; ////C7输出低电平,其他三位输出高电平 C7是列线
asm("nop"); //插入一定延时,确保电平稳定
result=PORTC; //读回C口高4位结果
result=result&0x0f; //清除高4位
if(result!=0x0f) //判断低4位是否为全1(全1代表没按键按下)
{
result=result|0x70; //否,加上高4位0x70,做为按键扫描的结果
switch(result)
{
case 0x77: keys=64;while((PORTC&0x0f)!=0x0f);break;//ent
}
}
else //是,改变高4位输出,重新判断是否有按键按下
{
PORTC=0Xbf; //C6输出低电平,其他三位输出高电平 C6是列
asm("nop"); //插入一定延时,确保电平稳定
result=PORTC; //读回C口结果
result=result&0x0f; //清除高4位
if(result!=0x0f) //判断低4位是否为全1(全1代表没按键按下)
{
result=result|0xb0; //否,加上高4位0xb,做为按键扫描的结果
switch(result)
{
case 0xb7: keys=16;LCD();while((PORTC&0x0f)!=0x0f);break;//set
case 0xbe: keys=6;l_tmpdate1=6; displaydata[7-i]=6;i++;LCD();while((PORTC&0x0f)!=0x0f);break;//6
case 0xbd: keys=3;displaydata[7-i]=3;i++;LCD();while((PORTC&0x0f)!=0x0f);break;//3
case 0xbb: keys=9;displaydata[7-i]=9;i++;LCD();while((PORTC&0x0f)!=0x0f);break;//9
}
}
else //是,改变高4位输出,重新扫描
{
PORTC=0Xdf; //C5输出低电平,其他三位输出高电平
asm("nop"); //插入一定延时,确保电平稳定
result=PORTC; //读回C口高4位结果
result=result&0x0f; //清除高4位
if(result!=0x0f) //判断低4位是否为全1(全1代表没按键按下)
{
result=result|0xd0; //否,加上高4位0x0d,做为按键扫描的结果
switch(result)
{
case 0xde: keys=1;displaydata[7-i]=1;i++;LCD();while((PORTC&0x0f)!=0x0f);break;//1
case 0xdd: keys=2;displaydata[7-i]=2;i++;LCD();while((PORTC&0x0f)!=0x0f);break;
//2
case 0xdb: keys=4;displaydata[7-i]=4;i++;LCD();while((PORTC&0x0f)!=0x0f);break;//4
case 0xd7: keys=5;displaydata[7-i]=5;i++;LCD();while((PORTC&0x0f)!=0x0f);break;//5
}
}
else //是,改变高4位的输出,重新扫描
{
PORTC=0Xef; //C4输出低电平,其他三位输出高电平
asm("nop"); //插入一定延时,确保电平稳定
result=PORTC; //读回C口高4位结果
result=result&0x0f;//清除高4位
if(result!=0x0f) //判断低四位是否为全1(全1代表没有按键按下)
{
result=result|0xe0;//否,加上高4位0x0e,做为按键扫描的结果
switch(result)
{
case 0xe7: keys=32;i--;while((PORTC&0x0f)!=0x0f);break;//del 清除键
case 0xeb:keys=0;displaydata[7-i]=0;i++;LCD();while((PORTC&0x0f)!=0x0f);break;//0
case 0xee: keys=7;displaydata[7-i]=7;i++;LCD();while((PORTC&0x0f)!=0x0f);break;//7
case 0xed: keys=8;displaydata[7-i]=8;i++;LCD();while((PORTC&0x0f)!=0x0f);break;//8
}
}
else //是,全部按键扫描结束,
{
result=0xff; //扫描结果为0xff,做为没有按键按下的标志
}
}
}
}
result;
}
顺便弱弱的问下 连续按怎么实现的啊 这个没有这个功能撒 |