求助!求大神帮忙把一段汇编语言翻译成C语言!
时间:10-02
整理:3721RD
点击:
这是段 直流电机闭环调速的程序,求大神帮忙翻译!跪谢!
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
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
木有人帮忙吗?