打印

汇编发生了跳转

[复制链接]
405|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
llia|  楼主 | 2019-7-13 18:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
调试的时候发现自己写的C语言代码和KEIL编译的汇编对不上,C语言应该是继续往下进行,而汇编就发生了跳转, 跳到另个函数就进入了死循环, 这是什么问题

使用特权

评论回复
沙发
wangpe| | 2019-7-13 18:50 | 只看该作者
楼主程序可以公开吗?贴程序看下吧,这么说看不出什么原因

使用特权

评论回复
板凳
llia|  楼主 | 2019-7-13 18:54 | 只看该作者
声明: 程序很乱 高人有什么看法尽情的泼洒
#include"reg51.h"
#include"8563.h"
#include"24c01.h"
#include"malfunction.h"
#include"display.h"
#include"key.h"
uchar keyb;
uchar gu_xian=0;
uchar gu_cha[6];
void init()
{
         TMOD=0x11;
         TR0=1;
         ET0=1;
         TR1=1;
         ET1=1;
         TH1=53266/256;
         TL1=53266%256;
         TH0=63266/256;
         TL0=63266%256;
         EA=1;
         EX0=1;
         IT0=1;
         dula=0;
         wela=0;

}
void dis_control()//显示模式的选择
{
         switch(disnum)
                 {
                         case 0:{shuxian[0]=time.s;shuxian[1]=time.m;shuxian[2]=time.h;};break;
                         case 1:{shuxian[0]=time.d;shuxian[1]=time.mouth;shuxian[2]=time.y;};break;
                         case 2:
                                         {
                                                 if(key_num==1){shuxian[0]=0xaa;shuxian[1]=0xff;shuxian[2]=tobcd(a_num);};
                                                 if(key_num==2){shuxian[0]=0xbb;shuxian[1]=0xff;shuxian[2]=tobcd(b_num);};
                                                 if(key_num==3){shuxian[0]=0xcc;shuxian[1]=0xff;shuxian[2]=tobcd(c_num);};
                                                 if(key_num==4){shuxian[0]=0xab;shuxian[1]=0xff;shuxian[2]=tobcd(ab_num);};
                                                 if(key_num==5){shuxian[0]=0xbc;shuxian[1]=0xff;shuxian[2]=tobcd(bc_num);};
                                                 if(key_num==6){shuxian[0]=0xac;shuxian[1]=0xff;shuxian[2]=tobcd(ac_num);};
                                                 /*if(key_num>6)
                                                         {
                                                                 if(key_num==36)key_num=1;
                                                                 r_24c01(0x04+3*key_num,3,shuxian);};*/
                                                         
                                         };        
                                         break;
                         case 3:{shuxian[0]=0xff;shuxian[1]=time.m;shuxian[2]=0xff;};break;
                         case 4:{shuxian[0]=0xff;shuxian[1]=0xff;shuxian[2]=time.h;};break;
                         case 5:{shuxian[0]=time.d;shuxian[1]=0xff;shuxian[2]=0xff;};break;
                         case 6:{shuxian[0]=0xff;shuxian[1]=time.mouth;shuxian[2]=0xff;};break;
                         case 7:{shuxian[0]=0xff;shuxian[1]=0xff;shuxian[2]=time.y;};break;
                         case 8:;break;
                 }
}
void r_24c01(uchar address,uchar z,uchar *databuf)
{
         uchar i;
         Start();
         writebyte(0xa0);        

        writebyte(address);

        Start();
         writebyte(0xa1);

        for(i=0;i<z;i++)
         {
                 databuf[i]=Readbyte();
                         if(i<z-1) WriteACK(0);
                 
        }
         WriteACK(1);
         Stop();
}
void main()
{
r_24c01(0x01,6,gu_cha);
         init();
//        
         a_num=gu_cha[0];
         b_num=gu_cha[1];
         c_num=gu_cha[2];
         ab_num=gu_cha[3];
         bc_num=gu_cha[4];
         ac_num=gu_cha[5];
         
         
         for(;;)
         {
                 dis_control();
                 key();
                 
        }
}
void timesr_1() interrupt 1
{

        display();
          if(gu_xian)
                 {
                         gu_xian++;
                         if(gu_xian>220)
                                 {
                                         gu_xian=0;
                                         EX0=1;
                                 }
         
                 }


        

}
void time1() interrupt 3
{

        if(disnum<2)
                 {
                 
                        R_8563();
                 }
                 
}


