关于Proteus仿真AT89C52的键盘问题,半夜睡不着起来仿真,求教。。
两次遇到的都是和键盘输入有关的情况。第一次是用Proteus验证一个AT89C52外接4x4矩阵键盘,使用线反转扫描法读取按键位置后,在1602上显示出按的键是哪一个;
当时遇到的情况是,我在硬件上已经看到结果的程序,放在Proteus里面仿真时候,键盘读取的值一直不正确,以至于switch case语句始终没有正确的对应项。
观察电平的高低,输出都是正确的,输入看不出来。
那天因为程序已经在硬件上实现了,就没再多关心具体原因。
今天又遇到了有关键盘的问题。 情况是这样的:
P2 口的低4位都通过 10kΩ 电阻接地了(另有按键开关可以拉到高电平,但是绝对没按下)。程序中有 if (P2 & 0x02) ,我用 Proteus 和 Keil 联调仿真,居然眼睁睁看着这句通过了,进入了if语句的内部,百思不得其解。
单独把这一位用 sbit KEY = P2^1; 定义,然后写 if (KEY) 效果是一样的。
刚开始以为是Keil里面,P2寄存器的值是确定的,初始值为0xff,所以读P2因为 Keil 的原因没能变化。但是我关闭 Keil ,单独使用Proteus仿真依然是这个结果。
为了避免出现变量值使用寄存值的情况,我已经将Keil编译器的优化等级选为 0 了。
谁能告诉我一下,究竟是我对软件的使用理解不对,还是别的神马原因呢。。现在睡不着,很郁闷……谢谢各位。
http://cache.amobbs.com/bbs_upload782111/files_45/ourdev_675464IM20E7.JPG
(原文件名:问题.JPG) 程序……
下面描述的问题也是显示不对吗? 回复【楼主位】BG6CLO
-----------------------------------------------------------------------
因为在proteus里面,51的拉电流跟罐电流是一样大的,IO没有办法把另一个IO拉低 回复【楼主位】BG6CLO
-----------------------------------------------------------------------
图中为什么要串联R8呢?
在仿真中,观测各口电平数值以及跟随按键的变化。 回复【2楼】hefq 何访贤
-----------------------------------------------------------------------
哦,原来是这样,那么线反转扫描法结果不正确就可以理解了…
谢谢你啦! 回回复【3楼】JQ_Lin
-----------------------------------------------------------------------
R8是为了防止程序跑飞,使IO处于输出状态,这时候直接接在VCC上会损坏端口的。
我用AD画的图,所以仿真时候也把R8加上了。
仿真的时候,能看到电压降在接地10kΩ电阻的两端,电阻上端始终是高电平。
但是这个电阻也不可以去掉呀,否则复位的时候,引脚是高电平,在实际电路中也会损坏端口… 回复【1楼】walshao 万少
-----------------------------------------------------------------------
原程序1000多行,就不发上来了。仿真时候,我加了句while(P2 & 0x02);就会一直卡在这里……
页:
[1]