急!!51单片机汇编程序问题

来源:百度知道 编辑:UC知道 时间:2024/06/28 07:23:40
我在51上用汇编编了个程序,写完了,仿真却有问题,我设置断点然后仿真,结果没有问题,可是把断点去掉然后运行,有个变量的值却是随机的了,怎么回事?
我贴出一部分 不知道是不是这的错
COU:
inc datacount ;datacount就是有问题的值
mov datasect,#00h

LOOPMAIN:
JB P2.4,counts
LJMP COU

counts: mov a,datasect
CJNE a,#100,showcount
setb P2.1
mov datasect,#00h
如果我按下按钮p2.4的话 应该执行COU 然后datacount+1,可是怎么值是随机的啊,怎么修改呢?
很着急,希望达人解答!
怎么写消抖呢?
我认识到可能要消抖,但是我总写不对。。。

我的按钮是那种按下接着弹起来的那种。
LOOPMAIN:
JB P2.4,counts
LCALL DELAY
JB P2.4,COU
我是这么改的,现在还没发现问题,正常,大家看看这样写没问题吧?

缺少消抖环节。
--------
延时10ms后,再去判断是否按下。

LOOPMAIN:
JB P2.4,counts ;为1转移,因为没有按键
LCALL DL10MS ;为0,是有键按下,等10ms
JB P2.4,counts ;为1转移,因为刚才是按键抖动
LJMP COU ;依然为0,才去执行按键的功能程序

楼上说的消抖是一个方面,也就是说当你判断出有按键的时候,要延时20ms,然后再去判断是否有按键,如果有就可以确认是一个有效的按键。还有一个最主要的问题:当你按下的时候,时间最少也有几个毫秒,而扫描指令都是微秒级的,此时可以想象程序的:
COU:
inc datacount ;datacount就是有问题的值
mov datasect,#00h

LOOPMAIN:
JB P2.4,counts
LJMP COU
这一部分执行了多少次。所以,还要加上标志位,当按下的时候,打开此标志位,松开的时候关闭。只在此标志打开的时候执行一次INC即可,一直按下的时候不要去执行INC。

COU:
INC datacount;
mov datasect,#0

LOOPMAIN:
SETB P2.4
JB P2.4,counts
你应该先将P2.4引脚置1,再读引脚,再采用防消斗,再读引脚时应该使锁存器与晶体管的连接端口处于截止状态。