打印

在矩阵键盘代码里,如何插入等待键释放代码?

[复制链接]
3672|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lthirty|  楼主 | 2007-6-17 12:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
买了本《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

相关帖子

沙发
zhaoyu2005| | 2007-6-17 13:47 | 只看该作者

俺觉得在return((~scancode)+(~tmpcode));之前加就行

给一个参考的:
while((P1&0xf0)!=0xf0) ;

使用特权

评论回复
板凳
fsaok| | 2007-6-17 15:14 | 只看该作者

.

有按键的反意词是什么?当然是....沿着这个思路走就行了.

不过要注意去抖

使用特权

评论回复
地板
lthirty|  楼主 | 2007-6-25 19:14 | 只看该作者

楼上能说的具体点吗

楼上能说的具体点吗,想了很久,也试着改了很多。可就是不行。


使用特权

评论回复
5
cjf512| | 2007-6-25 21:12 | 只看该作者

个人意见!

在等待按键松开的循环里面,还需要调用显示程序,才可以达到LZ的效果
不然的话,要不数码管全灭,要不就全是2了!

使用特权

评论回复
6
ayb_ice| | 2007-6-26 08:00 | 只看该作者

我一般是按键释放才发送按键号,就象电脑键盘一样

使用特权

评论回复
7
fsaok| | 2007-6-26 08:10 | 只看该作者

.

当你处理了键盘按下的后,在后来的扫描中,只有在一定时间内没有按键才算释放,如果有键就放弃

使用特权

评论回复
8
wallaby| | 2007-6-26 13:21 | 只看该作者

2楼的方法可以吧

lthirty ,2L的方法可以吧, 现在怎么解决的?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

25

帖子

1

粉丝