📄 eeprom
字号:
int1:
ldp #100h
bit flag,14
bcnd ext_int1,TC ;FLAG[1]=1,转外部INT1
ldp #0e0h
lacl SYSIVR
sub #0006h
bcnd receive_error1,NEQ
*注意:进入MAIN_TREAT后,头两个字节为50H和a0H,随后是数据包的长度(如03指令,
*长度为7;15指令,长度为2),然后是指令码(一个字节),然后是起始地址(两个字节)....
*MAIN_TREAT是按上面的规定写的. 有可能要调整.
clrc SXM ; 进入int1,先抑制符号位扩展
setc INTM ;forbid all interrupt
ldp #0e0h
splk #0000h,SCICTL2 ;forbid SCI receive interrupt
; ldp #0h
; lacl IFR
; sacl IFR ; 最好能加上这三句,清除标志位,否则一开总中断马上又进入int1
ldp #0e0h
first_char:
bit SCIRXST,9
bcnd first_char,NTC
clrc XF
lacl SCIRXBUF ;reading SCIRXBUF can clear flag bit!!
sub #0a0h
bcnd shake_hand,EQ
lacl SCIRXBUF
sub #50h
bcnd receive_error1,NEQ ;the first data should be 50H
second_char:
bit SCIRXST,9
bcnd second_char,NTC
setc XF
lacl SCIRXBUF
sub #0a0h
bcnd receive_error1,NEQ
third_char:
bit SCIRXST,9
bcnd third_char,NTC
clrc XF
lacl SCIRXBUF
ldp #100h
sacl temp2 ;keep length of data_package in temp2
ldp #0e0h
fourth_char:
bit SCIRXST,9
bcnd fourth_char,NTC
setc XF
lacl SCIRXBUF
ldp #100h
sacl temp3 ;keep command_code in temp3
mar *,ar7
lar ar7,#8005h ;8005H--temp4
down_count: ldp #0e0h
receive_data:
bit SCIRXST,9
bcnd receive_data,NTC
lacl SCIRXBUF
sacl *+ ;将第5,6..字节依次存于TEMP4,TEMP5..单元中
ldp #100h
lacc temp2
sub #01h
sacl temp2
bcnd down_count,NEQ
*************************
*This is Command_treat ;数据包全部收到,转命令处理
*************************
ldp #100h
lacc temp3;根据TEMP3进行跳转
sub #03h
bcnd deal,EQ
lacc temp3
sub #04h
bcnd deal,EQ
lacc temp3
sub #05h
bcnd deal,EQ
lacc temp3
sub #07h
bcnd deal,EQ
lacc temp3
sub #08h
bcnd deal,EQ
lacc temp3
sub #09h
bcnd deal,EQ
lacc temp3
sub #10h
bcnd trans_file,EQ ;传输文件的命令码是10h
lacc temp3
sub #15h
bcnd run_program,EQ
lacc temp3
sub #33h
bcnd condition_reset,EQ
lacc temp3
sub #35h
bcnd no_condition_reset,EQ
bcnd receive_error1
*DEAL部分:03,04,05, 07,08,09这六条指令都要确定起始地址和长度,由DEAL完成
deal: ldp #100h
lacc temp5 ;取起始地址低八位
add temp4,8
sacl temp0 ;起始地址存于TEMP0中
sacl temp1 ;也存于TEMP1中
lacc temp7
add temp6,8 ;得到终止地址
sub temp0
sacl temp0 ;TEMP0中为长度
lacc temp3
sub #03h
bcnd read_PM,EQ
lacc temp3
sub #04h
bcnd read_DM,EQ
lacc temp3
sub #05h
bcnd read_IO,EQ
lacc temp3
sub #07h
bcnd write_PM,EQ
lacc temp3
sub #08
bcnd write_DM,EQ
lacc temp3
sub #09h
bcnd write_IO,EQ
*进入READ_DM时,TEMP0中为长度,TEMP1中为起始地址
read_DM: ldp #0e0h
lacc #50h
sacl SCITXBUF
wait6: bit SCICTL2,8
bcnd wait6,NTC
lacc #03h
sacl SCITXBUF ;发送数据头5003H
wait7: bit SCICTL2,8
bcnd wait7,NTC ;这一句必须有,否则03H送不上去
ldp #100h
mar *,ar7
lar ar7,temp1
*注:要把字分成高八位和低八位传送.
continue1: lacc * ;取字单元内容(16位)
sacl temp2
lacc *+,8
sach temp3 ;16位字单元高八位存于TEMP3
lacc temp3
and #00ffh
ldp #0e0h
sacl SCITXBUF;先送高八位
wait8: bit SCICTL2,8
bcnd wait8,NTC
ldp #100h
lacc temp2
sub temp3,8 ;这样ACC中是真正的低八位
and #00ffh
ldp #0e0h
sacl SCITXBUF ;送出的是低八位
wait9: bit SCICTL2,8
bcnd wait9,NTC ;这一句必须有
ldp #100h
lacc temp0
bcnd return1,EQ ;全部送完,跳转
sub #01h
sacl temp0
b continue1
receive_error1:
nop
return1:
ldp #0h
lacl IFR
; or #0001h ;clear IFR[0]
sacl IFR
ldp #0e8h
lacl EVIFRA
sacl EVIFRA
ldp #0e0h
splk #0002h,SCICTL2 ;出去时允许串口接收中断
setc sxm ; 出去时允许符号位扩展
clrc INTM
ret
shake_hand: ldp #0e0h
wait_for_1:
bit SCICTL2,8
bcnd wait_for_1,NTC
lacc #50h
sacl SCITXBUF ;回送第一个数50H
shake_1:
bit SCIRXST,9
bcnd shake_1,NTC
lacl SCIRXBUF
sub #0aah
bcnd receive_error1,NEQ
wait_for_2:
bit SCICTL2,8
bcnd wait_for_2,NTC
lacc #55h
sacl SCITXBUF ;回送第二个数55H
shake_2:
bit SCIRXST,9
bcnd shake_2,NTC
lacl SCIRXBUF
sub #55h
bcnd receive_error1,NEQ
wait_for_3:
bit SCICTL2,8
bcnd wait_for_3,NTC
lacc #0aah
sacl SCITXBUF ;回送第三个数aaH
b return1
*进入READ_PM时,TEMP0中为长度,TEMP1中为起始地址
read_PM: clrc INTM
ret
*刚进入TRANS_FILE时,TEMP4,TEMP5中分别是起始地址的高,低八位;temp6,temp7中分别
*是传输总字节数的高,低八位.TEMP8中若为55H,表示传输高八位文件;为40H,表示传输
*低八位文件.
trans_file:
ldp #100h
lacc temp5
add temp4,8
sacl temp0 ;TEMP0中是起始地址
lacc temp7
add temp6,8
sacl count ;COUNT中是传输总字节数
lacc temp8
sub #55h
bcnd high_flag_set,EQ
lacc temp8
sub #40h
bcnd low_flag_set,EQ
clrc INTM
ret
high_flag_set:
mar *,ar7
lar ar7,temp0 ;这样AR7中是起始地址
trans_data_high:
ldp #0e0h
wait_high:
bit SCIRXST,9
bcnd wait_high,NTC
lacc SCIRXBUF,8
add * ;加上低八位内容
sacl *+ ;存储,并指向下一单元.
ldp #100h
lacc count
sub #01h
sacl count
bcnd trans_data_high,NEQ
b return1 ;全部传完,转return1
low_flag_set:
mar *,ar7
lar ar7,temp0 ;这样AR7中是起始地址
trans_data_low:
ldp #0e0h
wait_low:
bit SCIRXST,9
bcnd wait_low,NTC
lacc SCIRXBUF
sacl *+ ;存储低八位,并指向下一单元.
ldp #100h
lacc count
sub #01h
sacl count
bcnd trans_data_low,NEQ
b return1 ;全部传完,转return1
write_DM: clrc INTM
ret
write_IO: clrc INTM
ret
write_PM: clrc INTM
ret
*进入RUN_PROGRAM时,TEMP4,TEMP5中分别是起始地址的高,低八位
run_program: ldp #100h
lacc temp5
add temp4,8
sacl temp0 ;TEMP0中为起始地址
lacc flag
OR #02h
sacl flag ;外部程序运行标志FLAG[1]置1
ldp #0h
lacl IFR
; or #0001h ;clear IFR[0]
sacl IFR
ldp #0e8h
lacl EVIFRA
sacl EVIFRA
ldp #0e0h
splk #0002h,SCICTL2 ;出去时允许串口接收中断
setc sxm ; 出去时允许符号位扩展
ldp #100h
lacc temp0
cala ;PC+1-->TOS,ACC(15:0)-->PC
condition_reset:clrc INTM
ret
no_condition_reset:clrc INTM
ret
read_IO: clrc INTM
ret
int2:
b ext_int2
int3:
b ext_int3
int4:
b ext_int4
int5:
b ext_int5
int6:
b ext_int6
.end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -