求大神幫我把這份匯編語言的代碼轉化成C語言的代碼,可以在KEIL里面用的。
這代碼是我找的豆漿機Proteus仿真源碼,但是我匯編語言不會,求翻譯。。。。。
豆漿機的仿真電路圖
ORG 0000H
LJMP MAIN
ORG 0003H
LJMP INT0_RD ;INT0口中斷(液位溢出和液位過低中斷)入口
ORG 0013H
LJMP INT1_RD ;INT1口中斷(超液位中斷)
ORG 0030H ;置初始狀態
MAIN: MOV SP,#70H
SETB IT0 ;INT0口中斷觸發方式為跳變觸發`
SETB IT1 ;INT1口中斷觸發方式為跳變觸發
SETB EA ;開放中斷
MOV IE,#85H ;開中斷
MOV IP,#01H ;INT0中斷源為高優先級,INT1中斷源為低優先級
CLR P3.0 ;設初值
CLR P3.1
MOV 30H,#00H ;設置時間單元清零
MOV 31H,#00H ;顯示模式單元清零
MOV 34H,#00H ;顯示定時時間單元清零
MOV 32H,#00H ;計時顯示十位清零
MOV 33H,#00H ;計時顯示個位清零
SCAN_RD:LCALL XS_RD ;開始無鍵按下,顯示00
LCALL SCAN_KEYB ;模式選擇
JZ SCAN_RD ;有鍵按下 向下
LCALL KEY_PRSD
MOV DPTR,#JMP_RD ;設置轉移表首地址
MOV A,R5 ;取鍵值
RL A ;鍵值乘以2
INC R5
JMP @A+DPTR
JMP_RD:AJMP PRO_00 ;模式0
AJMP PRO_01 ;模式1
AJMP PRO_02 ;模式2
PRO_00:MOV 30H,#06 ;定時時間為6s
AJMP LOOP_W PRO_01:MOV 30H,#09 ;定時時間為9s
AJMP LOOP_W PRO_02:MOV 30H,#12 ;定時時間為12s
AJMP LOOP_W ;模式選擇后閃爍3次
LOOP_W:MOV 34H,30H ;調入定時時間顯示數據
MOV R7,#3 ;閃爍3次
LOOP_RD:MOV R6,#30 ;延時20MS的次數
LOOP0_RD:LCALL XS_RD ;調顯示程序
LCALL DL20MS
DJNZ R6,LOOP0_RD ;1S
MOV R6,#25 ;延時20MS的次數
LOOP1_RD:LCALL XS0_RD
LCALL DL20MS
DJNZ R6, LOOP1_RD ;0.5S
DJNZ R7,LOOP_RD ;閃爍3次
;開始工作
MOV R6,#02 ;粉碎次數
LCALL JR_RD
G00N_GZ:LCALL
FS_RD
LCALL JR_RD
DJNZ R6, G00N_GZ
LCALL BAOJ_WRD ;加熱子程序
JR_RD: MOV 34H,30H ;給顯示單元置數
SETB P3.0 ;加熱
MOV R4,#50 ;20MS程序循環50次
GOON_JR:LCALL TIME_19MS ;調用定時20MS子程序
LCALL XS_RD ;顯示
DJNZ R4,GOON_JR ;到1S了
MOV R4,#50 ;20MS程序循環50次
DJNZ 34H,GOON_JR ;倒計時完成
CLR P3.0 ;停止加熱
RET ;粉碎子程序
FS_RD: MOV 34H,30H ;重新給顯示單元置數
SETB P3.1 ;粉碎
MOV R4,#50 ;20MS程序循環50次
GOON_FS:LCALL TIME_19MS ;調用定時20MS子程序
LCALL XS_RD ;顯示
DJNZ R4,GOON_FS ;到1S
MOV R4,#50 ;20MS程序循環50次
DJNZ 34H,GOON_FS ;粉碎完畢
CLR P3.1 ;停止粉碎
RET ;鍵盤子程序
SCAN_KEYB:MOV P2,#0EFH ;掃描有無按鍵按下
MOV A, P2
ANL A, #0EFH
XRL A, #0EFH
JZ NO_KEY
ACALL DL20MS
ANL A, #0EFH
XRL A, #0EFH
JZ NO_KEY
NO_KEY:RET
KEY_PRSD: MOV R4, P2
MOV R5, #00H
MOV DPTR,#KEY_TAB
CAL_VAL: MOV A,R5
MOVC A,@A+DPTR ;查鍵值表
XRL A,R4
JZ FIXED
INC R5 ;鍵值加1
SJMP CAL_VAL
FIXED: MOV A,P2 ;判斷按鍵是否釋放
ANL A, #0EFH
XRL A, #0EFH
JNZ FIXED
ACALL DL20MS
MOV A, P2
ANL A, #0EFH
XRL A, #0EFH
JNZ FIXED
RET
KEY_TAB: DB 0EBH, 0EDH, 0EEH
DL20MS: MOV R3, #20
DD1: MOV R4, #200
DD2: NOP
NOP
NOP
DJNZ R4, DD2
DJNZ R3, DD1
RET ;顯示子程序
XS_RD: MOV 31H,R5 ;調入模式顯示數據
MOV R0,#31H ;顯示緩存區數據
MOV P1,#00000010B ;第三個燈為顯示位置
ACALL DISP_RD ;顯示一位
XS0_RD: MOV A,34H ;將定時數據分為兩位
MOV B, #10
DIV AB
MOV 32H,A ;十位
MOV 33H,B ;個位
CJNE A,#00H,XS1_RD0 ;十位是否為0
AJMP XS1_RD
XS1_RD0:MOV R0,#32H
MOV P1,#00000100B ;第五個為顯示位置
ACALL DISP_RD ;顯示一位
XS1_RD: MOV R0,#33H ;顯示緩存區數據
MOV P1,#00000101B ;第六個燈為顯示位置
ACALL DISP_RD ;顯示一位
RET
DISP_RD:MOV DPTR,#LED_RD ;字型碼表首地址
MOV A,@R0 ;取顯示數據
MOVC A,@A+DPTR ;求顯示數據的字型碼
MOV P0,A ;輸出字型碼
ACALL DL1MS ;穩定顯示1ms
RET ;返回
;延時小程序
DL1MS: MOV R3, #200
DDD1: NOP
NOP
NOP
DJNZ R3, DDD1
RET
;字型碼表
LED_RD: DB 3FH, 06H, 5BH, 4FH, 66H; '0, 1,2, 3,4’
DB 6DH, 7DH, 07H, 7FH, 6FH; '5, 6, 7, 8,9’ ;定時19MS子程序
TIME_19MS:MOV TMOD,#01H ;設置工作方式1和定時模式
MOV TH0,#0B5H ;計數初值為46536(O)
MOV TL0, #0C8H
SETB TR0 ;啟動定時器
CONT_RD: JBC TF0,OVER_RD ;是否溢出
SJMP CONT_RD OVER_RD: MOV TH0,#0B5H ;重新設計數初值為46536(O)
MOV TL0, #0C8H
RET ;溢出中斷和液位過低中斷
ORG 0200H
INT0_RD:LCALL BAOJ_WRD ;直接報警并關發熱器和電動機電源
RETI ;超液位中斷
ORG 0300H
INT1_RD:CLR EA ;關中斷
PUSH ACC ;保護現場
PUSH PSW
SETB EA ;開中斷
SETB RS0 ;把工作寄存器切換到1區
MOV P1,#00000111B ;報警燈亮
JNB P3.0,INT0_FS ;判斷是否在加熱
CLR P3.0 ;停止加熱
WAIT_RD: JNB P3.3,WAIT_RD ;液位是否下降
SETB P3.0 ;繼續極熱
LJMP OK
INT0_FS:CLR P3.1 ;停止粉碎
WAIT0_RD:JNB P3.3,WAIT0_RD ;液位是否下降
SETB P3.1 ;繼續粉碎
OK:CLR EA ;關中斷
POP PSW ;恢復現場
POP ACC
SETB EA ;開中斷
RETI ;報警子程序
BAOJ_WRD:CLR P3.0 ;關電源
CLR P3.1
MOV P1,#00000110B ;蜂鳴器響
LCALL DL1MS
MOV P1,#00000111B ;報警燈亮
LCALL DL1MS
AJMP BAOJ_WRD
|