搜索
bottom↓
回复: 8

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

[复制链接]

出0入0汤圆

发表于 2011-8-29 19:33:46 | 显示全部楼层 |阅读模式
我用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呢?请马老师解答一下

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 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的值的?

出0入0汤圆

 楼主| 发表于 2011-8-29 22:45:58 | 显示全部楼层
回复【1楼】machao  
-----------------------------------------------------------------------

出0入0汤圆

 楼主| 发表于 2011-8-30 09:08:30 | 显示全部楼层

key_value=Key_mark&PIND执行前 (原文件名:1.jpg)


key_value=Key_mark&PIND执行后 (原文件名:2.jpg)

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

出0入0汤圆

发表于 2011-8-31 00:12:25 | 显示全部楼层
你的界面是软件模拟运行方式下的,还是带着仿真器做实物的仿真时的界面?你用的什么仿真器?

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

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

出0入0汤圆

发表于 2011-8-31 00:21:15 | 显示全部楼层
无按键输入口为高。
仿真时要手动把对应位置成正确状态。
PIND低3位都为0,表示3个键都被按下

出0入0汤圆

发表于 2011-8-31 00:24:45 | 显示全部楼层
回复【4楼】machao  
-----------------------------------------------------------------------

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

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

出0入0汤圆

 楼主| 发表于 2011-8-31 21:08:27 | 显示全部楼层
回复【4楼】machao  
-----------------------------------------------------------------------
谢谢马老师的指点,之前那个仿真是用的avr simulator,没连实物,连上以后就对了,看来不能太依赖软件仿真啊!

出0入0汤圆

发表于 2011-9-1 00:05:43 | 显示全部楼层
回复【7楼】sbk100
回复【4楼】machao   
-----------------------------------------------------------------------
谢谢马老师的指点,之前那个仿真是用的avr simulator,没连实物,连上以后就对了,看来不能太依赖软件仿真啊!

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

是你不了解软件模拟的用途以及应该如何正确的使用软件模拟。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-27 04:26

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表