注册 登录
编程论坛 单片机编程

C语言正确,我想把它转变成汇编的形式,但没转换成,出错了,求赐教

Redeyes 发布于 2016-12-23 01:55, 5023 次点击
程序代码:
#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
uchar shi,ge,aa,keycount=0,temp;
sbit anjian=P1^7;

uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void display(shi,ge);
void key ();
void init();
void delay(uint z);
/*-----主程序-----*/
void main()
{
    init();        //初始化
    while(1)
    {   
        key ();
        if(keycount==1)
         TR0=1;        //开中断
          if(keycount==2)
           TR0=0;
         if(keycount==3)
        {   
            temp=0;
            keycount=0;
        }
        if(aa==10){aa=0;
         if(temp<=99)
            {
               
                temp++;display(shi,ge);
            }
            else
            temp=0;}
        
    }
}


/*------初始化程序-------*/
void init()
{   
    keycount=0;
    temp=0;
    TMOD=0x01;
    TH0=(65536-50000)/256;
    TL0=(65536-50000)%256;
    EA=1;
    ET0=1;
    //TR0=0;        
}

/*-----定时器中断-----*/
void timer0() interrupt 1
{
    TH0=(65536-50000)/256;
    TL0=(65536-50000)%256;
    aa++;   
}

/*-----显示子程序-----*/
void display(shi,ge)
{   
    shi=temp/10;
    ge=temp%10;
    P0=table[shi];;delay(70);
    P2=table[ge]; ;delay(70);
}

/*-----按键检测子程序-----*/
void key ()
{
    if(anjian==0)
    {
        delay(5);        //消抖
        if(anjian==0)
        keycount++;
    }
     //while(anjian==0);   
//display(shi,ge);        //等待按键弹起
}

/*-----延时子程序-----*/
void delay(uint z)        //延时约1ms
{
    uint x,y;
    for(x=z;x>0;x--)
        for(y=100;y>0;y--);
}        


程序代码:
     ORG 0000H
     ajmp START
     org 000bh
     ajmp timer0               
anjian        equ         P1.7     
keycount     equ      40h
shi             equ         41h
gewei         equ         42h
aa             equ         43h
temp        equ         44h
tab:     db         3fh,6h,5bh,4fh,66h
        db         6dh,7dh,7h,7fh,6fh

     
       acall init
START:
         
       //位为1转移 key 按键判断
        
        acall key                //加1指令      
   
            JNB keycount,F1   //
            SETB TR0
         
F1:      
      mov r0,keycount
      cjne r0,#2,F2
      clr TR0
F2:
       mov r0,keycount
      cjne r0,#3,F3
      mov temp,#0
      mov keycount,#0
F3:
        mov r0,aa
        cjne r0,#10,F4
         mov aa,#0
        
        mov r0,temp
          cjne r0,#100,F5
        AJMP F4
F5:        inc temp
        acall display
         
  
F4:            
            mov temp,#0
key:
        jb anjian,F6
          ACALL delay5
         jb anjian,F6
         inc keycount
   
F6:         ret
init:
     mov keycount,#0
     mov temp,#1
     mov tmod,#01h
     mov TH0,#60
    mov TL0,#176
     setb EA
     setb ET0
     ret
display:        
     mov a,temp
     mov b,#10
     div ab
     mov r2,A         //r2  十位 r3 个位    查表
     mov r3,B
     mov dptr,#tab
     mov a,r2
     movc a,@a+dptr
     mov P0,a
     acall delay70
     nop
     nop
     mov a,r3
     movc a,@a+dptr
     mov P2,a
     nop
     nop
     acall delay70
         
     reti

  
                  


delay70:
    mov r6,#70
D2:    mov R7,#248   
d1:    djnz R7,d1
    djnz R6,D2
    ret
        
delay5:   
        mov r6,#5
F7:    mov R7,#248
F8:        djnz r7,F8
        djnz r6,F7
        ret

 

timer0:

    mov TH0,#60
    mov TL0,#176
    cpl p1.0
    inc aa            //中断函数
    ret
   
    end





就是这样子,
10 回复
#2
Redeyes2016-12-23 11:44
根据上述C语言改的汇编代码
程序代码:
     ORG 0000H
     ajmp START
     org 000bh
     ajmp timer0               
anjian        equ         P1.7     
keycount     equ      40h
shi             equ         41h
gewei         equ         42h
aa             equ         43h
temp        equ         44h
tab:     db         3fh,6h,5bh,4fh,66h
        db         6dh,7dh,7h,7fh,6fh

     
       acall init
START:
         
       //位为1转移 key 按键判断
        
        acall key                //加1指令      
   
            JNB keycount,F1   //
            SETB TR0
         
F1:      
      mov r0,keycount
      cjne r0,#2,F2
      clr TR0
F2:
       mov r0,keycount
      cjne r0,#3,F3
      mov temp,#0
      mov keycount,#0
F3:
        mov r0,aa
        cjne r0,#10,F4
         mov aa,#0
        
        mov r0,temp
          cjne r0,#100,F5
        AJMP F4
