| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1018 人关注过本帖
标题:C语言菜鸟一个,希望有高手帮忙解答下。
只看楼主 加入收藏
laylay0803
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2015-4-13
收藏
得分:0 
回复 10楼 AleTiff
我都不好意思说我是研一的。。。我考虑标志位看看。
2015-04-15 13:10
laylay0803
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2015-4-13
收藏
得分:0 
回复 10楼 AleTiff
我实在搞不懂变量KeyTime是用来干什么的,为什么要定义这个变量,换我估计就只是扫描row1和row2了.
2015-04-15 13:13
laylay0803
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2015-4-13
收藏
得分:0 
回复 10楼 AleTiff
STC11_RC522_完整液晶串口__20121112.rar (211.38 KB)

不好意思,我知道你为什么打不开了,这个应该是可以的。
2015-04-15 13:20
AleTiff
Rank: 3Rank: 3
等 级:论坛游侠
威 望:4
帖 子:64
专家分:157
注 册:2015-3-30
收藏
得分:0 
噢。这个代码确实有点多的。我开始还以为只是个小的学习程序,这个本身就是一个项目模块了。

大致上看了一下,先解释一下 KeyTime 这个东西的用处。这个变量是在 Key.c 里声明的,并且特意在 Key.h 里暴露出来,意味着,这是一个全局变量。
我们可以看到,在 Key.c 的 get_key() 函数里 KeyTime 是用来作为最小按键间隔用的,也就是说,只要 KeyTime 不是 0,任何按键按下去都是无效的。每当有键按下后,KeyTime 就会被设置到 KEY_DELAY,KEY_DELAY 的具体数值是 15,然后 get_key() 返回接收到的按键值。而这个被设置为 15 的 KeyTime,我们可以在 timer.c 的时钟中断处理函数里看到,每次中断发生的时候,中断处理程序都会去检查 KeyTime 是不是不为 0,假如不为 0 的话,中断程序每次中断都会去减 1。这样,当 KeyTime = 15 的话,中断程序每20ms中断一次,意味着这个按键延时间隔,大概是 300 毫秒。

由此可见,main() 中的 while 循环,每一次只能获取按键的一个 Key 值,获取到以后,按照我的思路,应该还要发生视觉反馈,也就是要设置 ctrl.c 单元里的 bPass = 1,从而导致 led 点亮一会、喇叭发出嘟声,并发生 2000 毫秒的等待。之后,循环继续,等待获取到第二个 Key。

据此分析后,我们大概已经知道,取 Key 其实是一步一步做的。然后,我们来研究为什么每次取到的 Key 不会混淆。当然,我看到的你目前的代码里,get_key() 只能一次循环取完,不然肯定会混淆。所以,这个代码不能适应分步取 Key 的流程。翻看其他部分源代码,我们可以看到有这样的一个代码:

    KeyVal = get_key();
    switch( KeyVal )
    {
        case KEY_1:
            break;
        case KEY_2:
            break;
        case KEY_3:
            break;
        case KEY_4:
            break;
        default:
            break;
    }

对的,这种形式的代码,用在分步取 Key 的流程就不会混淆了。因为它每次取到 Key 后,都是进行了键值识别的。
2015-04-15 15:53
AleTiff
Rank: 3Rank: 3
等 级:论坛游侠
威 望:4
帖 子:64
专家分:157
注 册:2015-3-30
收藏
得分:0 
通过分析后,你大概应该清楚怎么去修改这个程序了,同时,顺便也说一下,之前板子上的 Key,好像不是你现在的用途,更像是模式设定的用途,现在你改变了用途,当然也应该顺便改变一些东西。

我也顺手重写了你的关键代码,只要把 board_process() 用我下面的代码替换,大概应该可以满足你的密码输入的需求了。不过,我从来不确定自己的代码是否可以正常工作的,我也没测试,你拿去试试看吧,关键还是思路:

INT8U Key_count = 0;    // 去声明一个全局变量记录按键次数

