📄 cnc2119.txt
字号:
; generated by ARM/Thumb C/C++ Compiler with , RVCT3.0 [Build 942] for uVision
; commandline ArmCC [--debug -c --asm --interleave -ocnc2119.o --device=DARMP --apcs=interwork -O0 -I"G:\Program Files\Keil\ARM\INC\Philips" CNC2119.c]
ARM
AREA ||.text||, CODE, READONLY, ALIGN=2
Nop PROC
;;;139 unsigned char i;
;;;140 for(i=0;i<dly;i++);
000000 e3a01000 MOV r1,#0
000004 ea000001 B |L1.16|
|L1.8|
000008 e2812001 ADD r2,r1,#1
00000c e20210ff AND r1,r2,#0xff
|L1.16|
000010 e1510000 CMP r1,r0
000014 bafffffb BLT |L1.8|
000018 e12fff1e BX lr
;;;141 }
ENDP
CH452I2CStart PROC
;;;148 void CH452I2CStart(void)
;;;149 {
00001c e52de004 PUSH {lr}
000020 e59f0d18 LDR r0,|L1.3392|
000024 e5900008 LDR r0,[r0,#8]
000028 e3800b12 ORR r0,r0,#0x4800
00002c e59f1d0c LDR r1,|L1.3392|
000030 e5810008 STR r0,[r1,#8]
000034 e3a00901 MOV r0,#0x4000
000038 e5810004 STR r0,[r1,#4]
00003c e3a00001 MOV r0,#1
000040 ebfffffe BL Nop
000044 e3a00b02 MOV r0,#0x800
000048 e59f1cf0 LDR r1,|L1.3392|
00004c e5810004 STR r0,[r1,#4]
000050 e3a00005 MOV r0,#5
000054 ebfffffe BL Nop
000058 e3a00901 MOV r0,#0x4000
00005c e59f1cdc LDR r1,|L1.3392|
000060 e581000c STR r0,[r1,#0xc]
000064 e3a00005 MOV r0,#5
000068 ebfffffe BL Nop
00006c e3a00b02 MOV r0,#0x800
000070 e59f1cc8 LDR r1,|L1.3392|
000074 e581000c STR r0,[r1,#0xc]
000078 e3a00005 MOV r0,#5
00007c ebfffffe BL Nop
000080 e49de004 POP {lr}
000084 e12fff1e BX lr
;;;150 IO0DIR|=CH452_SCL|CH452_SDA;
;;;151 IO0SET=CH452_SDA; //发送起始条件的数据信号
;;;152 Nop(1);
;;;153 IO0SET=CH452_SCL;
;;;154 Nop(5);//起始条件建立时间大于4.7us,延时
;;;155 IO0CLR=CH452_SDA; /*发送起始信号*/
;;;156 Nop(5); // 起始条件锁定时间大于4μs
;;;157 IO0CLR=CH452_SCL; //钳住I2C总线,准备发送或接收数据
;;;158 Nop(5);
;;;159 }
ENDP
CH452I2CStop PROC
;;;166 void CH452I2CStop(void)
;;;167 {
000088 e52de004 PUSH {lr}
00008c e3a00901 MOV r0,#0x4000
000090 e59f1ca8 LDR r1,|L1.3392|
000094 e581000c STR r0,[r1,#0xc]
000098 e3a00001 MOV r0,#1
00009c ebfffffe BL Nop
0000a0 e3a00b02 MOV r0,#0x800
0000a4 e59f1c94 LDR r1,|L1.3392|
0000a8 e5810004 STR r0,[r1,#4]
0000ac e3a00005 MOV r0,#5
0000b0 ebfffffe BL Nop
0000b4 e3a00901 MOV r0,#0x4000
0000b8 e59f1c80 LDR r1,|L1.3392|
0000bc e5810004 STR r0,[r1,#4]
0000c0 e3a00005 MOV r0,#5
0000c4 ebfffffe BL Nop
0000c8 e49de004 POP {lr}
0000cc e12fff1e BX lr
;;;168 IO0CLR=CH452_SDA; //发送结束条件的数据信号
;;;169 Nop(1);
;;;170 IO0SET=CH452_SCL; //结束条件建立时间大于4μs
;;;171 Nop(5);
;;;172 IO0SET=CH452_SDA; /*发送I2C总线结束信号*/
;;;173 Nop(5);
;;;174 }
ENDP
CH452I2CWrByte PROC
;;;182 void CH452I2CWrByte(uint8 dat)
;;;183 {
0000d0 e92d4010 PUSH {r4,lr}
0000d4 e1a03000 MOV r3,r0
0000d8 e3a04000 MOV r4,#0
0000dc ea000015 B |L1.312|
|L1.224|
0000e0 e1a00413 LSL r0,r3,r4
0000e4 e3100080 TST r0,#0x80
0000e8 0a000003 BEQ |L1.252|
0000ec e3a00901 MOV r0,#0x4000
0000f0 e59f1c48 LDR r1,|L1.3392|
0000f4 e5810004 STR r0,[r1,#4]
0000f8 ea000002 B |L1.264|
|L1.252|
0000fc e3a00901 MOV r0,#0x4000
000100 e59f1c38 LDR r1,|L1.3392|
000104 e581000c STR r0,[r1,#0xc]
|L1.264|
000108 e3a0000f MOV r0,#0xf
00010c ebfffffe BL Nop
000110 e3a00b02 MOV r0,#0x800
000114 e59f1c24 LDR r1,|L1.3392|
000118 e5810004 STR r0,[r1,#4]
00011c e3a0000f MOV r0,#0xf
000120 ebfffffe BL Nop
000124 e3a00b02 MOV r0,#0x800
000128 e59f1c10 LDR r1,|L1.3392|
00012c e581000c STR r0,[r1,#0xc]
000130 e2840001 ADD r0,r4,#1
000134 e20040ff AND r4,r0,#0xff
|L1.312|
000138 e3540008 CMP r4,#8
00013c 1affffe7 BNE |L1.224|
000140 e3a0000f MOV r0,#0xf
000144 ebfffffe BL Nop
000148 e3a00901 MOV r0,#0x4000
00014c e59f1bec LDR r1,|L1.3392|
000150 e5810004 STR r0,[r1,#4]
000154 e3a0000f MOV r0,#0xf
000158 ebfffffe BL Nop
00015c e3a00b02 MOV r0,#0x800
000160 e59f1bd8 LDR r1,|L1.3392|
000164 e5810004 STR r0,[r1,#4]
000168 e3a0000f MOV r0,#0xf
00016c ebfffffe BL Nop
000170 e3a00b02 MOV r0,#0x800
000174 e59f1bc4 LDR r1,|L1.3392|
000178 e581000c STR r0,[r1,#0xc]
00017c e3a0000f MOV r0,#0xf
000180 ebfffffe BL Nop
000184 e8bd4010 POP {r4,lr}
000188 e12fff1e BX lr
;;;184 uint8 i;
;;;185
;;;186 for(i=0;i!=8;i++) // 输出8位数据
;;;187 {
;;;188 if((dat<<i)&0x80)
;;;189 {
;;;190 IO0SET=CH452_SDA;
;;;191 }
;;;192 else
;;;193 {
;;;194 IO0CLR=CH452_SDA;
;;;195 }
;;;196 Nop(15);
;;;197
;;;198 IO0SET=CH452_SCL;
;;;199
;;;200 Nop(15);
;;;201
;;;202 IO0CLR=CH452_SCL;
;;;203
;;;204 }
;;;205 Nop(15);
;;;206 IO0SET=CH452_SDA;
;;;207 Nop(15);
;;;208 IO0SET=CH452_SCL; // 接收应答
;;;209 Nop(15);
;;;210 IO0CLR=CH452_SCL;
;;;211 Nop(15);
;;;212 }
ENDP
CH452I2CWrite PROC
;;;219 void CH452I2CWrite(uint16 command)
;;;220 {
00018c e92d4010 PUSH {r4,lr}
000190 e1a04000 MOV r4,r0
000194 ebfffffe BL CH452I2CStart
000198 e3a0103e MOV r1,#0x3e
00019c e00113c4 AND r1,r1,r4,ASR #7
0001a0 e3810060 ORR r0,r1,#0x60
0001a4 ebfffffe BL CH452I2CWrByte
0001a8 e20400ff AND r0,r4,#0xff
0001ac ebfffffe BL CH452I2CWrByte
0001b0 ebfffffe BL CH452I2CStop
0001b4 e8bd4010 POP {r4,lr}
0001b8 e12fff1e BX lr
;;;221 CH452I2CStart(); //启动总线
;;;222 #ifdef ENABLE_2_CH452 // 若有两个CH452并连
;;;223 CH452I2CWrByte((uint8)(command>>7)&CH452_I2C_MASK|CH452_I2C_ADDR0); // CH452的ADDR=0时
;;;224 #else
;;;225 CH452I2CWrByte((uint8)(command>>7)&CH452_I2C_MASK|CH452_I2C_ADDR1); // CH452的ADDR=1时(默认)
;;;226 #endif
;;;227 CH452I2CWrByte((uint8)command); //发送数据
;;;228 CH452I2CStop(); //结束总线
;;;229 }
ENDP
CH452I2CRdByte PROC
;;;237 uint8 CH452I2CRdByte(void) //读一个字节数据
;;;238 {
0001bc e92d4010 PUSH {r4,lr}
0001c0 e3a03000 MOV r3,#0
0001c4 e3a00901 MOV r0,#0x4000
0001c8 e59f1b70 LDR r1,|L1.3392|
0001cc e5810004 STR r0,[r1,#4]
0001d0 e3a04000 MOV r4,#0
0001d4 ea00001c B |L1.588|
|L1.472|
0001d8 e3a0000f MOV r0,#0xf
0001dc ebfffffe BL Nop
0001e0 e3a00b02 MOV r0,#0x800
0001e4 e59f1b54 LDR r1,|L1.3392|
0001e8 e581000c STR r0,[r1,#0xc]
0001ec e3a00014 MOV r0,#0x14
0001f0 ebfffffe BL Nop
0001f4 e3a00b02 MOV r0,#0x800
0001f8 e59f1b40 LDR r1,|L1.3392|
0001fc e5810004 STR r0,[r1,#4]
000200 e3a00014 MOV r0,#0x14
000204 ebfffffe BL Nop
000208 e1a00c83 LSL r0,r3,#25
00020c e1a03c20 LSR r3,r0,#24
000210 e59f0b28 LDR r0,|L1.3392|
000214 e5900008 LDR r0,[r0,#8]
000218 e3c00901 BIC r0,r0,#0x4000
00021c e59f1b1c LDR r1,|L1.3392|
000220 e5810008 STR r0,[r1,#8]
000224 e1a00001 MOV r0,r1
000228 e5900000 LDR r0,[r0,#0]
00022c e3100901 TST r0,#0x4000
000230 0a000001 BEQ |L1.572|
000234 e2830001 ADD r0,r3,#1
000238 e20030ff AND r3,r0,#0xff
|L1.572|
00023c e3a00014 MOV r0,#0x14
000240 ebfffffe BL Nop
000244 e2840001 ADD r0,r4,#1
000248 e20040ff AND r4,r0,#0xff
|L1.588|
00024c e3540008 CMP r4,#8
000250 1affffe0 BNE |L1.472|
000254 e59f0ae4 LDR r0,|L1.3392|
000258 e5900008 LDR r0,[r0,#8]
00025c e3800901 ORR r0,r0,#0x4000
000260 e59f1ad8 LDR r1,|L1.3392|
000264 e5810008 STR r0,[r1,#8]
000268 e3a00b02 MOV r0,#0x800
00026c e581000c STR r0,[r1,#0xc]
000270 e3a00014 MOV r0,#0x14
000274 ebfffffe BL Nop
000278 e1a00003 MOV r0,r3
00027c e8bd4010 POP {r4,lr}
000280 e12fff1e BX lr
;;;239 uint8 dat,i;
;;;240 dat=0;
;;;241 IO0SET=CH452_SDA; //置数据线为输入方式
;;;242
;;;243 for(i=0;i!=8;i++) // 输入8位数据
;;;244 {
;;;245
;;;246 Nop(15);
;;;247 IO0CLR=CH452_SCL; //置时钟线为低,准备接收数据位
;;;248 Nop(20);
;;;249 IO0SET=CH452_SCL; //置时钟线为高使数据线上数据有效
;;;250 Nop(20);
;;;251 dat<<=1;
;;;252 IO0DIR&=(~CH452_SDA); /* 设置SDA为输入方向 */
;;;253 if((IO0PIN&(CH452_SDA)))
;;;254 dat++; //读数据位,接收的数据位放入 dat中
;;;255 Nop(20);
;;;256
;;;257 }
;;;258 IO0DIR|=CH452_SDA;
;;;259 IO0CLR=CH452_SCL;
;;;260 Nop(20);
;;;261 return(dat);
;;;262 }
ENDP
CH452I2CRead PROC
;;;270 uint8 CH452I2CRead(void)
;;;271 {
000284 e92d4010 PUSH {r4,lr}
000288 ebfffffe BL CH452I2CStart
00028c e3a0006f MOV r0,#0x6f
000290 ebfffffe BL CH452I2CWrByte
000294 ebfffffe BL CH452I2CRdByte
000298 e1a04000 MOV r4,r0
00029c ebfffffe BL CH452I2CStop
0002a0 e1a00004 MOV r0,r4
0002a4 e8bd4010 POP {r4,lr}
0002a8 e12fff1e BX lr
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -