买了本《51单片机C语言应用程序设计实例精讲》。里面的第五章是关于6位密码锁的。因为这本书的硬件管脚有点和自
己的仿真器的不同,所以改了部分管脚开关定义。比如从第一位数码管开始扫描,书上是0x01,我改成了0xfe。 它的设计流程是,动态键盘扫描,然后把键值放入一个数组,Time0每隔0.2ms(原来为2ms,但数码管显示不是很清除
,我改成了0.2ms。)读取数组中的一位。 现在碰到的问题是,键盘扫面函数里没有,等待键释放这个语句。所以比如按一下“2”,那么数组里的6位都会变成“
2”。而我希望的仅仅是其中的一位变成“2”,其余5位都保持原来的值。
uchar digbit; 字位 uchar wordbuf[ 6 ]; 字型码缓冲区 uchar pw[ 6 ]; 初始密码缓冲区 uchar pwbuf[ 6 ]; 输入密码缓冲区 uchar count; 密码位计数 uchar enterflag; 确认键按下
键盘扫描函数如下: uchar keyscan(void) { uchar scancode,tmpcode; P1 = 0xf0; //扫描全0行 if ((P1&0xf0)!=0xf0) //如果有键按下 { delay(); //延时去抖 if ((P1&0xf0)!=0xf0) //再判断一次 { scancode = 0xfe; while((scancode&0x10)!=0) //逐行扫描 { P1 = scancode; //输出行扫描码 if ((P1&0xf0)!=0xf0) //本行有键按下 { tmpcode = (P1&0xf0)|0x0f; return((~scancode)+(~tmpcode));//返回特征字符码,有1的为对应行列 } else scancode = (scancode<<1)|0x01; //行扫描码左移 } } } return(0); }
main()里的判断部分为 while(1) { key = keyscan(); //调用键盘扫描函数 tch(key) { case 0x11: // 1行1列,数字0 if (count<6) { wordbuf[count] = 0xf0; // 对应密码位上显示"F",防止密码被人看到 pwbuf[count] = 0; //密码存储区 count++; } break; case 0x12: if (count<6) { wordbuf[count] = 0xf0; pwbuf[count] = 1; count++; } break; case 0x14: if (count<6) { wordbuf[count] = 0xf0; pwbuf[count] = 2; count++; } break; case 0x18: if (count<6) { wordbuf[count] = 0xf0; pwbuf[count] = 3; count++; } break; case 0x21: if (count<6) { wordbuf[count] = 0xf0; pwbuf[count] = 4; count++; } break; case 0x22: if (count<6) { wordbuf[count] = 0xf0; pwbuf[count] = 5; count++; } break; case 0x24: if (count<6) { wordbuf[count] = 0xf0; pwbuf[count] = 6; count++; } break; case 0x28: if (count<6) { wordbuf[count] = 0xf0; pwbuf[count] = 7; count++; } break; case 0x41: if (count<6) { wordbuf[count] = 0xf0; pwbuf[count] = 8; count++; } break; case 0x42: if (count<6) { wordbuf[count] = 0xf0; pwbuf[count] = 9; count++; } break; case 0x44: // 确认键 enterflag = 1; // 确认键按下 if (count==6) //只有输入6个密码后按下确认键才做比较 pwflag = pwcmp(); else pwflag = 0; // 否则直接为0 break; case 0x48: // 取消键 count = 0; // 密码计数清零 for (j=0;j<6;j++) { wordbuf[j] = 8; // 数码管显示888888 pwbuf[j] = 0x0f; // 用ffffff清除已输入的密码 } break; default:break; }
完整的代码在下面的附件里。第一个是我改后的,第二个是书上原来的。 本来想在 keyscan函数的 tmpcode = (P1&0xf0)|0x0f;和 return((~scancode)+(~tmpcode))之间插入while((P1&0xf0)!=0xf0);可仿真的时候并没有延时的效果。
哪位大哥能帮忙看一下,在这种矩阵键盘代码中,该在哪里插入键盘释放语句?自己在很多地方都试过,都没成功。
相关链接:https://bbs.21ic.com/upfiles/img/20076/200761712813418.rar |