求助!求大神帮忙把一段汇编程序翻译成C语言!

2019-03-24 18:46发布

这是一段 直流电机闭环调速的程序 求大神帮忙翻译!跪谢!
ORG    0000H
SJMP  DISPLAY
ORG   0003H   
LJMP  BUTTON                ;  外部0中断入口地址
ORG   000BH
LJMP  DINGSHI                ;  定时中断T0入口地址
RS    EQU    P3.0
RW    EQU    P3.1
E     EQU    P3.4
ORG    0030H                 ;  此次直流电机的设计以LCD字符夜晶的
                              ;  显示程序为主程序
DISPLAY:  
SETB   EA                   ;  打开中断总开关
SETB   EX0                  ;  打开外部中断0开关
SETB   IT0                   ;  打开外部中断0下降沿触发
MOV    TMOD,#01H          ;  设置定时工作方式
MOV    TL0,#0FFH           ;  设置定时初值
MOV    TH0,#0FFH
SETB  ET0                   ;  打开定时中断T0开关   
CLR   P0.5         
CLR   P0.6
CLR   P0.7
SETB  TR0                   ;  定时器T0开始定时
MOV   DPTR,#TAB            ;  夜晶显示的字符首地址
MOV   R0,#00H               ;  脉宽的初值
MOV   R1,#16                 ;  "SET SPEED PLEASE"的字符个数
MOV   R3,#00H
MOV   R4,#00H
LP9:
LCALL CHUSHI
LP2:
ACALL BUSY
MOV   A,#00H
MOVC  A,@A+DPTR
MOV   P1,A
ACALL DATAS
INC   DPTR  
DJNZ  R1,LP2  
LP3:
CJNE  R3,#00H,LP4
CJNE  R4,#00H,LP4
SJMP  LP3  
LP4:  MOV   R7,#00H         ;  中断的标志
MOV   R5,#09H               ;  CURRENT : 的字符个数
ACALL BUSY
MOV   P1,#0C0H
ACALL ENABLE
MOV   DPTR,#MMTAB
ACALL BUSY
LP5:   
MOV   A,#00H
MOVC  A,@A+DPTR
MOV   P1,A
INC   DPTR
ACALL DATAS
ACALL BUSY
DJNZ  R5,LP5   
MOV   DPTR,#STAB
MOV   A,R2
MOV   P1,A
ACALL DATAS
ACALL BUSY
MOV   A,R3                  ;  显示速度的十位
MOVC  A,@A+DPTR
MOV   P1,A
ACALL DATAS
ACALL BUSY
MOV   A,R4                   ;  显示速度的个位
MOVC  A,@A+DPTR
MOV   P1,A
ACALL DATAS                 ;  使夜晶始终显示当前电机的速度
LP8:                        
CJNE   R7,#00H,LP7           ;  速度不变时等待
LJMP  LP8                    ;  速度变时重新读入速度
LP7:
SJMP  LP4
CHUSHI:                      ;  使夜晶显示的一些初始设置
ACALL BUSY            
MOV   P1,#00000001B         ;  清屏并光标复位
ACALL ENABLE         
ACALL BUSY
MOV   P1,#00111000B         ;  设置显示模式:8位2行5×7点阵
ACALL ENABLE
ACALL BUSY
MOV   P1,#00001111B         ;  显示器开、光标开、光标允许闪烁
ACALL ENABLE
ACALL BUSY
MOV   P1,#00000110B         ;  文字不动,光标自动右移
ACALL ENABLE
ACALL BUSY
MOV   P1,#80H               ;  写入显示起始地址
ACALL ENABLE         
RET
ENABLE:                     ;  写入控制命令的子程序
SETB  E
CLR   RS
CLR   RW
CLR   E
RET
DATAS:                      ;  写入数据子程序
SETB  E
SETB  RS
CLR   RW
CLR   E
RET
BUSY:                       ;  准备写入数据
CLR   E
MOV   P1,#0FFH
CLR   RS
SETB  RW
SETB  E
JB    P1.7,BUSY
RET
ORG 2000H
DINGSHI:                    ;  定时中断服务程序
CPL P0.7     
JNB P0.7,Z1                  ;  周期一定
MOV A,#0FFH
SUBB A,R0      
MOV TH0,A
SETB TR0
RETI
Z1:  MOV TH0,R0             ;  脉宽
SETB TR0
RETI   
BUTTON:                     ;  从控制键盘中读取操作命令
PUSH ACC           
CLR EX0
CLR EA
INC  R7   ;
MOV A,#0FFH
MOV P2,A
MOV A,P2
JNB ACC.0,AA0   
JNB ACC.1,KK0
JNB ACC.2,ZZ
JNB ACC.3,FF
JNB ACC.4,WW0
AJMP QQ
AA0:   CJNE R0,#0FFH, AA1     ;  加速操作
AJMP QQ  
AA1:   MOV A,R0
ADD A,#5
MOV R0,A
AJMP QQ
KK0:   CJNE R0,#00,MM        ;  减速操作
AJMP QQ  
MM:    MOV A,R0
SUBB A,#5
MOV R0,A
AJMP QQ
QQ:    MOV A,R0         
MOV B,#5         
DIV AB
MOV B,#10
DIV AB
MOV R3,A
MOV R4,B
SETB EX0
LCALL DELAY
LCALL DELAY
LCALL DELAY
LCALL DELAY
SETB  EA
POP  ACC
RETI
ZZ:    SETB P0.5               ;  正转操作
CLR  P0.6  
MOV  R2,#2BH                 ;  正转标志 "+"
LCALL DELAY
LCALL DELAY
LCALL DELAY
SETB EX0
SETB  EA
POP  ACC
RETI
FF:    CLR P0.5                 ;  反转操作  
SETB P0.6
MOV  R2,#2DH                  ;  反转标志 "-"
LCALL DELAY
LCALL DELAY
LCALL DELAY
SETB EX0
SETB  EA
POP  ACC
RETI
WW0:    CLR P0.5               ;  停止操作
CLR P0.6
LCALL DELAY
LCALL DELAY
LCALL DELAY
SETB EX0
SETB  EA
POP  ACC
RETI
DELAY:                          ;  延时子程序
MOV R5,#0E0H
MM0:   MOV R6,#30H   
MM1:   DJNZ R6,MM1
DJNZ R5,MM0
RET
TAB:   DB  53H,45H,54H,20H   
DB  53H,50H,45H,45H              ;  "SET SPEED PLEASE" 代码
DB  44H,20H,50H,4CH
DB  45H,41H,53H,45H
STAB:   DB  30H,31H,32H,33H
DB  34H,35H,36H,37H              ;  "0,1,2,3,4,5,6,7"  代码
DB  38H,39H,41H,42H              ;  "8,9,A,B,C,D,E,F"
DB  43H,44H,45H,46H
MMTAB:   DB  43H,4FH,52H,52H
DB  45H,4EH,54H,20H              ;  " CURRENT : "  代码
DB  3AH
END 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。