高分:51单片机汇编程序问题,为什么没调用的程序会对原程序产生影响

INIT:MOV P0 ,#0FH;初始化低四位为高电平,使能四位数码管
CLR HC595_RST;HC595的复位端,不能让他复位
MOV R5,#07FH
MOV R0,#06FH
MAIN:
LCALL SCAN ;矩阵键盘扫描
CJNE R5,#0FFH,SHOWKEY
JMP SHOWKEY1
SHOWKEY:
MOV A,R5
MOV R0,A
SHOWKEY1:CALL OUT_595
JMP MAIN
;---------------------------------------------------------------
;显示数字的子程序
;---------------------------------------------------------------
SHOW1234: MOV R3,#4
S1: CJNE R3,#4,S2
MOV P0,#01H
S2: CJNE R3,#3,S3
MOV P0,#02H
S3: CJNE R3,#2,S4
MOV P0,#04H
S4: CJNE R3,#1,NEXT
MOV P0,#08H
NEXT:
ANL A,#0FH ;屏蔽累加器的高4位
;CJNE A,#0AH,DO
;MOV A,#00H
MOV DPTR,#SEG ;将数据表格的首地址 0100H存入16位的数据地址指针DPTR中
MOVC A,@A+DPTR ;查表
MOV R0,A
;MOV 30H,#3
;ACALL DELAY_ms ;调用延时子程序
MOV A,R1 ;将R1的数据传送给累加器
INC A ;累加器+1
DA A ;二-十进制调整 如果这句使用数码管只显示 0-9
MOV R1, A
CALL OUT_595 ;调用595子程序
MOV 30H,#10
ACALL DELAY_ms
MOV A ,@R1
DJNZ R3,S1
MOV R1,#32H
MOV A,@R1
RET
;---------------------------------------------------------------
;输出锁存器输出数据子程序
;---------------------------------------------------------------
OUT_595:
LCALL HC595_send_byte
SETB HC595_RCK
NOP ;用NOP指令产生方波
NOP
CLR HC595_RCK ;下降沿将数据送到输出锁存器
RET
HC595_send_byte:
MOV R4,#08H ;总共移8次
MOV A,R0
WR_LOOP:
RLC A ;带进位左移
MOV HC595_DAT,C
SETB HC595_SCK ;下降沿发生移位
NOP
NOP
CLR HC595_SCK
DJNZ R4,WR_LOOP
RET
主程序根本没调用子程序SHOW1234,但是却使数码管乱码了,如果屏蔽掉这个程序,数码管就没事,这是为什么呢?剩下的程序请点击图片,谢谢,回答满意再追加50
主程序根本没调用子程序SHOW1234,但是却使数码管乱码了,如果屏蔽掉这个程序,数码管就没事,这是为什么呢?剩下的程序请点击图片,谢谢,回答满意再追加50

seg位置影响了数码管显示
去掉org 0100h
因为程序编译代码会超过0100h,覆盖了seg的数据
使得乱码
而删除show1234段使得程序代码短了,seg段就正常了
温馨提示:内容为网友见解,仅供参考
第1个回答  2013-06-07

    你按正常编程重写一下,避开中断向量入口区域即

    开始 ORG 0000H

           LJMP INIT

           ORG 0030H

     INIT:

........................................

2、将JMP 、CALL等前加L试试。

第2个回答  2013-06-07
把SHOW1234和OUT_595换个位置试试。

高分:51单片机汇编程序问题,为什么没调用的程序会对原程序产生影响
因为程序编译代码会超过0100h,覆盖了seg的数据 使得乱码 而删除show1234段使得程序代码短了,seg段就正常了

51 单片机 程序出错 不执行定时器中断1 同时delay函数也有错 求高手...
1.独立按键的判断在程序中如果没有用sbit定义过不能写为 P2^n 的形式,在程序体内这种写法表示的是异或 2.中断程序里,进入中断程序以后如果不是特殊需要,先关断自身的中断控制位,退出中断的时候再打开 3.在单片机里写程序的时候能省资源就省,52单片机是8位的,如果变量范围不超过255就不要用int...

51单片机编程问题(加了while,无法执行)
但我也发现,有时没有大循环的程序也会反复执行,但这样很容易发生错误,如有些程序在主程序之前将某些变量初值设0,程序运行中修改了它的值,但并没有清0,下一次运行就出错

51单片机为什么要先擦出才可以编程,直接烧程序不可以吗?不会把原来的...
这是一个存储原理,有一些存储器进行写操作时只能将1变为0,而不能将0变为1。如此,擦出操作就是为了将0变为1后再写入。STC51单片机就是这样的。再者,每次写入程序大小也不相同,如果写入程序比以前程序小的话,就算是覆盖也有没有被覆盖完的地方,这样程序运行可能也会出错吧,比如程序跑飞!

51单片机写个程序,好像在中断里面出不来了,主程序只运行了一部分,之后...
又显示液晶,这里面花的时间远远地超过10ms,它肯定死在中断里出不来啊,因为你不关闭中断的话它一直10ms进去,最好在中断里设置几个标志位,进中断就让标志位置1,然后出中断,在主循环里判断标志位,如果标志位置1了,就清零标志位,然后做其他的动作。好好想一想,思路一定要清晰!

单片机一般能重复写多少次程序?每次下载一个新的程序进去是不是将原来...
STC 系列单片机,官网公布 ,擦写次数10万次以上。新的程序 写入 下载 过程 首先 擦除 程序存储器,再 写入新的程序。可以 上 官网 看看,应该有更多 需要 了解的信息。

单片机51 怎么调用我常用的程序文件?
先要问一下你是用C写还是汇编了,如果是用C,那就把你所有的函数全部放到一个文件里面,如:Func.c文件里,再在你的主程序文件开始用:#include "Func.c"包含一下,你就可以用里面的函数了。如果你是用汇编,那就把你原来写好的子函数放到一个文件里,如:Func.asm 再在你的主程序文件里用:...

51汇编RET问题
就是遇到RET也不会返回到原处!RET指令后就是将堆栈中的数据返回到PC计数器。所以如果堆栈没压入地址,随便执行RET会使程序混乱的。一个是跳转,一个是调用,跳转是没RET可言的,不会将当前PC值PUSH进栈里,而这里DELAY的RET 会返回AJMP 是因为当中断产生时PUSH进栈里的PC值?

51单片机的程序其他单片机可以用吗
因为不同内核架构的单片机,其存储区分配、寄存器地址、中断地址、程序入口、堆栈等均不相同,编译器对程序的处理也有差别。如果想要将将MCS51单片机的程序移植到其他单片机上,通常需要按照如下步骤:更换相对应的编程软件、编译环境(视实际情况,有很多编程软件支持很多不同的单片机,如51的程序移植到stm32...

为什么51单片机改了引脚程序还能继续运行
为什么51单片机改了引脚程序还能继续运行的原因是程序内容不大。根据程序猿资料查询可知,因为程序容量不大,运行速度又很快,人还没有感觉出停顿,程序就又从头执行了。只要有电源,复位正常。复位脚悬空,就有可能不是从0000H开始执行程序。从其它地址开始取出指令、执行指令,PC往往都会递增到0000H,这就像...

相似回答