打印

这个程序怎么修改?

[复制链接]
1483|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
renyaq|  楼主 | 2012-3-16 22:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
当输入密码时,如果输入有误,当按下 删除键后,删除刚刚输入的密码,然后当再次按下数字键时,接着开始,程序如下,怎样修改呢?

void get_psw(void)  //输入密码
{
    unsigned char i;
   lcd_c_send(0xc0); //第二行显示“*”
    for (i=0;i<8 ;i++ )
      {
         keyscan();
         while (keynum>=11 && keynum<=15) //除0~10以外,(10为删除键)其他键值则不响应
         keyscan();
          {
               psw_mem[i]=keynum;   //键值送暂存区保存
               lcd_d_send(0x2a);     //*号
               delay1(20);        //短延时,才能显示最后一个“*”
          }
    }
}
沙发
houcs| | 2012-3-16 22:34 | 只看该作者
坐等高人解答。
PS:keyscan是键扫的程序吧。

使用特权

评论回复
板凳
liuzaiy| | 2012-3-16 22:37 | 只看该作者
无论是退格删除,还是全部删除,都只是个 状态转移而已,

使用特权

评论回复
地板
yinxiangh| | 2012-3-16 22:38 | 只看该作者
键处理是容易的.
如果是删除一个字符, 象缓冲指针 i -1, 这样倒回一个字符,
或者是删除全部字符, 则清空缓冲.

使用特权

评论回复
5
pangb| | 2012-3-16 22:40 | 只看该作者
是的,只是, 这里 lcd_d_send() 有点麻烦. 要做倒退一个字符的处理,
比较简单的办法是 lcd_d_send() 函数里增加控制符, 比如特殊控制 BACKSPACE(这可以用宏定义为任意不用的字符), lcd_d_send() 函数里判断这个字符, 进行清除当前光标的字符, 并倒回光标的操作.

使用特权

评论回复
6
renyaq|  楼主 | 2012-3-16 22:41 | 只看该作者
输入密码时,lcd光标是向前的,并把数保存起来,
当有按下删除键后,光标倒退并且清除之前的数(按几次就清除几位),
输入正确的键值时,又从最近的一个数开始累加。。。

使用特权

评论回复
7
renyaq|  楼主 | 2012-3-16 22:49 | 只看该作者
如何状态转移呢?

使用特权

评论回复
8
chenjunt| | 2012-3-16 22:50 | 只看该作者
设计产品还是必须要掌握分时处理的方法,否则困难重重。

使用特权

评论回复
9
ousj| | 2012-3-16 22:51 | 只看该作者
void get_psw(void)  //输入密码
{
    unsigned char i,j;
write_com(0x80+0x40);//指令指向第二行第一个
   lcd_c_send(0xc0); //第二行显示“*”
    for (i=0;i<8 ;i++ )
      {
         keyscan();
        write_com(0x80+0x40+j);//讲指针指到*号处写入密码
        psw_mem[i]=keynum;   //键值送暂存区保存
         while (keynum>=11 ) ;//除0~10以外,(10为删除键)其他键值则不响应  
           lcd_d_send(0x30+keynum);//这里用1602显示,0x30加上一个数显示在液晶上就是那个数
               lcd_d_send(0x2a);     //*号
               j++;
               delay1(20);        //短延时,才能显示最后一个“*”
    }
}

使用特权

评论回复
10
morrisk| | 2012-3-16 22:52 | 只看该作者
这个不难,

每次输入后,所有字符刷新显示,删除键就是缓冲区的有效字符个数减一

使用特权

评论回复
11
zyf部长| | 2012-3-16 22:56 | 只看该作者
搞个缓冲,就好了啊

使用特权

评论回复
12
renyaq|  楼主 | 2012-3-16 22:56 | 只看该作者
谢谢楼上所有高手的回帖,让我很受启发,有了灵感,已经解决了!程序如下:
void get_psw(void)  
{
    unsigned char i;
  lpp:
    lcd_c_send(0xc0); //第二行显示“*”

    for (i=0;i<8 ;i++ )
      {
         keyscan();
         while (keynum>=11 && keynum<=15)//除0~9以外,其他键值则不响应
         keyscan();
              {
         if(keynum!=10) //如果没按下删除键
         {
                   psw_mem[i]=keynum;          //键值送暂存区保存
            lcd_d_send(0x2a);     //*号
            delay1(20);        //短延时,才能显示最后一个“*”
        }
             else
             {
             lcd_c_send(0xc0);
            for (i=0;i<8 ;i++ )
            {
              lcd_d_send(0x20);
             lcd_d_send(0x10);
            }
                 goto lpp;
             }
        }
    }
}

程序虽然实现了删除功能,但是用了goto来调转,不知除了用goto向上跳转外,还能用什么方法向上跳转?

使用特权

评论回复
13
小小猫咪| | 2012-3-16 22:58 | 只看该作者
简单看这是个小功能如何实现的问题,但是其本质是系统架构如何搭建,模块程序如何协调的大问题,就像盖楼房,以现在的思路盖个平房可能没啥大问题,盖个小别墅也凑合,但是摩天大楼-- 倒塌也!
建议:多看看 软件工程,操作系统等书籍,千万别小看这些,也别误认为这些都是搞计算机的才有用。
我们嵌入式依然需要它们

使用特权

评论回复
14
renyaq|  楼主 | 2012-3-16 22:58 | 只看该作者
OK,多谢大家,结贴了

使用特权

评论回复
15
renyaq|  楼主 | 2012-3-16 22:59 | 只看该作者
大家晚安哈

使用特权

评论回复
16
xinyang_2012| | 2012-3-17 10:26 | 只看该作者
哈哈哈

使用特权

评论回复
17
lyepng| | 2012-3-17 10:44 | 只看该作者
12# renyaq
楼主问题看起来还没有解决啊

使用特权

评论回复
18
lyepng| | 2012-3-17 10:50 | 只看该作者
从1楼看楼主的本意是按下删除键,然后删除一个,但是楼主的程序却是按删除键,全部删除,有点妥协的意思

使用特权

评论回复
19
lyepng| | 2012-3-17 10:58 | 只看该作者
个人不才,只是提点想法。
其实楼主的结构存在问题,如果想实现一次删除一个不难,主要问题在于以下两点:
1,楼主的FOR循环是为了最大限度不超过8个,这个功能本来可以用一个i在输入时加一,删除时减一来代替,,然后在扫描键盘后的输入部分用这个i限定住,注意不要限定住删除部分。
2,把暂存区用指针来控制,即删除一个,便使暂存区指针减1,存入一个,便加一,显然这个指针的操作可与上述的i是线性关联的,所以这个指针可以与i相关联,这样会加深楼主对于指针使用的娴熟度。

使用特权

评论回复
20
wang654| | 2012-3-17 17:10 | 只看该作者
来看看 从1楼看楼主的本意是按下删除键,然后删除一个,但是楼主的程序却是按删除键,全部删除,有点妥协的意思

使用特权

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

本版积分规则

700

主题

10138

帖子

4

粉丝