汇编程序转c语言程序,汇编程序转C语言

汇编程序转C语言

我有个汇编的程序,很简单,是电子琴,谁能帮我转成C语言的?

DATAS  SEGMENT

DATA1  DB        30H,34H,3AH,42H,45H,4EH,58H,62H,68H    MSG      DB'',0DH,0AH

DB'|~~~~~~~~~~~~~~~~~~~~~~~~Dianziqin~~~~~~~~~~~~~~~~~~~~~~~~|',0DH,0AH,0DH,0AH

NUM  DB        ?

DATAS  ENDS

STACKS  SEGMENT

STACKS  ENDS

CODES  SEGMENT

ASSUME    CS:CODES,DS:DATAS,SS:STACKS

START:

MOV       AX,DATAS

MOV       DS,AX

MOV       BX,OFFSET DATA1

MOV       DX,OFFSET MSG

MOV       AH,9

INT       21H

SKY:

MOV       AH,07H

INT       21H

CMP       AL,3

JE        EXIT1

CMP       AL,31H

JL        SKY

CMP       AL,39H

JG        SKY

SUB       AL,31H

MOV       AH,00H

MOV       SI,AX

MOV       NUM,AL

MOV       AL,[BX][SI]

CALL      INIT

CALL      WAITF

IN        AL,61H

AND       AL,0FCH

OUT       61H,AL

JMP       SKY

INIT  PROC      NEAR

MOV       DL,0AH

MUL       DL

MOV       DI,AX

MOV       AL,0B6H

OUT       43H,AL

MOV       DX,0012H

MOV       AX,34DEH

DIV       DI

OUT       42H,AL

MOV       AL,AH

OUT       42H,AL

IN        AL,61H

MOV       AH,AL

OR        AL,03H

OUT       61H,AL

RET

INIT  ENDP

WAITF  PROC      NEAR

PUSH      AX

WAITF1:

IN        AL,61H

AND       AL,15H

CMP       AL,AH

JE        WAITF1

MOV       AH,AL

LOOP      WAITF1

POP       AX

RET

WAITF  ENDP

EXIT1:

MOV       AH,4CH

INT       21H

CODES  ENDS

END       START

4个回答

67b0a70febe552c922c54bb8560d6ef6.png

3fb66540e08355b3c8ac72e3a79b5dd0.png

这个程序我调试过了,没问题,但我的晶振和单片机的时钟周期和你的不一样,所以你只需要把延时改下就可以了,具体多少你算下吧,不能不会算这个吧

check_bit就是你P3口的一位

bit check_bit(void)

{

unsigned int i;

if(check_bit==1)

{

return (1);//为高什么也不做

}

else

{

for(i=0;i<1500;i++)//延时稍大于200ms就行了。

{

if (check_bit==1)//在200ms内出现高也什么都不做。

return (1);

}

return (0);//程序执行到这时低电平就一定大于200ms了

}

}

如果这个程序返回1就说明输入的为高电平,不用管,而返回0时就证明有大于200ms的低电平,这时你调下报警程序就可以了。

程序虽小,也花了我一定时间去想呢。有问题再给我发消息吧,很乐意帮忙。

你直接调用它就行了,把它当个子程序用

;这也是一个子程序,用来调用

check_bit bit p3.0 ;随便一个IO都可以

JNB check_bit,NEXT

SETB F0

SJMP BACK

NEXT:加一段你想要的延时时间(延时会编吧)

并时刻判断 check_bit的状态,(判断条件在延时内部)

在规定时间内变为1,不符合你

的要求就

SETB F0

SJMP BACK

如果超过你的延时还没变为高(完成延时后了),那

就说明符合你的要求(假如延时大于200ms)

CLR F0

BACK;RET

你仔细看下,和C的结构其实是一样的,就是指令不一样了而已。

最后判断F0的值是什么,它是PSW SFR中的一位,可用来用户自定义使用。

如果F0为1就说明输入的为高电平,不用管,而F0为0时就证明有大于200ms的低电平,这时你调下报警程序就可以了。

◆◆

评论读取中....

请登录后再发表评论!

◆◆

修改失败,请稍后尝试

9614d57df18d35ee9d3e770239d798bf.png

按单片机的思想看看~

◆◆

评论读取中....

请登录后再发表评论!

◆◆

修改失败,请稍后尝试

精华知识

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值