F5:        inc temp
        acall display
         
  
F4:            
            mov temp,#0
key:
        jb anjian,F6
          ACALL delay5
         jb anjian,F6
         inc keycount
   
F6:         ret
init:
     mov keycount,#0
     mov temp,#1
     mov tmod,#01h
     mov TH0,#60
    mov TL0,#176
     setb EA
     setb ET0
     ret
display:        
     mov a,temp
     mov b,#10
     div ab
     mov r2,A         //r2  十位 r3 个位    查表
     mov r3,B
     mov dptr,#tab
     mov a,r2
     movc a,@a+dptr
     mov P0,a
     acall delay70
     nop
     nop
     mov a,r3
     movc a,@a+dptr
     mov P2,a
     nop
     nop
     acall delay70
         
     reti

  
                  


delay70:
    mov r6,#70
D2:    mov R7,#248   
d1:    djnz R7,d1
    djnz R6,D2
    ret
        
delay5:   
        mov r6,#5
F7:    mov R7,#248
F8:        djnz r7,F8
        djnz r6,F7
        ret

 

timer0:

    mov TH0,#60
    mov TL0,#176
    cpl p1.0
    inc aa            //中断函数
    ret
   
    end     ORG 0000H
     ajmp START
     org 000bh
     ajmp timer0               
anjian        equ         P1.7     
keycount     equ      40h
shi             equ         41h
gewei         equ         42h
aa             equ         43h
temp        equ         44h
tab:     db         3fh,6h,5bh,4fh,66h
        db         6dh,7dh,7h,7fh,6fh

     
       acall init
START:
         
       //位为1转移 key 按键判断
        
        acall key                //加1指令      
   
            JNB keycount,F1   //
            SETB TR0
         
F1:      
      mov r0,keycount
      cjne r0,#2,F2
      clr TR0
F2:
       mov r0,keycount
      cjne r0,#3,F3
      mov temp,#0
      mov keycount,#0
F3:
        mov r0,aa
        cjne r0,#10,F4
         mov aa,#0
        
        mov r0,temp
          cjne r0,#100,F5
        AJMP F4
F5:        inc temp
        acall display
         
  
F4:            
            mov temp,#0
key:
        jb anjian,F6
          ACALL delay5
         jb anjian,F6
         inc keycount
   
F6:         ret
init:
     mov keycount,#0
     mov temp,#1
     mov tmod,#01h
     mov TH0,#60
    mov TL0,#176
     setb EA
     setb ET0
     ret
display:        
     mov a,temp
     mov b,#10
     div ab
     mov r2,A         //r2  十位 r3 个位    查表
     mov r3,B
     mov dptr,#tab
     mov a,r2
     movc a,@a+dptr
     mov P0,a
     acall delay70
     nop
     nop
     mov a,r3
     movc a,@a+dptr
     mov P2,a
     nop
     nop
     acall delay70
         
     reti

  
                  


delay70:
    mov r6,#70
D2:    mov R7,#248   
d1:    djnz R7,d1
    djnz R6,D2
    ret
        
delay5:   
        mov r6,#5
F7:    mov R7,#248
F8:        djnz r7,F8
        djnz r6,F7
        ret

 

timer0:

    mov TH0,#60
    mov TL0,#176
    cpl p1.0
    inc aa            //中断函数
    ret
   
    end

只有本站会员才能查看附件,请 登录
#3
hu9jj2016-12-24 06:41
没有转换成功则说明还有bug。汇编的可读性较差,编程效率低,楼主那么长的代码,恐怕没有几个人会有耐心仔细去分析问题所在的。
#4
Redeyes2016-12-24 12:44
昨天我又重新写了一遍,实现了其中一小部分的功能了,剩下的我自己再看看。前辈说的对,这么长的代码,而且是可读性较差的汇编语言,确实不好回答!
谢谢指点!
#5
Redeyes2016-12-24 12:44
昨天我又重新写了一遍,实现了其中一小部分的功能了,剩下的我自己再看看。前辈说的对,这么长的代码,而且是可读性较差的汇编语言,确实不好回答!
谢谢指点!
#6
hu9jj2016-12-25 08:30
象我们业余的,要从书面上分析出代码中存在的所有问题,是非常困难的,最基本的方法就是上机测试,逐步排错,最终实现预想的结果。当然,简单短小的程序除外。
#7
Redeyes2016-12-27 12:38
http://  这是我根据这次单片机设计写的一篇博文,算是做了一个总结。
#8
q9137942862017-07-02 00:11
像我们业余的,从书上抄代码都能抄错。还找不到问题。
#9
yehuabao2017-08-06 06:10
以下是引用q913794286在2017-7-2 00:11:16的发言:

像我们业余的,从书上抄代码都能抄错。还找不到问题。

有同样的感受。
#10
云鬼鬼2017-08-21 12:28
像我们这些业余的,别说从书上抄代码了,就是给我本书,我都不知道翻哪一页
#11
东方王者2017-11-26 16:10
看不懂
1