📄 sci.s
字号:
.module SCI.C
.area text
.dbfile SCI.C
.dbfunc e SCIInit _SCIInit fV
_SCIInit::
.dbline -1
.dbline 20
; /*-----------------------------------------------------*
; *文件描述:本文件包含了串行通信的4子程序,分别为: *
; *(1)SCIInit:SCI初始化
; *(2)SCISend1:串行发送1字节 *
; *(3)SCISendN:串行发送n字节 *
; *(4)SCIRe1:串行接收1字节 *
; *(5)SCIReN:串行接收n字节 *
; *-------------《嵌入式应用技术基础教程》--------------*/
; //[以下为子程序源代码]
; //[包含头文件]
; #include "Includes.h"
; /*SCIInit:串行口初始化子程序---------------------------*
; *功 能:对串行口进行初始化,默认为允许SCI,正常码输出,8位 *
; * 数据,无校验等,允许发送器允许接收器.查询方式收发,*
; * 波特率为9600(设fBUS=2.4576MHz) *
; *参 数:无 *
; *返 回:无 *
; *-----------------------------------------------------*/
; void SCIInit(void)
; {
.dbline 22
; //总线频率fBUS=2.4576MHz,定义波特率Bt=9600
; SCBR=0b00000010;
lda #2
sta 0x19
.dbline 24
; //设置允许SCI,正常码输出、8位数据、无校验
; SCC1=0b01000000;
lda #64
sta 0x13
.dbline 26
; //设置允许发送、允许接收,查询方式收发
; SCC2=0b00001100;
lda #12
sta 0x14
.dbline -2
L1:
.dbline 0 ; func end
rts
.dbend
.dbfunc e SCISend1 _SCISend1 fV
; i -> 0,X
; j -> 1,X
; o -> 4,X
_SCISend1::
.dbline -1
ais #-2
tsx
.dbline 34
; }
; /*SCISend1:串行发送1个字节-----------------------------*
; *功 能:串行发送1个字节 *
; *参 数:要发送的数据 *
; *返 回:无 *
; *-----------------------------------------------------*/
; void SCISend1(INT8U o)
; {//判断ReStatusR的第SendTestBit位是否为1,是1可以发送
bra L4
L3:
.dbline 37
; INT8U i,j;
; while(1)
; if ((ReSendStatusR & (1<<SendTestBit)) != 0)
brclr #7,0x16,L6
.dbline 38
; { ReSendDataR=o;
.dbline 38
lda 4,X
sta 0x18
.dbline 39
; for(i=0;i<100;i++)
clr ,X
bra L11
L8:
.dbline 40
clr 1,X
bra L15
L12:
.dbline 40
L13:
.dbline 40
inc 1,X
L15:
.dbline 40
lda 1,X
cmp #50
blo L12
L9:
.dbline 39
inc ,X
L11:
.dbline 39
lda ,X
cmp #100
blo L8
.dbline 41
; for(j=0;j<50;j++);
; break;}
bra L5
L6:
L4:
.dbline 36
bra L3
L5:
.dbline -2
L2:
ais #2
.dbline 0 ; func end
rts
.dbsym l i 0 c
.dbsym l j 1 c
.dbsym l o 4 c
.dbend
.dbfunc e SCISendN _SCISendN fV
; i -> 0,X
; ch -> 5,X
; n -> 4,X
_SCISendN::
.dbline -1
ais #-2
tsx
.dbline 49
; }
; /*SCISendN:串行发送N个字节-----------------------------*
; *功 能:发送数组中的N个字节数据 *
; *参 数:待发送的数据字节数及其要存放的数组首地址 *
; *返 回:无 *
; *-----------------------------------------------------*/
; void SCISendN(INT8U n,INT8U ch[])
; {INT16U i;
.dbline 50
; for(i=0;i<n;i++)
clr 1,X
clr ,X
bra L20
L17:
.dbline 51
lda 1,X
add 6,X
sta *__r1
lda ,X
adc 5,X
sta *__r0
ldhx *__r0
lda ,x
psha
jsr _SCISend1
ais #1
tsx
L18:
.dbline 50
lda 1,X
add #1
sta 1,X
lda ,X
adc #0
sta ,X
L20:
.dbline 50
clr *__r0
lda 4,X
sta *__r1
lda 1,X
sta *__r3
lda ,X
sta *__r2
ldhx *__r2
cphx *__r0
tsx
blo L17
.dbline -2
L16:
ais #2
.dbline 0 ; func end
rts
.dbsym l i 0 s
.dbsym l ch 5 pc
.dbsym l n 4 c
.dbend
.dbfunc e SCIRe1 _SCIRe1 fc
; i -> 0,X
; k -> 1,X
; p -> 5,X
_SCIRe1::
.dbline -1
ais #-3
tsx
.dbline 60
; SCISend1(ch[i]);
; }
; /*SCIRe1:串行收一个字节数据----------------------------*
; *功 能:从串行口接收1个字节的数据 *
; *参 数:标志指针p *
; *返 回:接收到的数据(若接收失败,返回0xff) *
; *说 明:参数*p带回接收标志=0收到数据,=1未收到数据 *
; *-----------------------------------------------------*/
; INT8U SCIRe1(INT8U *p)
; { INT16U k;
.dbline 63
; INT8U i;
; //ReStatusR第ReTestBit位为1表示可接收数据
; for(k=0;k<0xfbbb;k++)
clr 2,X
clr 1,X
bra L25
L22:
.dbline 64
; if ((ReSendStatusR & (1<<ReTestBit)) != 0)
brclr #5,0x16,L26
.dbline 65
; {i=ReSendDataR;
.dbline 65
lda 0x18
sta ,X
.dbline 66
; *p=0x00;
lda 6,X
sta *__r1
lda 5,X
sta *__r0
clra
ldhx *__r0
sta ,x
tsx
.dbline 67
; break;}
bra L24
L26:
L23:
.dbline 63
lda 2,X
add #1
sta 2,X
lda 1,X
adc #0
sta 1,X
L25:
.dbline 63
lda 2,X
sta *__r1
lda 1,X
sta *__r0
ldhx *__r0
cphx #-1093
tsx
blo L22
L24:
.dbline 68
; if(k>=0xfbbb)
lda 2,X
sta *__r1
lda 1,X
sta *__r0
ldhx *__r0
cphx #-1093
tsx
blo L28
.dbline 69
; {i=0xff;
.dbline 69
lda #-1
sta ,X
.dbline 70
; *p=0x01;}
lda 6,X
sta *__r1
lda 5,X
sta *__r0
lda #1
ldhx *__r0
sta ,x
tsx
.dbline 70
L28:
.dbline 71
; return i; //返回接收到的数据
lda ,X
.dbline -2
L21:
ais #3
.dbline 0 ; func end
rts
.dbsym l i 0 c
.dbsym l k 1 s
.dbsym l p 5 pc
.dbend
.dbfunc e SCIReN _SCIReN fc
; fp -> 0,X
; m -> 1,X
; ch -> 6,X
; n -> 5,X
_SCIReN::
.dbline -1
ais #-3
tsx
.dbline 79
; }
; /*SCIReN:HC08串行接收N个字节---------------------------*
; *功 能:接收N个字节数据,并存放在ch数组中 *
; *参 数:待接收的数据字节数及其存放的数组首地址 *
; *返 回:接收标志=0收到数据,=1未收到数据 *
; *-----------------------------------------------------*/
; INT8U SCIReN(INT8U n,INT8U ch[])
; { INT16U m;
.dbline 81
; INT8U fp;
; m=0;
clr 2,X
clr 1,X
bra L32
L31:
.dbline 83
; while (m<n)
; {
.dbline 84
; ch[m]=SCIRe1(&fp);
pshx
pshh
jsr _SCIRe1
ais #2
tsx
sta *__r1
lda 2,X
add 7,X
sta *__r3
lda 1,X
adc 6,X
sta *__r2
lda *__r1
ldhx *__r2
sta ,x
tsx
.dbline 85
; if (fp==1) return 1;
lda ,X
cmp #1
bne L34
.dbline 85
lda #1
bra L30
L34:
.dbline 86
lda 2,X
add #1
sta 2,X
lda 1,X
adc #0
sta 1,X
.dbline 87
L32:
.dbline 82
clr *__r0
lda 5,X
sta *__r1
lda 2,X
sta *__r3
lda 1,X
sta *__r2
ldhx *__r2
cphx *__r0
tsx
blo L31
.dbline 88
; m++;
; }
; return 0;
clra
.dbline -2
L30:
ais #3
.dbline 0 ; func end
rts
.dbsym l fp 0 c
.dbsym l m 1 s
.dbsym l ch 6 pc
.dbsym l n 5 c
.dbend
.dbfunc e RS485Init _RS485Init fV
_RS485Init::
.dbline -1
.dbline 98
; }
; /*RS485Init:RS485初始化子程序--------------------------*
; *功 能:对RS485进行初始化,默认为允许SCI,正常码输出,8位 *
; * 数据,无校验等,允许发送器允许接收器.查询方式收发,*
; * 波特率为2400(设fBUS=2.4576MHz) *
; *参 数:无 *
; *返 回:无 *
; *-----------------------------------------------------*/
; void RS485Init(void)
; {
.dbline 100
; //总线频率fBUS=2.4576MHz,定义波特率Bt=2400
; SCBR=0b00100010;
lda #34
sta 0x19
.dbline 102
; //设置允许SCI,正常码输出、8位数据、无校验
; SCC1=0b01000000;
lda #64
sta 0x13
.dbline 104
; //设置允许发送、允许接收,查询方式收发
; SCC2=0b00001100;
lda #12
sta 0x14
.dbline -2
L36:
.dbline 0 ; func end
rts
.dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -