BG6CLO 发表于 2011-9-9 04:00:01

关于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)

walshao 发表于 2011-9-9 11:54:04

程序……
下面描述的问题也是显示不对吗?

hefq 发表于 2011-9-9 12:00:43

回复【楼主位】BG6CLO
-----------------------------------------------------------------------

因为在proteus里面,51的拉电流跟罐电流是一样大的,IO没有办法把另一个IO拉低

JQ_Lin 发表于 2011-9-9 13:01:02

回复【楼主位】BG6CLO
-----------------------------------------------------------------------

图中为什么要串联R8呢?
在仿真中,观测各口电平数值以及跟随按键的变化。

BG6CLO 发表于 2011-9-12 01:27:05

回复【2楼】hefq 何访贤
-----------------------------------------------------------------------

哦,原来是这样,那么线反转扫描法结果不正确就可以理解了…
谢谢你啦!

BG6CLO 发表于 2011-9-12 01:32:48

回回复【3楼】JQ_Lin
-----------------------------------------------------------------------

R8是为了防止程序跑飞,使IO处于输出状态,这时候直接接在VCC上会损坏端口的。
我用AD画的图,所以仿真时候也把R8加上了。

仿真的时候,能看到电压降在接地10kΩ电阻的两端,电阻上端始终是高电平。
但是这个电阻也不可以去掉呀,否则复位的时候,引脚是高电平,在实际电路中也会损坏端口…

BG6CLO 发表于 2011-9-12 01:37:28

回复【1楼】walshao 万少
-----------------------------------------------------------------------

原程序1000多行,就不发上来了。仿真时候,我加了句while(P2 & 0x02);就会一直卡在这里……
页: [1]
查看完整版本: 关于Proteus仿真AT89C52的键盘问题,半夜睡不着起来仿真,求教。。