书中例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呢?请马老师解答一下 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的值的? 回复【1楼】machao
----------------------------------------------------------------------- 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
----------------------------------------------------------------------- 你的界面是软件模拟运行方式下的,还是带着仿真器做实物的仿真时的界面?你用的什么仿真器?
上面的问题,估计你可能还不完全清楚知道是什么意思。简单说吧,你有实物吗?
软件模拟和实时仿真使用同一个界面。但软件模拟根本没有实物AVR,你读空气? 无按键输入口为高。
仿真时要手动把对应位置成正确状态。
PIND低3位都为0,表示3个键都被按下 回复【4楼】machao
-----------------------------------------------------------------------
呵呵 支持machao老是 我用您的状态机键盘移植到stm32上面 很稳定
另外,想请教一下。我看到很多朋友的程序都是大循环做的。但是我的使用的是状态机+状态内循环。不知道这样是不是会有什么大问题 回复【4楼】machao
-----------------------------------------------------------------------
谢谢马老师的指点,之前那个仿真是用的avr simulator,没连实物,连上以后就对了,看来不能太依赖软件仿真啊! 回复【7楼】sbk100
回复【4楼】machao
-----------------------------------------------------------------------
谢谢马老师的指点,之前那个仿真是用的avr simulator,没连实物,连上以后就对了,看来不能太依赖软件仿真啊!
-----------------------------------------------------------------------
是你不了解软件模拟的用途以及应该如何正确的使用软件模拟。
页:
[1]