📄 51pro.s
字号:
_Write::
rcall push_gset1
.dbline -1
.dbline 135
; }
;
; void Write()//写器件
; {
.dbline 137
; BYTE n;
; pw.fpInitPro();//编程前的准备工作
lds R30,_pw
lds R31,_pw+1
rcall xicall
.dbline 138
; SendData();//回应上位机表示进入写器件状态,可以发来数据
rcall _SendData
rjmp L67
L66:
.dbline 140
; while(1)
; {
.dbline 141
; if(WaitData())//如果等待数据成功
rcall _WaitData
tst R16
brne X1
rjmp L69
X1:
.dbline 142
; {
.dbline 143
; if(ComBuf[0]==0x07)//判断是否继续写
lds R24,_ComBuf
cpi R24,7
breq X2
rjmp L71
X2:
.dbline 144
; {
.dbline 145
; for(n=2;n<=17;n++)//ComBuf[2~17]为待写入数据块
ldi R20,2
rjmp L76
L73:
.dbline 146
; {
.dbline 147
; if(!pw.fpWrite(ComBuf[n]))//<<<<<<<<<<<<<<<<<<<调用写该器件一个单元的函数
ldi R24,<_ComBuf
ldi R25,>_ComBuf
mov R30,R20
clr R31
add R30,R24
adc R31,R25
ldd R16,z+0
lds R30,_pw+6
lds R31,_pw+6+1
rcall xicall
tst R16
brne L77
.dbline 148
; {
.dbline 149
; pw.fpProOver();//出错了就结束编程
lds R30,_pw+12
lds R31,_pw+12+1
rcall xicall
.dbline 150
; ComBuf[0]=0xff;
ldi R24,255
sts _ComBuf,R24
.dbline 151
; SendResp();//回应上位机一个字节,表示写数据出错了
rcall _SendResp
.dbline 152
; WaitData();//等待上位机的回应后就结束
rcall _WaitData
.dbline 153
; return;
rjmp L65
L77:
.dbline 155
lds R24,_nAddress
lds R25,_nAddress+1
adiw R24,1
sts _nAddress+1,R25
sts _nAddress,R24
.dbline 156
L74:
.dbline 145
inc R20
L76:
.dbline 145
ldi R24,17
cp R24,R20
brsh L73
.dbline 157
; }
; nAddress++;//下一个单元
; }
; ComBuf[0]=1;//回应上位机一个字节,表示数据块顺利完成,请求继续
ldi R24,1
sts _ComBuf,R24
.dbline 158
; SendResp();
rcall _SendResp
.dbline 159
; }
rjmp L70
L71:
.dbline 160
; else if(ComBuf[0]==0x00)//写器件结束
lds R2,_ComBuf
tst R2
brne L81
.dbline 161
; break;
rjmp L68
L81:
.dbline 163
; else//可能是通讯出错了
; {
.dbline 164
; pw.fpProOver();
lds R30,_pw+12
lds R31,_pw+12+1
rcall xicall
.dbline 165
; return;
rjmp L65
X0:
.dbline 167
; }
; }
L69:
.dbline 169
; else//等待数据失败
; {
.dbline 170
; pw.fpProOver();
lds R30,_pw+12
lds R31,_pw+12+1
rcall xicall
.dbline 171
; return;
rjmp L65
L70:
.dbline 173
L67:
.dbline 139
rjmp L66
L68:
.dbline 174
; }
; }
; pw.fpProOver();//编程结束后的工作
lds R30,_pw+12
lds R31,_pw+12+1
rcall xicall
.dbline 175
; Delay_ms(50);//延时等待上位机写线程结束
ldi R16,50
ldi R17,0
rcall _Delay_ms
.dbline 176
; ComBuf[0]=0;//通知上位机编程器进入就绪状态
clr R2
sts _ComBuf,R2
.dbline 177
; SendData();
rcall _SendData
.dbline -2
L65:
rcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r n 20 c
.dbend
.dbfunc e Read _Read fV
; n -> R20
.even
_Read::
rcall push_gset1
.dbline -1
.dbline 181
; }
;
; void Read()//读器件
; {
.dbline 183
; BYTE n;
; pw.fpInitPro();//先设置成编程状态
lds R30,_pw
lds R31,_pw+1
rcall xicall
.dbline 184
; SendData();//回应上位机表示进入读状态
rcall _SendData
rjmp L88
L87:
.dbline 186
; while(1)
; {
.dbline 187
; if(WaitResp())//等待上位机回应1个字节
rcall _WaitResp
tst R16
brne X3
rjmp L89
X3:
.dbline 188
; {
.dbline 189
; if(ComBuf[0]==0)//ComBuf[0]==0表示读结束
lds R2,_ComBuf
tst R2
brne L92
.dbline 190
; {
.dbline 191
; break;
rjmp L89
L92:
.dbline 193
; }
; else if(ComBuf[0]==0xff)//0xff表示重发
lds R24,_ComBuf
cpi R24,255
brne L94
.dbline 194
; {
.dbline 195
; nAddress=nAddress-0x0010;
lds R24,_nAddress
lds R25,_nAddress+1
sbiw R24,16
sts _nAddress+1,R25
sts _nAddress,R24
.dbline 196
; }
L94:
.dbline 197
; for(n=2;n<=17;n++)//ComBuf[2~17]保存读出的数据块
ldi R20,2
rjmp L99
L96:
.dbline 198
.dbline 199
lds R30,_pw+8
lds R31,_pw+8+1
rcall xicall
ldi R24,<_ComBuf
ldi R25,>_ComBuf
mov R30,R20
clr R31
add R30,R24
adc R31,R25
std z+0,R16
.dbline 200
lds R24,_nAddress
lds R25,_nAddress+1
adiw R24,1
sts _nAddress+1,R25
sts _nAddress,R24
.dbline 201
L97:
.dbline 197
inc R20
L99:
.dbline 197
ldi R24,17
cp R24,R20
brsh L96
.dbline 202
; {
; ComBuf[n]=pw.fpRead();//<<<<<<<<<<<<<<<<<<<调用写该器件一个单元的函数
; nAddress++;//下一个单元
; }
; ComBuf[0]=6;//向上位机发送读出的数据块
ldi R24,6
sts _ComBuf,R24
.dbline 203
; SendData();
rcall _SendData
.dbline 204
; }
.dbline 206
; else
; break;//等待回应失败
L91:
.dbline 208
L88:
.dbline 185
rjmp L87
L89:
.dbline 209
;
; }
; pw.fpProOver();//操作结束设置为运行状态
lds R30,_pw+12
lds R31,_pw+12+1
rcall xicall
.dbline 210
; ComBuf[0]=0;//通知上位机编程器进入就绪状态
clr R2
sts _ComBuf,R2
.dbline 211
; SendData();
rcall _SendData
.dbline -2
L86:
rcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r n 20 c
.dbend
.dbfunc e Lock _Lock fV
.even
_Lock::
.dbline -1
.dbline 215
; }
;
; void Lock()//写锁定位
; {
.dbline 216
; pw.fpLock();
lds R30,_pw+10
lds R31,_pw+10+1
rcall xicall
.dbline 217
; SendData();
rcall _SendData
.dbline -2
L102:
.dbline 0 ; func end
ret
.dbend
.dbfunc e main _main fV
.even
_main::
.dbline -1
.dbline 228
; }
;
; ///////////////////////////////////////////////////////////////////////////////////////////////////
; //所支持的FID,请在这里继续添加
; ///////////////////////////////////////////////////////////////////////////////////////////////////
; extern void PreparePro00();//FID=00:AT89C51编程器
; extern void PreparePro01();//FID=01:AT89C2051编程器
; extern void PreparePro02();//FID=02:AT89S51编程器
;
; void main()
; {
.dbline 229
; DDRC=0xff;
ldi R24,255
out 0x14,R24
.dbline 230
; PORTC|=BIT(PB0);
sbi 0x15,0
.dbline 231
; PORTC&=~BIT(PB1);
cbi 0x15,1
.dbline 232
; uart_init();
rcall _uart_init
.dbline 233
; Delay_ms(500);//延时1秒后编程器自举
ldi R16,500
ldi R17,1
rcall _Delay_ms
.dbline 234
; ComBuf[0]=0;
clr R2
sts _ComBuf,R2
.dbline 235
; SendData();
rcall _SendData
rjmp L106
L105:
.dbline 237
; while(1)//串口通讯采用查询方式
; {
.dbline 238
; if(!WaitComm())//如果超时,通讯出错
rcall _WaitComm
tst R16
brne L108
.dbline 239
; {
.dbline 240
; Delay_ms(200);
ldi R16,200
ldi R17,0
rcall _Delay_ms
.dbline 241
; ComBuf[0]=0;//让编程器复位,使编程器就绪
clr R2
sts _ComBuf,R2
.dbline 242
; }
L108:
.dbline 243
; switch(ComBuf[1])//根据FID设置(ProWork)pw中的函数指针
lds R22,_ComBuf+1
clr R23
cpi R22,0
cpc R22,R23
breq L111
X4:
cpi R22,1
ldi R30,0
cpc R23,R30
breq L111
cpi R22,2
ldi R30,0
cpc R23,R30
breq L116
rjmp L110
X5:
.dbline 244
; {
.dbline 247
; case 0://at89c51编程器
; //PreparePro00();
; break;
.dbline 250
; case 1://at89c2051编程器
; //PreparePro01();
; break;
L116:
.dbline 252
; case 2://at89s51编程器
; PreparePro02();
rcall _PreparePro02
.dbline 253
; break;
rjmp L111
L110:
.dbline 259
; //case 3:支持新器件时,请继续向下添加
; // break;
; //case 4:
; // break;
; default:
; ComBuf[0]=0xff;
ldi R24,255
sts _ComBuf,R24
.dbline 260
; ComBuf[1]=0xff;//表示无效的操作
sts _ComBuf+1,R24
.dbline 261
; break;
L111:
.dbline 263
; }
; switch(ComBuf[0])//根据操作ID跳到不同的操作函数
lds R20,_ComBuf
clr R21
cpi R20,0
cpc R20,R21
breq L121
X6:
cpi R20,1
ldi R30,0
cpc R21,R30
breq L122
cpi R20,2
ldi R30,0
cpc R21,R30
breq L123
cpi R20,3
ldi R30,0
cpc R21,R30
breq L124
cpi R20,4
ldi R30,0
cpc R21,R30
breq L125
cpi R20,5
ldi R30,0
cpc R21,R30
breq L126
rjmp L118
X7:
.dbline 264
; {
L121:
.dbline 266
; case 0x00:
; RstPro();//编程器复位
rcall _RstPro
.dbline 267
; break;
rjmp L119
L122:
.dbline 269
; case 0x01:
; ReadSign();//读特征字
rcall _ReadSign
.dbline 270
; break;
rjmp L119
L123:
.dbline 272
; case 0x02:
; Erase();//擦除器件
rcall _Erase
.dbline 273
; break;
rjmp L119
L124:
.dbline 275
; case 0x03:
; Write();//写器件
rcall _Write
.dbline 276
; break;
rjmp L119
L125:
.dbline 278
; case 0x04:
; Read();//读器件
rcall _Read
.dbline 279
; break;
rjmp L119
L126:
.dbline 281
; case 0x05:
; Lock();//写锁定位
rcall _Lock
.dbline 282
; break;
rjmp L119
L118:
.dbline 284
; default:
; SendData();
rcall _SendData
.dbline 285
; break;
L119:
.dbline 287
L106:
.dbline 236
rjmp L105
X8:
.dbline -2
L104:
.dbline 0 ; func end
ret
.dbend
.area bss(ram, con, rel)
.dbfile E:\学习专区\AVR专区\个人创作区\ICC\51pro.c
_pw::
.blkb 14
.dbstruct 0 14 _prowork
.dbfield 0 fpInitPro pfV
.dbfield 2 fpReadSign pfV
.dbfield 4 fpErase pfV
.dbfield 6 fpWrite pfc
.dbfield 8 fpRead pfc
.dbfield 10 fpLock pfV
.dbfield 12 fpProOver pfV
.dbend
.dbsym e pw _pw S[_prowork]
_nTimeOut::
.blkb 2
.dbsym e nTimeOut _nTimeOut i
_nAddress::
.blkb 2
.dbsym e nAddress _nAddress i
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -