sbk100 发表于 2011-8-29 19:33:46

书中例9.3简单电话拨号键盘的设计中的问题,请马老师解答

我用AVR—stdio单步仿真书中例9.3简单电话拨号键盘的程序,发现一个问题,在下面这段程序中(只是扫描矩阵键盘的一部分)
unsigned char read_keyboard()
{       
    static unsigned char key_state = 0, key_value, key_line;
    unsigned char key_return = No_key,i;
       
        switch (key_state)
        {
                case 0:
                        key_line = 0b00001000;
                        for (i=1; i<=4; i++)                                        // 扫描键盘
                        {       
                                PORTD = ~key_line;                                        // 输出行线电平
                                PORTD = ~key_line;                                        // 必须送2次!!!
                                           key_value = Key_mask & PIND;                // 读列电平
                                if (key_value == Key_mask)
                                        key_line <<= 1;                                // 没有按键,继续扫描
                                else
                                {
                                        key_state++;                                        // 有按键,停止扫描
                                        break;                                                // 转消抖确认状态
                                }
                        }
                        break;
在没有任何按键按下的情况下,执行完key_value = Key_mask & PIND;这条命令后,key_value 并不等于 Key_mask,所以key_line <<= 1并不会执行,会执行else里面的语句,我发现此时PIND的值是0b11111000,可是在初始化时,PORTD=0XFF,DDRD=0XF8,也就是低3位输入,并且带内部上拉,那为什么PIND的低三位还是0呢?请马老师解答一下

machao 发表于 2011-8-29 21:00:19

1。我看不明白你在什么地方测试,你自己对代码的理解描述已经错了:

“在没有任何按键按下的情况下,执行完key_value = Key_mask & PIND;这条命令后,key_value 并不等于 Key_mask,所以key_line <<= 1并不会执行,会执行else里面的语句,”

正确的是,在没有任何按键按下的情况下,执行完key_value = Key_mask & PIND;这条命令后,key_value “应该”等于 Key_mask,所以key_line <<= 1“肯定继续”执行,“不会”执行else里面的语句,”

2。你是在什么地方(程序执行到哪条语句后),以及采用什么办法如何看到PIND的值的?

sbk100 发表于 2011-8-29 22:45:58

回复【1楼】machao
-----------------------------------------------------------------------

sbk100 发表于 2011-8-30 09:08:30

http://cache.amobbs.com/bbs_upload782111/files_45/ourdev_672395F1IBFV.jpg
key_value=Key_mark&PIND执行前 (原文件名:1.jpg)

http://cache.amobbs.com/bbs_upload782111/files_45/ourdev_672396LL2966.jpg
key_value=Key_mark&PIND执行后 (原文件名:2.jpg)

回复【1楼】machao
-----------------------------------------------------------------------

machao 发表于 2011-8-31 00:12:25

你的界面是软件模拟运行方式下的,还是带着仿真器做实物的仿真时的界面?你用的什么仿真器?

上面的问题,估计你可能还不完全清楚知道是什么意思。简单说吧,你有实物吗?

软件模拟和实时仿真使用同一个界面。但软件模拟根本没有实物AVR,你读空气?

packer 发表于 2011-8-31 00:21:15

无按键输入口为高。
仿真时要手动把对应位置成正确状态。
PIND低3位都为0,表示3个键都被按下

122402902 发表于 2011-8-31 00:24:45

回复【4楼】machao
-----------------------------------------------------------------------

呵呵 支持machao老是 我用您的状态机键盘移植到stm32上面 很稳定

另外,想请教一下。我看到很多朋友的程序都是大循环做的。但是我的使用的是状态机+状态内循环。不知道这样是不是会有什么大问题

sbk100 发表于 2011-8-31 21:08:27

回复【4楼】machao
-----------------------------------------------------------------------
谢谢马老师的指点,之前那个仿真是用的avr simulator,没连实物,连上以后就对了,看来不能太依赖软件仿真啊!

machao 发表于 2011-9-1 00:05:43

回复【7楼】sbk100
回复【4楼】machao   
-----------------------------------------------------------------------
谢谢马老师的指点,之前那个仿真是用的avr simulator,没连实物,连上以后就对了,看来不能太依赖软件仿真啊!

-----------------------------------------------------------------------

是你不了解软件模拟的用途以及应该如何正确的使用软件模拟。
页: [1]
查看完整版本: 书中例9.3简单电话拨号键盘的设计中的问题,请马老师解答