void int_0() interrupt 0
{
         uchar gu;
         EX0=0;
         disnum=8;
         gu_xian=1;
         gu=key1|0xf8;

        switch(gu)
                 {
                         case 0xfe:A();break;
                         case 0xfd:B1();break;
                         case 0xfb:C();break;
                         case 0xfc:AB();break;
                         case 0xfa:AC1();break;
                         case 0xf9:BC();break;

                        default: break;

                }
         
就在FOR循环前 初始化读取r_24c01()的时候就跳到dis_control()//显示模式的选择里 之后就跳到TH1=53266/256;
         TL1=53266%256;
         TH0=63266/256;
         TL0=63266%256;
         EA=1;
         EX0=1;
         IT0=1;
         dula=0;
         wela=0;
就一直死下去了  就怎么安静的死去了

使用特权

评论回复
地板
llia|  楼主 | 2019-7-13 18:58 | 只看该作者
声明: 程序很乱 高人有什么看法尽情的泼洒
#include"reg51.h"
#include"8563.h"
#include"24c01.h"
#include"malfunction.h"
#include"display.h"
#include"key.h"
uchar keyb;
uchar gu_xian=0;
uchar gu_cha[6];
void init()
{
         TMOD=0x11;
         TR0=1;
         ET0=1;
         TR1=1;
         ET1=1;
         TH1=53266/256;
         TL1=53266%256;
         TH0=63266/256;
         TL0=63266%256;
         EA=1;
         EX0=1;
         IT0=1;
         dula=0;
         wela=0;

}
void dis_control()//显示模式的选择
{
         switch(disnum)
                 {
                         case 0:{shuxian[0]=time.s;shuxian[1]=time.m;shuxian[2]=time.h;};break;
                         case 1:{shuxian[0]=time.d;shuxian[1]=time.mouth;shuxian[2]=time.y;};break;
                         case 2:
                                         {
                                                 if(key_num==1){shuxian[0]=0xaa;shuxian[1]=0xff;shuxian[2]=tobcd(a_num);};
                                                 if(key_num==2){shuxian[0]=0xbb;shuxian[1]=0xff;shuxian[2]=tobcd(b_num);};
                                                 if(key_num==3){shuxian[0]=0xcc;shuxian[1]=0xff;shuxian[2]=tobcd(c_num);};
                                                 if(key_num==4){shuxian[0]=0xab;shuxian[1]=0xff;shuxian[2]=tobcd(ab_num);};
                                                 if(key_num==5){shuxian[0]=0xbc;shuxian[1]=0xff;shuxian[2]=tobcd(bc_num);};
                                                 if(key_num==6){shuxian[0]=0xac;shuxian[1]=0xff;shuxian[2]=tobcd(ac_num);};
                                                 /*if(key_num>6)
                                                         {
                                                                 if(key_num==36)key_num=1;
                                                                 r_24c01(0x04+3*key_num,3,shuxian);};*/
                                                         
                                         };        
                                         break;
                         case 3:{shuxian[0]=0xff;shuxian[1]=time.m;shuxian[2]=0xff;};break;
                         case 4:{shuxian[0]=0xff;shuxian[1]=0xff;shuxian[2]=time.h;};break;
                         case 5:{shuxian[0]=time.d;shuxian[1]=0xff;shuxian[2]=0xff;};break;
                         case 6:{shuxian[0]=0xff;shuxian[1]=time.mouth;shuxian[2]=0xff;};break;
                         case 7:{shuxian[0]=0xff;shuxian[1]=0xff;shuxian[2]=time.y;};break;
                         case 8:;break;
                 }
}
void r_24c01(uchar address,uchar z,uchar *databuf)
{
         uchar i;
         Start();
         writebyte(0xa0);        

        writebyte(address);

        Start();
         writebyte(0xa1);

        for(i=0;i<z;i++)
         {
                 databuf[i]=Readbyte();
                         if(i<z-1) WriteACK(0);
                 
        }
         WriteACK(1);
         Stop();
}
void main()
{
r_24c01(0x01,6,gu_cha);
         init();
//        
         a_num=gu_cha[0];
         b_num=gu_cha[1];
         c_num=gu_cha[2];
         ab_num=gu_cha[3];
         bc_num=gu_cha[4];
         ac_num=gu_cha[5];
         
         
         for(;;)
         {
                 dis_control();
                 key();
                 
        }
}
void timesr_1() interrupt 1
{

        display();
          if(gu_xian)
                 {
                         gu_xian++;
                         if(gu_xian>220)
                                 {
                                         gu_xian=0;
                                         EX0=1;
                                 }
         
                 }


        

}
void time1() interrupt 3
{

        if(disnum<2)
                 {
                 
                        R_8563();
                 }
                 
}


void int_0() interrupt 0
{
         uchar gu;
         EX0=0;
         disnum=8;
         gu_xian=1;
         gu=key1|0xf8;

        switch(gu)
                 {
                         case 0xfe:A();break;
                         case 0xfd:B1();break;
                         case 0xfb:C();break;
                         case 0xfc:AB();break;
                         case 0xfa:AC1();break;
                         case 0xf9:BC();break;

                        default: break;

                }
         
就在FOR循环前 初始化读取r_24c01()的时候就跳到dis_control()//显示模式的选择里 之后就跳到TH1=53266/256;
         TL1=53266%256;
         TH0=63266/256;
         TL0=63266%256;
         EA=1;
         EX0=1;
         IT0=1;
         dula=0;
         wela=0;
就一直死下去了  就怎么安静的死去了

使用特权

评论回复
5
wangzsa| | 2019-7-13 19:02 | 只看该作者

void main()
{
r_24c01(0x01,6,gu_cha);
         init();

使用特权

评论回复
6
llia|  楼主 | 2019-7-13 19:06 | 只看该作者

那个数组怎么了,本人慧根有限,望高手指明

使用特权

评论回复
7
zhuww| | 2019-7-13 19:09 | 只看该作者
既然是全局的数组 为啥还要作为参数传入 直接使用不就得了

使用特权

评论回复
8
zhanglli| | 2019-7-13 19:16 | 只看该作者

程序写的太乱 看得眼花
程序得一部分一部分的测试

使用特权

评论回复
9
lium| | 2019-7-13 19:19 | 只看该作者

void main()
{
r_24c01(0x01,6,gu_cha);
         init();
仔细看下:gu_cha与gu_cha[x]有么区别?

使用特权

评论回复
10
guoyt| | 2019-7-13 19:23 | 只看该作者

写程序时要细心呀,写完后再找错误就麻烦了。

使用特权

评论回复
11
llia|  楼主 | 2019-7-13 19:29 | 只看该作者
哦,那我就知道怎么回事了,多谢大家,结贴了哈

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

961

主题

8893

帖子

4

粉丝