📄 sci_po~1.lst
字号:
fp --> X+0
m --> X+1
ch --> X+6
n --> X+5
80EE A7 FD aiS #-3
80F0 95 tSX
(0082) return i;
(0083) }
(0084)
(0085) //SCIReN:HC08串行接收N个字节-----------------------------------------------*
(0086) //功 能:接收N个字节数据,并存放在ch数组中 *
(0087) //参 数:待接收的数据字节数及其存放的数组首地址 *
(0088) //返 回:接收标志=0 收到数据,=1 未收到数据 *
(0089) //-------------------------------------------------------------------------*
(0090) INT8U SCIReN(INT8U n,INT8U ch[])
(0091) {
80F1 6F 02 clr 2,X
80F3 6F 01 clr 1,X
80F5 20 31 bra 0x8128
(0092) int m;
(0093) INT8U fp;
(0094) m=0;
(0095) while (m<n)
(0096) {
80F7 89 pshX
80F8 8B pshH
80F9 CD 808F jsr _SCIRe1
80FC A7 02 aiS #2
80FE 95 tSX
80FF B7 41 stA *__r1
8101 E6 02 ldA 2,X
8103 EB 07 add 7,X
8105 B7 43 stA *__r3
8107 E6 01 ldA 1,X
8109 E9 06 adc 6,X
810B B7 42 stA *__r2
810D B6 41 ldA *__r1
810F 55 42 ldHX *__r2
8111 F7 stA 0,X
8112 95 tSX
(0097) ch[m]=SCIRe1(&fp);
(0098) if (fp==1) return 1;
8113 F6 ldA 0,X
8114 A1 01 cmp #1
8116 26 04 bne 0x811C
8118 A6 01 ldA #1
811A 20 22 bra 0x813E
(0099) m++;
811C E6 02 ldA 2,X
811E AB 01 add #1
8120 E7 02 stA 2,X
8122 E6 01 ldA 1,X
8124 A9 00 adc #0
8126 E7 01 stA 1,X
(0100) }
8128 3F 40 clr *__r0
812A E6 05 ldA 5,X
812C B7 41 stA *__r1
812E E6 02 ldA 2,X
8130 B7 43 stA *__r3
8132 E6 01 ldA 1,X
8134 B7 42 stA *__r2
8136 55 42 ldHX *__r2
8138 75 40 cpHX *__r0
813A 95 tSX
813B 91 BA blt 0x80F7
(0101) return 0;
813D 4F clrA
813E A7 03 aiS #3
8140 81 rts
_main:
i --> X+0
8141 A7 FF aiS #-1
8143 95 tSX
FILE: Main.c
(0001) //-------------------------------------------------------------------------*
(0002) //工程文件名:SCI_Pooling.prj *
(0003) //硬件连接: *
(0004) // (1)MCU的串口与PC方的COM1相连 *
(0005) //程序描述:利用查询方式把收到的数据发送回去 *
(0006) //目 的:初步掌握利用查询方式进行串行通信的基本知识 *
(0007) //说 明: *
(0008) //注 意: *
(0009) //日 期:2007.01.03 *
(0010) //-----------------------《嵌入式技术基础与实践》实例----------------------*
(0011)
(0012) #include "Includes.h" //总头文件
(0013) //主函数
(0014) void main()
(0015) {
8144 CD 819B jsr _MCUInit
(0016) INT8U i;
(0017) MCUInit();
(0018) SCIInit(); //调串行口初始化子程序
8147 CD 8035 jsr _SCIInit
814A 95 tSX
814B 20 49 bra 0x8196
(0019) while(1)
(0020) {
814D 45 0044 ldHX #0x0044
8150 89 pshX
8151 8B pshH
8152 A6 01 ldA #1
8154 87 pshA
8155 CD 80EE jsr _SCIReN
8158 A7 03 aiS #3
815A 95 tSX
815B B7 41 stA *__r1
815D F7 stA 0,X
(0021) //接收1个字节的数据,如果是#,则继续接收2个字节数据,并回送出去
(0022) // 如果是@,则回送@
(0023) i=SCIReN(1,SerialBuff);
(0024) if(SerialBuff[0]=='#')
815E B6 44 ldA *_SerialBuff
8160 A1 23 cmp #35
8162 26 23 bne 0x8187
(0025) {
8164 45 0044 ldHX #0x0044
8167 89 pshX
8168 8B pshH
8169 A6 02 ldA #2
816B 87 pshA
816C CD 80EE jsr _SCIReN
816F A7 03 aiS #3
8171 95 tSX
8172 B7 41 stA *__r1
8174 F7 stA 0,X
(0026) i=SCIReN(2,SerialBuff);
(0027) if(i==0)
8175 26 1F bne 0x8196
(0028) SCISendN(2,SerialBuff);
8177 45 0044 ldHX #0x0044
817A 89 pshX
817B 8B pshH
817C A6 02 ldA #2
817E 87 pshA
817F CD 8051 jsr _SCISendN
8182 A7 03 aiS #3
8184 95 tSX
(0029) }
8185 20 0F bra 0x8196
(0030) else if(SerialBuff[0]=='@')
8187 B6 44 ldA *_SerialBuff
8189 A1 40 cmp #64
818B 26 09 bne 0x8196
(0031) SCISend1('@');
818D A6 40 ldA #64
818F 87 pshA
8190 CD 8042 jsr _SCISend1
8193 A7 01 aiS #1
8195 95 tSX
(0032) }
8196 20 B5 bra 0x814D
8198 A7 01 aiS #1
819A 81 rts
FILE: SetUp.c
(0001) //_HC08Setup:芯片初始化----------------------------------------------------*
(0002) //功能:系统初始化设置 *
(0003) // (1)由外部晶振f,通过本程序设置内部总线频率fbus *
(0004) // (2) 确定是否禁止看门狗(COP) *
(0005) //参数:无 *
(0006) //返回:无 *
(0007) //说明:该程序与芯片具体型号有关. *
(0008) // (1)外部晶振f=32.768kHz,使用内部PLL(锁相环),产生内部总线时钟频率 *
(0009) // fbus=2.4576MHz. *
(0010) // (2)禁止COP模块 *
(0011) //-------------------------------------------------------------------------*
(0012)
(0013) #include "GP32C.h" //映像寄存器名定义
(0014)
(0015) void MCUInit(void)
(0016) {
_MCUInit:
819B A6 01 ldA #1
819D B7 1E stA 0x1E
(0017) //1.设置CONFIG2、CONFIG1
(0018) //1.1 设置CONFIG2
(0019) CONFIG2=0b00000001;
(0020) // ||_SCIBDSRC=1内部总线时钟用作SCI时钟
(0021) // |__OSCSTOPENB=0 在stop模式下禁止振荡器工作
(0022)
(0023) //1.2 设置CONFIG1
(0024) CONFIG1=0b00111101;
819F A6 3D ldA #61
81A1 B7 1F stA 0x1F
(0025) //||||||||_COPD=1 禁止COP模块
(0026) //|||||||__STOP=0 禁止STOP指令
(0027) //||||||___SSREC=1 32个CGMXCLK周期退出STOP模式
(0028) //|||||____LVI5OR3=1 LVI工作在5V
(0029) //||||_____LVIPWRD=1 禁止LVI模块电源
(0030) //|||______LVIRSTD=1 允许LVI复位信号
(0031) //||_______LVISTOP=0 在stop模式下禁止LVI
(0032) //|________COPRS=0 COP溢出范围使用长的时间
(0033)
(0034) //2. PLL编程
(0035) PCTL=0x00; //①禁止PLL:清零PLL控制寄存器PCTL
81A3 3F 36 clr 0x36
(0036) PCTL=0x01; //②将P、E写入PTCL,置VCO的参考频率为2
81A5 A6 01 ldA #1
81A7 B7 36 stA 0x36
(0037) PMSH=0x01; //③将N写入PMSH、PMSL,置VCO的倍频因子为$12C
81A9 A6 01 ldA #1
81AB B7 38 stA 0x38
(0038) PMSL=0x2C;
81AD A6 2C ldA #44
81AF B7 39 stA 0x39
(0039) PMRS=0b10000000; //④将L写入PMRS,置VCO的输出频率范围系数为$80
81B1 A6 80 ldA #-128
81B3 B7 3A stA 0x3A
(0040) PRDS=0x01; //⑤将R写入PRDS
81B5 A6 01 ldA #1
81B7 B7 3B stA 0x3B
(0041) PCTL|=(1<<5); //⑥置PCTL.PLLON=1,启动PLL电路
81B9 1A 36 Bset 5,0x36
(0042) PBWC|=(1<<7); //⑦PBWC自动带宽控制位=1,选择自动控制方式
81BB 1E 37 Bset 7,0x37
(0043) PCTL|=(1<<4); //⑧PCTL.BCS=1,选择PLL电路为时钟源
FILE: <library>
81BD 18 36 Bset 4,0x36
81BF 81 rts
__HC08Setup:
81C0 81 rts
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -