AVR汇编百例晋级篇参考程序Word文件下载.docx
《AVR汇编百例晋级篇参考程序Word文件下载.docx》由会员分享,可在线阅读,更多相关《AVR汇编百例晋级篇参考程序Word文件下载.docx(45页珍藏版)》请在冰豆网上搜索。
STRT38:
RJMPRST38;
主机从1#,2#,3#,4#分机接收数据块在$1C0-1CF,$1D0-1DF,$1E0-1EF)和$1F0-1FF
.ORG$00B;
RJMPSTRT38
.ORG$00C
RJMPSTRT38;
主机不设串口中断,只以查询接收
.ORG$011
RST38:
LDIR16,12
OUTUBRR,R16;
设波特率:
[BAUDRATE=FCP/16(UBRR+1)]
CLRR15;
初始化分机号
LDIR27,HIGH(DTPINT)
LDIR26,LOW(DTPINT);
发送数据指针(首指$180)
LDIR29,HIGH(DRPINT)
LDIR28,LOW(DRPINT);
接收数据指针(首指$1C0)
NEXTNO:
LDIR16,$18
OUTUCR,R16;
允许UART接收和发送,8位数据模式
INCR15;
指向1#分机
OUTLP:
OUTUDR,R15;
呼分机号,1:
1#/2:
2#/03:
3#/04:
4#...
TSLOP:
INR16,USR
SBRSR16,7
RJMPTSLOP;
分机返回机号?
INR16,UDR
CPR16,R15;
分机号正确返回?
BRNEOUTLP
LDIR16,$1C;
改为9位数据模式TXB8=0
TXLOP:
LDR16,X+
OUTUDR,R16;
向分机发送数据块
TESTL:
INR17,USR
SBRSR17,5
RJMPTESTL;
等待发送完成
CPIR16,$0A
BRNETXLOP;
RXTST:
SBRSR17,7;
RXC=1收到数据
RJMPRXTST;
等待接收分机返回数据块
INR16,UDR
STY+,R16;
存储接收数据
CPIR16,$0A;
分机数据块发完?
BRNERXTST
MOVR16,R15
CPIR16,4;
与分机轮询通讯完毕?
BRNENEXTNO;
未完转对下一分机通信
HH38:
RJMPHH38;
否则踏步(可改为处理分机返回的数据,之后再进行下一个轮询)
.DSEG
.ORG$180
DTPINT:
.BYTE$40
$41$45$65$73$46$42$40$6F$33$44$66$5C$4D$4B$0D$0A
$42$4F$66$78$47$45$44$63$32$48$60$7C$6D$45$0D$0A
$43$56$55$53$4D$4F$40$2E$31$42$67$4C$47$4A$0D$0A
$45$54$59$63$3D$4B$48$2F$35$48$69$3C$77$43$0D$0A
.ORG$1C0
DRPINT:
范例92
多机通讯1#分机程序/晶振4MHZ
.EQUDTPIT1=$180;
(UBRR)=12波特率为19200(REL.ERR.=0.16%)
.EQUDRPNT1=$1C0
STRT39:
RJMPRST39
.ORG$00B
RJMPUARXC;
8535UART接收完成中断
RJMPUATXC;
UART发送完成中断
RST39:
CLRR18;
清除分机被选中(R18,6)和主机数据块接收完毕标志(R18,7)
设波特率[BAUDRATE=4000000/16*(12+1)=19200]
LDIR16,HIGH(DRPNT1)
MOVR8,R16
LDIR16,LOW(DRPNT1)
MOVR9,R16;
r8,r9:
接收数据指针(FIRSTPOINTTO$1C0)
LDIR16,$98;
允许UART中断接收,8位数据模式
OUTUCR,R16
SEI
RXDTS:
SBRSR18,6;
主机呼号已收到(若收到,在R17中)?
RJMPRXDTS
OUTUDR,R17;
返还该机号
TXDON:
SBRSR16,5
RJMPTXDON;
该机号发送完成?
LDIR16,$9C;
允许UART中断接收,9位数据模式,TXB8=0
OUTUCR,R16
RCVBLK:
SBRSR18,7
RJMPRCVBLK;
主机发来数据块已接收完毕?
LDIR16,HIGH(DTPIT1)
MOVR6,R16
LDIR16,LOW(DTPIT1)
MOVR7,R16;
设发送数据指针r6r7,首指$180
LDIR16,$3C;
允许UART中断发送,9位数据模式,TXB8=0
TXDN:
SBICUCR,5
RJMPTXDN;
发送完毕?
RJMPRST39;
:
UART中断接收程序
UARXC:
SBICUSR,4
RETI;
祯错误(主机正与其它分机进行9位数据模式通信),不予接收
INR14,SREG;
保存当前状态
TSTR18
BREQNUMB;
(R18)=0时收到数据,只可能是机号,转去核实
PUSHR16;
否则为主机向本分机发来数据块(9位模式,机号已符合)
PUSHR26
PUSHR27
INR17,UDR;
接收数据
MOVXH,R8
MOVXL,R9;
取接收数据指针
STX+,R17;
转入RAM
MOVR8,XH
MOVR9,XL;
存数据指针
CPIR17,$0A;
是数据块结束符LF?
BRNERSCOM1
SBRR18,$80;
收到完整数据块标志
RSCOM1:
POPR27
POPR26
POPR16
DRETI:
OUTSREG,R14
RETI
NUMB:
取出数据
CPIR17,1;
是1#分机?
2#分机与$02比较/3#分机与$03比较...
BRNEDRETI;
机号不符合,转!
SBRR18,$40;
建机号符合标志
RJMPDRETI
UART中断发送程序
UATXC:
r6r7:
发送数据指针,首指$180
INR16,SREG
PUSHR16
MOVXH,R6
MOVXL,R7;
取出发送指针
LDR16,X+;
取数据,调指针
MOVR6,XH
MOVR7,XL
送入发送寄存器
BRNESDCOM
CBIUCR,5;
发送最后1个字符后,禁止发送寄存器空中断(CLRUDRIE)
LDIR16,HIGH(DRPINT)
LDIR16,LOW(DRPINT)
接收数据指针初始化(POINTTO$1C0)
SDCOM:
OUTSREG,R16
DTPIT1:
DRPNT1:
.BYTE$10
范例93
以中断方式写入EEPROM(仅对8535,8515无此功能),克服查询方式占用过多机时的缺点,
并可在线写入
运作过程特点如下:
(1)主程序初始化时设置EEPROM就绪(ready)中断使能位和中断总使能位
(2)在主程序中写入第一个字节,写入完成后引起就绪中断,其他写入在中断服务中完成
(3)本程序为一写入特例,写入地址为$100--$1FF,可作适当修改(如设块长计数器等)
(4)为防止高优先级中断破坏写入过程,中断服务中不允许中断嵌套
(5)本例为简化程序只以查询写入地址循环作为背景程序,实用时可改为具体的背景序
(6)如能确信当前系统没有EEPROM正在写入,可删除对其进行查询部分.
STWEEP:
LDIR16,HIGH(ramend)
OUTSPH,R16
LDIR16,LOW(ramend)
OUTSPL,R16
SBIEECR,3;
设置EEPROM就绪(ready)中断使能位
SEI;
中断总使能
RJMPSRTW
.ORG$00F
RJMPEEPRDY;
8535EEPROM就绪(ready)中断向量
SRTW:
LDIYH,1
LDIYL0;
EEPROM写入首地址:
$100
LDIXL,$60;
欲写入数据块首地址:
$60
CLRXH
WEEP0:
SBICEECR,1;
当前有EEPROM写入操作,有则等待写入完成
RJMPWEEP0
RCALLWREEP;
写入第一个字节,($60)->
$100,写入完成后,EEWE=0时引发EEPROM就绪中断
INCYL;
调整写入地址指针
HHWEEP:
TSTYL
BRNEHHWEEP
CPIYH,2;
写入地址达到$2