关于矩阵键盘扫描代码的问题
时间:10-02
整理:3721RD
点击:
这是一个例程代码,注释里的是我写的和代码不一样的地方,我想知道注释的那几行原例程的写法有什么意义?
unsigned char KeyScan(void)
{
unsigned char cord_h,cord_l;
KeyPort = 0x0f;
cord_h = KeyPort&0x0f; // cord_h = 0x0f;
if (cord_h != 0x0f) // if (KeyPort != 0x0f);
{
DelayMs(10);
if ((KeyPort & 0x0f) != 0x0f) // if (KeyPort != 0x0f);
{
cord_h = KeyPort & 0x0f;
KeyPort = cord_h | 0xf0; // KeyPort = 0xf0;
cord_l = KeyPort & 0xf0;
while((KeyPort&0xf0)!=0xf0); // while (KeyPort != 0xf0);
return(cord_h+cord_l);
}
}return(0xff);
}
目前我对 KeyPort&0x0f 的猜测是:编译器会对代码进行优化,程序读取KeyPort的值会从寄存器读取而不是读取IO口,因此用 KeyPort&0x0f 能够避免寄存器被意外修改的情况?是这样吗?
那么 例程用KeyPort = cord_h | 0xf0 而不是 KeyPort = 0xf0 是什么原因呢?
unsigned char KeyScan(void)
{
unsigned char cord_h,cord_l;
KeyPort = 0x0f;
cord_h = KeyPort&0x0f; // cord_h = 0x0f;
if (cord_h != 0x0f) // if (KeyPort != 0x0f);
{
DelayMs(10);
if ((KeyPort & 0x0f) != 0x0f) // if (KeyPort != 0x0f);
{
cord_h = KeyPort & 0x0f;
KeyPort = cord_h | 0xf0; // KeyPort = 0xf0;
cord_l = KeyPort & 0xf0;
while((KeyPort&0xf0)!=0xf0); // while (KeyPort != 0xf0);
return(cord_h+cord_l);
}
}return(0xff);
}
目前我对 KeyPort&0x0f 的猜测是:编译器会对代码进行优化,程序读取KeyPort的值会从寄存器读取而不是读取IO口,因此用 KeyPort&0x0f 能够避免寄存器被意外修改的情况?是这样吗?
那么 例程用KeyPort = cord_h | 0xf0 而不是 KeyPort = 0xf0 是什么原因呢?
直接从网下载一个现成的扫描函数不就行了,这种常规的操作不要再自己去研究了,浪费时间