高分求高人解释DSP2407汇编程序!!!!!! 50
本人新手,对dsp汇编一窍不通。哪位高手帮忙注释一下!!!不需要说明功能,只要每句话的意思。满意再加50分。*******************************...
本人新手,对dsp汇编一窍不通。哪位高手帮忙注释一下!!!不需要说明功能,只要每句话的意思。满意再加50分。
*********************************************
* 主程序
**********************************************
MAINLOOP:
LDP #EVBIFRA>>7
BIT EVBIFRA,BIT7
BCND LOOP_COM,NTC
SPLK #80H,EVBIFRA
KICK_DOG
CALL SCI_TIMER,AR1
LDP #MS_CNT>>7
LACL MS_CNT
ADD #1
SACL MS_CNT ;MS计数器
LDP #MS_CNT1>>7
LACC MS_CNT1
ADD #1
SACL MS_CNT1
SUB #2
BCND MS2_LOOP,EQ
SUB #2
BCND LOOP_COM,NEQ
MS2_LOOP:
**********************************************
KICK_DOG
CALL SUB_KEYBOARD,AR1
CALL SUB_CON_CAL,AR1
CALL SUB_SVC_WR,AR1
CALL SUB_VFIRMS_CAL,AR1
CALL SUB_COMMAND_PARA_SET,AR1
CALL SUB_RUN_DEAL,AR1
CALL SUB_PROTECT_DEAL,AR1
CALL SUB_VF_CURVE_CAL,AR1
CALL SUB_RUN_CONTROL,AR1
LDP #MS_CNT1>>7
LACC MS_CNT1
SUB #4
BCND LOOP_COM,NEQ
SPLK #0,MS_CNT1
**********************************************
KICK_DOG
CALL SUB_ACTUAL_TO_MARK,AR1 ;;实际值转化为标幺值
CALL SUB_INPUT_ERR,AR1
CALL SUB_OUTPUT_ERR,AR1
CALL SUB_TIME_CAL,AR1
CALL SUB_FAN_CONTROL,AR1 ;;风扇控制子程序
CALL SUB_OVERLOAD,AR1 ;;过载保护检测子程序
CALL SUB_DIS_FILT,AR1 ;;滤波子程序
CALL SUB_TEMPERATURE,AR1 ;;散热器1/2温度计算
CALL SUB_POWER_TOR_CAL,AR1
CALL SUB_ANALOG_IN,AR1
CALL SUB_ANALOG_OUT,AR1
CALL SUB_SWITCH_INPUT,AR1
CALL SUB_SWITCH_OUTPUT,AR1
CALL SUB_DI_COMD,AR1 ;;完成端子命令处理
LOOP_COM:
CALL SUB_SCI,AR1 ;;通讯处理子程序
CALL SUB_FAULT_CHECK,AR1 ;;故障检测子程序
CALL SUB_CON_SET,AR1 ;;参数设定子程序
CALL SUB_ICOE_CAL,AR1
CALL SUB_POFFSAVE,AR1
B MAINLOOP 展开
*********************************************
* 主程序
**********************************************
MAINLOOP:
LDP #EVBIFRA>>7
BIT EVBIFRA,BIT7
BCND LOOP_COM,NTC
SPLK #80H,EVBIFRA
KICK_DOG
CALL SCI_TIMER,AR1
LDP #MS_CNT>>7
LACL MS_CNT
ADD #1
SACL MS_CNT ;MS计数器
LDP #MS_CNT1>>7
LACC MS_CNT1
ADD #1
SACL MS_CNT1
SUB #2
BCND MS2_LOOP,EQ
SUB #2
BCND LOOP_COM,NEQ
MS2_LOOP:
**********************************************
KICK_DOG
CALL SUB_KEYBOARD,AR1
CALL SUB_CON_CAL,AR1
CALL SUB_SVC_WR,AR1
CALL SUB_VFIRMS_CAL,AR1
CALL SUB_COMMAND_PARA_SET,AR1
CALL SUB_RUN_DEAL,AR1
CALL SUB_PROTECT_DEAL,AR1
CALL SUB_VF_CURVE_CAL,AR1
CALL SUB_RUN_CONTROL,AR1
LDP #MS_CNT1>>7
LACC MS_CNT1
SUB #4
BCND LOOP_COM,NEQ
SPLK #0,MS_CNT1
**********************************************
KICK_DOG
CALL SUB_ACTUAL_TO_MARK,AR1 ;;实际值转化为标幺值
CALL SUB_INPUT_ERR,AR1
CALL SUB_OUTPUT_ERR,AR1
CALL SUB_TIME_CAL,AR1
CALL SUB_FAN_CONTROL,AR1 ;;风扇控制子程序
CALL SUB_OVERLOAD,AR1 ;;过载保护检测子程序
CALL SUB_DIS_FILT,AR1 ;;滤波子程序
CALL SUB_TEMPERATURE,AR1 ;;散热器1/2温度计算
CALL SUB_POWER_TOR_CAL,AR1
CALL SUB_ANALOG_IN,AR1
CALL SUB_ANALOG_OUT,AR1
CALL SUB_SWITCH_INPUT,AR1
CALL SUB_SWITCH_OUTPUT,AR1
CALL SUB_DI_COMD,AR1 ;;完成端子命令处理
LOOP_COM:
CALL SUB_SCI,AR1 ;;通讯处理子程序
CALL SUB_FAULT_CHECK,AR1 ;;故障检测子程序
CALL SUB_CON_SET,AR1 ;;参数设定子程序
CALL SUB_ICOE_CAL,AR1
CALL SUB_POFFSAVE,AR1
B MAINLOOP 展开
2个回答
展开全部
还是用C来写吧,缺少对抢答器功能方面的描述,不知道程序要实现哪些功能。
读了下这段汇编程序,觉得有个地方写法似乎不太妥当,大家讨论一下:
LOOP:
MOV P1,A
SJMP LOOP
RET
显示子程序中这个地方为无条件跳转,也就是说,按键后显示值无法刷新,除非有系统中断或复位。我觉得编程本意还是送显后接着执行其他指令,否则这段下面的返回指令RET也就意义不明显了。
注释了一下程序,不知对不对
ORG 0000H;
MOV P1,#7FH ; 初始化P1口输出逻辑为0111 1111
MAIN:
MOV P3,#3CH ; P3 0011 1100
MOV A,P3 ;读入P3.5 P3.4 P3.3 P3.2的电平逻辑
ANL A,#3CH; ;取上述四位
CJNE A,#3EH,START ; 如果A不等于0011 1110 (P3.1有正电平跳变)跳转至START
SJMP MIAN ; 构造主程序超级循环,到这里主程序结束,一直重复上述过程
START:;如果P3.1 有0--》1的电平跳变,则开始键扫?
MOV A,P3 ;读入P3口信息,给ACC
ANL A,#3CH ;取中间四位(P3.5 P3.4 P3.3 P3.2)
CJNE A,#3CH,KEY1234 ; 如果有输入,转去扫描键1234
MOV A,#3DH ;(ACC)=0011 1101
MOV P3,A ;P3 =ACC =0011 1101
MOV A,P3 ;读入 (P3.5 P3.4 P3.3 P3.2 和P3.0)的状态
ANL A,#3CH ; 取中间四位 这里不太明白,感觉 #3CH应该为#3DH
CJNE A,#3CH,KEY5678 ; 若有输入,则转key5678,
KEY1234:
MOV B,#0FFH ;
RL A ; ACC左还移2位(数值*4)
RL A ;
CHKEY1234: ;
RLC A ; ACC带进位位左环移1位
INC B ; B=00H; C+1
JC CHKEY1234 ; 若C=1(原A的高位移0给C)则扫描A的下一位
LCALL DISPLAY ; 扫描完成后, 调用显示子程序
RET ; 返回主程序,感觉这里没太大意义
KEY5678: ; 参考key1234过程
MOV B,#0FFH
RL A;
RL A
CHKEY5678:
RLC A
INC B
JC CHKEY5678
INC B
INC B
INC B
INC B
LCALL DISPLAY
RET
; 显示子程序
DISPLAY:
MOV DPTR,#TAB ;段码表首地址给DPTR
MOV A,B ;A=B
MOVC A,@A+DPTR ;查表得到数值的段码
LOOP:
MOV P1,A ;循环送P1口A的值
SJMP LOOP
RET ;子程序返回
;数码管段码表
TAB:
DB OD9H,OBDH,0B7H,19H,0FFH,039H,0EFH,0EDH
END
读了下这段汇编程序,觉得有个地方写法似乎不太妥当,大家讨论一下:
LOOP:
MOV P1,A
SJMP LOOP
RET
显示子程序中这个地方为无条件跳转,也就是说,按键后显示值无法刷新,除非有系统中断或复位。我觉得编程本意还是送显后接着执行其他指令,否则这段下面的返回指令RET也就意义不明显了。
注释了一下程序,不知对不对
ORG 0000H;
MOV P1,#7FH ; 初始化P1口输出逻辑为0111 1111
MAIN:
MOV P3,#3CH ; P3 0011 1100
MOV A,P3 ;读入P3.5 P3.4 P3.3 P3.2的电平逻辑
ANL A,#3CH; ;取上述四位
CJNE A,#3EH,START ; 如果A不等于0011 1110 (P3.1有正电平跳变)跳转至START
SJMP MIAN ; 构造主程序超级循环,到这里主程序结束,一直重复上述过程
START:;如果P3.1 有0--》1的电平跳变,则开始键扫?
MOV A,P3 ;读入P3口信息,给ACC
ANL A,#3CH ;取中间四位(P3.5 P3.4 P3.3 P3.2)
CJNE A,#3CH,KEY1234 ; 如果有输入,转去扫描键1234
MOV A,#3DH ;(ACC)=0011 1101
MOV P3,A ;P3 =ACC =0011 1101
MOV A,P3 ;读入 (P3.5 P3.4 P3.3 P3.2 和P3.0)的状态
ANL A,#3CH ; 取中间四位 这里不太明白,感觉 #3CH应该为#3DH
CJNE A,#3CH,KEY5678 ; 若有输入,则转key5678,
KEY1234:
MOV B,#0FFH ;
RL A ; ACC左还移2位(数值*4)
RL A ;
CHKEY1234: ;
RLC A ; ACC带进位位左环移1位
INC B ; B=00H; C+1
JC CHKEY1234 ; 若C=1(原A的高位移0给C)则扫描A的下一位
LCALL DISPLAY ; 扫描完成后, 调用显示子程序
RET ; 返回主程序,感觉这里没太大意义
KEY5678: ; 参考key1234过程
MOV B,#0FFH
RL A;
RL A
CHKEY5678:
RLC A
INC B
JC CHKEY5678
INC B
INC B
INC B
INC B
LCALL DISPLAY
RET
; 显示子程序
DISPLAY:
MOV DPTR,#TAB ;段码表首地址给DPTR
MOV A,B ;A=B
MOVC A,@A+DPTR ;查表得到数值的段码
LOOP:
MOV P1,A ;循环送P1口A的值
SJMP LOOP
RET ;子程序返回
;数码管段码表
TAB:
DB OD9H,OBDH,0B7H,19H,0FFH,039H,0EFH,0EDH
END
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询