浅谈单片机中C语言与汇编语言的转换(2)

START:         
    acall display 
    inc  temp  //加1指令,将操作数所指定的单元或寄存器中的内容加1
    acall delay70  //近程调用delay70
x8:    mov r0,keycount
    cjne r0,#2,F1    //cjne比较跳转指令,若r0=2则跳转到x8,否则跳转到F1。
    ajmp x8
F1:    mov r0,temp
    cjne r0,#99,START    //若r0<99时,重复循环,否则temp=0
      mov temp,#0
    ajmp START   
F9:       
        acall key               
        mov r0,keycount
        cjne r0,#0,F2  //keycount=0顺序执行,否则跳转到F1
        CLR P1.3      //清0
        SETB TR0   
     
F2:      mov r0,keycount    //第二次按键
      cjne r0,#2,F2
      clr TR0
      reti                 
      mov r0,keycount          //第三次按键
      cjne r0,#3,F3
      mov temp,#0
      mov keycount,#0

inc 增量指令,功能是将操作数所指定的单元或寄存器中的内容加1,其结果返还回原操作数单元中。

clr 位复位,功能是对操作数所指出的位进行清“0”操作。

或者在中断函数中

timer0:
w1:   
    acall key
    mov TH0,#60
    mov TL0,#176
    cpl p1.0   
    JB keycount,x2
    ajmp x3
x2:   
    ajmp START
    clr  p1.0
    ajmp w1
    ajmp w1

x3:      mov r0,keycount
      cjne r0,#3,w1    //若r0=3则顺序执行,否则跳转到w1
      mov temp,#0
      mov keycount,#0       
      ret

(4)C语言58-64行display函数改为

display:       
    mov a,temp
    mov b,#10
    div ab  //除法指令,实现两个八位无符号数的除法操作。
    mov r2,A   
    mov r3,B
    mov dptr,#tab //16位数据传送使用方式
    mov a,r2
    movc a,@a+dptr //查表,先将累加器A的内容与数据指针寄存器DPTR的内容相加,再以其结果为地址,将该地址的结果送入A中
    mov P0,a
    acall delay70
    nop  //空指令
    mov a,r3
    movc a,@a+dptr
    mov P2,a
    nop
    acall delay70   
    ret

div为除法指令,功能是实现两个8位无符号数的除法操作,一般被除数放在累加器A中,除数放在寄存器B中。指令执行后,商放在A中,余数放在B中。

movc为查表指令,先将累加器A的内容与数据指针寄存器DPTR的内容相加,再以其结果为地址,将该地址的内容送入A中。

nop为空操作指令,它不作任何操作,但要占用一个机器周期(即12个振荡周期)的时间,常用于延时或等待。(有些程序执行的效果由于延时时间太短,在人眼视觉暂时作用下无法辨认清楚)

此段程序的作用在于将一个两位数分别分在一个十位上的数码管和一个个位上的数码管显示。

(5)C语言66-76行key函数改为

1 key: 2 jb anjian,F6 //若anjian=0则顺序执行,否则跳转到F6 3 ACALL delay5 4 inc keycount //keycount++ 5 F6: 6 ret

jb为位条件转移指令,功能是若直接寻址的位bit=1,则程序转移到指定的目标地址去执行,若bit=0,则程序顺序执行。

(6)C语言78-83行delay函数改为

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/4d44d39645c5d497d2e6a8c672900322.html