void board_process( void )
{
    INT8U i,j;
    INT8U KeyVal = get_key();
    if( Key_count < 3){
        switch( KeyVal )
        {
            case KEY_1:
                password[Key_count] = KEY_1;
                Key_count++;
                break;

            case KEY_2:
                password[Key_count] = KEY_2;
                Key_count++;
                break;

            case KEY_3:
                password[Key_count] = KEY_3;
                Key_count++;
                break;

            case KEY_4:
                password[Key_count] = KEY_4;
                Key_count++;
                break;

            default:
                password[Key_count] = 0;
                Key_count++;            
                break;
        }
    }
   
    if( Key_count == 3 ){
        for(j = 0 ;j < 4 ;j++)       //比较密码
        {
           if(password[j] == rightpassword[j])
           {
               Key_count--;
           }   
           else
           {
               bWarn=1;
               DisplayListChar(1,1,"password error");
               break;
           }
        }        
    }
    if( Key_count == 0){
        bPass=1;
        DisplayListChar(1,1,"password right");
    }
    if( bWarn || bPass ) Key_count = 0;  // Key_count 这个时候进行重置
}
2015-04-15 16:21
AleTiff
Rank: 3Rank: 3
等 级:论坛游侠
威 望:4
帖 子:64
专家分:157
注 册:2015-3-30
收藏
得分:0 
sorry, 这里有个错误:

原文(代码第5行):
   if( Key_count < 3){

应该是
    if( Key_count < 4){

更正一下  
2015-04-15 16:24
AleTiff
Rank: 3Rank: 3
等 级:论坛游侠
威 望:4
帖 子:64
专家分:157
注 册:2015-3-30
收藏
得分:0 
另外,为了减少误按也被记录的情况,在 switch() 里,可以把 default 段的代码清除掉,只保留 break,这样处理后,万一在延时时间里按下键,也不会被当做按键按下来看待了,也许这才更符合线路设计者的本意。
2015-04-15 16:30
AleTiff
Rank: 3Rank: 3
等 级:论坛游侠
威 望:4
帖 子:64
专家分:157
注 册:2015-3-30
收藏
得分:0 
唉~~~,不堪回首~~~,写完的代码,就是不该回头去看的,都是错误啊,算了,改改,重新贴:

INT8U Key_count = 0;    // 去声明一个全局变量记录按键次数

void board_process( void )
{
    INT8U i,j;
    INT8U KeyVal = get_key();
    if( Key_count < 4){
        switch( KeyVal )
        {
            case KEY_1:
                password[Key_count] = KEY_1;
                Key_count++;
                break;

            case KEY_2:
                password[Key_count] = KEY_2;
                Key_count++;
                break;

            case KEY_3:
                password[Key_count] = KEY_3;
                Key_count++;
                break;

            case KEY_4:
                password[Key_count] = KEY_4;
                Key_count++;
                break;

            default:
                //password[Key_count] = 0;
                //Key_count++;            
                break;
        }
    }
   
    if( Key_count == 3 ){
        for(j = 0 ;j < 4 ;j++)       //比较密码
        {
           if(password[j] == rightpassword[j])
           {
               Key_count--;
           }   
           else
           {
               bWarn=1;
               DisplayListChar(1,1,"password error");
               break;
           }
        }  

        if( Key_count == 0){
            bPass=1;
            DisplayListChar(1,1,"password right");
        }        
    }

    if( bWarn || bPass ) Key_count = 0;  // Key_count 这个时候进行重置
}
2015-04-15 16:47
laylay0803
Rank: 1
等 级:新手上路
帖 子:10
专家分:0
注 册:2015-4-13
收藏
得分:0 
回复 18楼 AleTiff
哈哈,太感谢了!!!感觉自己弱爆了,虽然还是有问题,至少按键有反应了!!
2015-04-15 18:01
AleTiff
Rank: 3Rank: 3
等 级:论坛游侠
威 望:4
帖 子:64
专家分:157
注 册:2015-3-30
收藏
得分:0 

不弱的,是好样的 ,这种直接与机器硬件打交道的编程,年薪 100 万的程序员都没几个会,何况你还是个女生
2015-04-15 19:32
快速回复:C语言菜鸟一个,希望有高手帮忙解答下。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.044172 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved