STC作为主机轮询扫描I2C设备,确认ICN6211工作状态。

This commit is contained in:
2026-04-10 19:42:22 +08:00
commit 5953218598
19 changed files with 6783 additions and 0 deletions

253
Listings/STARTUP.lst Normal file
View File

@ -0,0 +1,253 @@
A51 MACRO ASSEMBLER STARTUP 04/10/2026 09:44:22 PAGE 1
MACRO ASSEMBLER A51 V8.02c
OBJECT MODULE PLACED IN .\Objects\STARTUP.obj
ASSEMBLER INVOKED BY: C:\Keil_v5\C51\BIN\A51.EXE STARTUP.A51 SET(SMALL) DEBUG PRINT(.\Listings\STARTUP.lst) OBJECT(.\Obj
ects\STARTUP.obj) EP
LOC OBJ LINE SOURCE
1 $nomod51
2 ;------------------------------------------------------------------------------
3 ; This file is part of the C51 Compiler package
4 ; Copyright (c) 1988-2005 Keil Elektronik GmbH and Keil Software, Inc.
5 ; Version 8.01
6 ;
7 ; *** <<< Use Configuration Wizard in Context Menu >>> ***
8 ;------------------------------------------------------------------------------
9 ; STARTUP.A51: This code is executed after processor reset.
10 ;
11 ; To translate this file use A51 with the following invocation:
12 ;
13 ; A51 STARTUP.A51
14 ;
15 ; To link the modified STARTUP.OBJ file to your application use the following
16 ; Lx51 invocation:
17 ;
18 ; Lx51 your object file list, STARTUP.OBJ controls
19 ;
20 ;------------------------------------------------------------------------------
21 ;
22 ; User-defined <h> Power-On Initialization of Memory
23 ;
24 ; With the following EQU statements the initialization of memory
25 ; at processor reset can be defined:
26 ;
27 ; <o> IDATALEN: IDATA memory size <0x0-0x100>
28 ; <i> Note: The absolute start-address of IDATA memory is always 0
29 ; <i> The IDATA space overlaps physically the DATA and BIT areas.
0080 30 IDATALEN EQU 80H
31 ;
32 ; <o> XDATASTART: XDATA memory start address <0x0-0xFFFF>
33 ; <i> The absolute start address of XDATA memory
0000 34 XDATASTART EQU 0
35 ;
36 ; <o> XDATALEN: XDATA memory size <0x0-0xFFFF>
37 ; <i> The length of XDATA memory in bytes.
0000 38 XDATALEN EQU 0
39 ;
40 ; <o> PDATASTART: PDATA memory start address <0x0-0xFFFF>
41 ; <i> The absolute start address of PDATA memory
0000 42 PDATASTART EQU 0H
43 ;
44 ; <o> PDATALEN: PDATA memory size <0x0-0xFF>
45 ; <i> The length of PDATA memory in bytes.
0000 46 PDATALEN EQU 0H
47 ;
48 ;</h>
49 ;------------------------------------------------------------------------------
50 ;
51 ;<h> Reentrant Stack Initialization
52 ;
53 ; The following EQU statements define the stack pointer for reentrant
54 ; functions and initialized it:
55 ;
56 ; <h> Stack Space for reentrant functions in the SMALL model.
57 ; <q> IBPSTACK: Enable SMALL model reentrant stack
A51 MACRO ASSEMBLER STARTUP 04/10/2026 09:44:22 PAGE 2
58 ; <i> Stack space for reentrant functions in the SMALL model.
0000 59 IBPSTACK EQU 0 ; set to 1 if small reentrant is used.
60 ; <o> IBPSTACKTOP: End address of SMALL model stack <0x0-0xFF>
61 ; <i> Set the top of the stack to the highest location.
0100 62 IBPSTACKTOP EQU 0xFF +1 ; default 0FFH+1
63 ; </h>
64 ;
65 ; <h> Stack Space for reentrant functions in the LARGE model.
66 ; <q> XBPSTACK: Enable LARGE model reentrant stack
67 ; <i> Stack space for reentrant functions in the LARGE model.
0000 68 XBPSTACK EQU 0 ; set to 1 if large reentrant is used.
69 ; <o> XBPSTACKTOP: End address of LARGE model stack <0x0-0xFFFF>
70 ; <i> Set the top of the stack to the highest location.
0000 71 XBPSTACKTOP EQU 0xFFFF +1 ; default 0FFFFH+1
72 ; </h>
73 ;
74 ; <h> Stack Space for reentrant functions in the COMPACT model.
75 ; <q> PBPSTACK: Enable COMPACT model reentrant stack
76 ; <i> Stack space for reentrant functions in the COMPACT model.
0000 77 PBPSTACK EQU 0 ; set to 1 if compact reentrant is used.
78 ;
79 ; <o> PBPSTACKTOP: End address of COMPACT model stack <0x0-0xFFFF>
80 ; <i> Set the top of the stack to the highest location.
0100 81 PBPSTACKTOP EQU 0xFF +1 ; default 0FFH+1
82 ; </h>
83 ;</h>
84 ;------------------------------------------------------------------------------
85 ;
86 ; Memory Page for Using the Compact Model with 64 KByte xdata RAM
87 ; <e>Compact Model Page Definition
88 ;
89 ; <i>Define the XDATA page used for PDATA variables.
90 ; <i>PPAGE must conform with the PPAGE set in the linker invocation.
91 ;
92 ; Enable pdata memory page initalization
0000 93 PPAGEENABLE EQU 0 ; set to 1 if pdata object are used.
94 ;
95 ; <o> PPAGE number <0x0-0xFF>
96 ; <i> uppermost 256-byte address of the page used for PDATA variables.
0000 97 PPAGE EQU 0
98 ;
99 ; <o> SFR address which supplies uppermost address byte <0x0-0xFF>
100 ; <i> most 8051 variants use P2 as uppermost address byte
00A0 101 PPAGE_SFR DATA 0A0H
102 ;
103 ; </e>
104 ;------------------------------------------------------------------------------
105
106 ; Standard SFR Symbols
00E0 107 ACC DATA 0E0H
00F0 108 B DATA 0F0H
0081 109 SP DATA 81H
0082 110 DPL DATA 82H
0083 111 DPH DATA 83H
112
113 NAME ?C_STARTUP
114
115
116 ?C_C51STARTUP SEGMENT CODE
117 ?STACK SEGMENT IDATA
118
---- 119 RSEG ?STACK
0000 120 DS 1
121
122 EXTRN CODE (?C_START)
123 PUBLIC ?C_STARTUP
A51 MACRO ASSEMBLER STARTUP 04/10/2026 09:44:22 PAGE 3
124
---- 125 CSEG AT 0
0000 020000 F 126 ?C_STARTUP: LJMP STARTUP1
127
---- 128 RSEG ?C_C51STARTUP
129
0000 130 STARTUP1:
131
132 IF IDATALEN <> 0
0000 787F 133 MOV R0,#IDATALEN - 1
0002 E4 134 CLR A
0003 F6 135 IDATALOOP: MOV @R0,A
0004 D8FD 136 DJNZ R0,IDATALOOP
137 ENDIF
138
139 IF XDATALEN <> 0
MOV DPTR,#XDATASTART
MOV R7,#LOW (XDATALEN)
IF (LOW (XDATALEN)) <> 0
MOV R6,#(HIGH (XDATALEN)) +1
ELSE
MOV R6,#HIGH (XDATALEN)
ENDIF
CLR A
XDATALOOP: MOVX @DPTR,A
INC DPTR
DJNZ R7,XDATALOOP
DJNZ R6,XDATALOOP
ENDIF
153
154 IF PPAGEENABLE <> 0
MOV PPAGE_SFR,#PPAGE
ENDIF
157
158 IF PDATALEN <> 0
MOV R0,#LOW (PDATASTART)
MOV R7,#LOW (PDATALEN)
CLR A
PDATALOOP: MOVX @R0,A
INC R0
DJNZ R7,PDATALOOP
ENDIF
166
167 IF IBPSTACK <> 0
EXTRN DATA (?C_IBP)
MOV ?C_IBP,#LOW IBPSTACKTOP
ENDIF
172
173 IF XBPSTACK <> 0
EXTRN DATA (?C_XBP)
MOV ?C_XBP,#HIGH XBPSTACKTOP
MOV ?C_XBP+1,#LOW XBPSTACKTOP
ENDIF
179
180 IF PBPSTACK <> 0
EXTRN DATA (?C_PBP)
MOV ?C_PBP,#LOW PBPSTACKTOP
ENDIF
184
0006 758100 F 185 MOV SP,#?STACK-1
186
187 ; This code is required if you use L51_BANK.A51 with Banking Mode 4
188 ;<h> Code Banking
189 ; <q> Select Bank 0 for L51_BANK.A51 Mode 4
A51 MACRO ASSEMBLER STARTUP 04/10/2026 09:44:22 PAGE 4
190
195 ;</h>
0009 020000 F 196 LJMP ?C_START
197
198 END
A51 MACRO ASSEMBLER STARTUP 04/10/2026 09:44:22 PAGE 5
SYMBOL TABLE LISTING
------ ----- -------
N A M E T Y P E V A L U E ATTRIBUTES
?C_C51STARTUP. . . C SEG 000CH REL=UNIT
?C_START . . . . . C ADDR ----- EXT
?C_STARTUP . . . . C ADDR 0000H A
?STACK . . . . . . I SEG 0001H REL=UNIT
ACC. . . . . . . . D ADDR 00E0H A
B. . . . . . . . . D ADDR 00F0H A
DPH. . . . . . . . D ADDR 0083H A
DPL. . . . . . . . D ADDR 0082H A
IBPSTACK . . . . . N NUMB 0000H A
IBPSTACKTOP. . . . N NUMB 0100H A
IDATALEN . . . . . N NUMB 0080H A
IDATALOOP. . . . . C ADDR 0003H R SEG=?C_C51STARTUP
PBPSTACK . . . . . N NUMB 0000H A
PBPSTACKTOP. . . . N NUMB 0100H A
PDATALEN . . . . . N NUMB 0000H A
PDATASTART . . . . N NUMB 0000H A
PPAGE. . . . . . . N NUMB 0000H A
PPAGEENABLE. . . . N NUMB 0000H A
PPAGE_SFR. . . . . D ADDR 00A0H A
SP . . . . . . . . D ADDR 0081H A
STARTUP1 . . . . . C ADDR 0000H R SEG=?C_C51STARTUP
XBPSTACK . . . . . N NUMB 0000H A
XBPSTACKTOP. . . . N NUMB 0000H A
XDATALEN . . . . . N NUMB 0000H A
XDATASTART . . . . N NUMB 0000H A
REGISTER BANK(S) USED: 0
ASSEMBLY COMPLETE. 0 WARNING(S), 0 ERROR(S)

View File

@ -0,0 +1,462 @@
BL51 BANKED LINKER/LOCATER V6.22 04/10/2026 09:44:22 PAGE 1
BL51 BANKED LINKER/LOCATER V6.22, INVOKED BY:
C:\KEIL_V5\C51\BIN\BL51.EXE .\Objects\STARTUP.obj, .\Objects\main.obj TO .\Objects\STC8G1K08_I2C_SCAN PRINT (.\Listings\
>> STC8G1K08_I2C_SCAN.m51) RAMSIZE (256)
MEMORY MODEL: SMALL
INPUT MODULES INCLUDED:
.\Objects\STARTUP.obj (?C_STARTUP)
.\Objects\main.obj (MAIN)
C:\KEIL_V5\C51\LIB\C51S.LIB (?C_INIT)
C:\KEIL_V5\C51\LIB\C51S.LIB (PRINTF)
C:\KEIL_V5\C51\LIB\C51S.LIB (?C?CLDPTR)
C:\KEIL_V5\C51\LIB\C51S.LIB (?C?CLDOPTR)
C:\KEIL_V5\C51\LIB\C51S.LIB (?C?CSTPTR)
C:\KEIL_V5\C51\LIB\C51S.LIB (?C?PLDIIDATA)
C:\KEIL_V5\C51\LIB\C51S.LIB (?C?CCASE)
LINK MAP OF MODULE: .\Objects\STC8G1K08_I2C_SCAN (?C_STARTUP)
TYPE BASE LENGTH RELOCATION SEGMENT NAME
-----------------------------------------------------
* * * * * * * D A T A M E M O R Y * * * * * * *
REG 0000H 0008H ABSOLUTE "REG BANK 0"
DATA 0008H 0015H UNIT _DATA_GROUP_
DATA 001DH 0001H UNIT ?DT?MAIN
001EH 0002H *** GAP ***
BIT 0020H.0 0001H.1 UNIT _BIT_GROUP_
BIT 0021H.1 0000H.1 UNIT ?BI?MAIN
0021H.2 0000H.6 *** GAP ***
IDATA 0022H 0001H UNIT ?STACK
* * * * * * * X D A T A M E M O R Y * * * * * * *
XDATA 0000H 0080H UNIT ?XD?MAIN
* * * * * * * C O D E M E M O R Y * * * * * * *
CODE 0000H 0003H ABSOLUTE
CODE 0003H 00B5H UNIT ?PR?UART_PRINTSCANRESULTS?MAIN
CODE 00B8H 0008H UNIT ?PR?_PUTCHAR?MAIN
00C0H 0003H *** GAP ***
CODE 00C3H 0003H ABSOLUTE
CODE 00C6H 035CH UNIT ?PR?PRINTF?PRINTF
CODE 0422H 0156H UNIT ?CO?MAIN
CODE 0578H 008EH UNIT ?C?LIB_CODE
CODE 0606H 008CH UNIT ?C_C51STARTUP
CODE 0692H 0072H UNIT ?PR?MAIN?MAIN
CODE 0704H 002EH UNIT ?PR?I2C_SCANALLADDRESSES?MAIN
CODE 0732H 0023H UNIT ?PR?_I2C_SCANADDRESS?MAIN
CODE 0755H 0021H UNIT ?PR?I2C_ISR?MAIN
CODE 0776H 0020H UNIT ?PR?_DELAY_MS?MAIN
CODE 0796H 0017H UNIT ?PR?I2C_INIT?MAIN
CODE 07ADH 0015H UNIT ?PR?UART1_INIT?MAIN
CODE 07C2H 0011H UNIT ?PR?_I2C_SENDDATA?MAIN
CODE 07D3H 000FH UNIT ?PR?I2C_WAIT?MAIN
BL51 BANKED LINKER/LOCATER V6.22 04/10/2026 09:44:22 PAGE 2
CODE 07E2H 000FH UNIT ?PR?DELAY5000MS?MAIN
CODE 07F1H 000CH UNIT ?PR?I2C_START?MAIN
CODE 07FDH 000CH UNIT ?PR?I2C_RECVACK?MAIN
CODE 0809H 000CH UNIT ?PR?I2C_STOP?MAIN
CODE 0815H 0004H UNIT ?C_INITSEG
OVERLAY MAP OF MODULE: .\Objects\STC8G1K08_I2C_SCAN (?C_STARTUP)
SEGMENT BIT_GROUP DATA_GROUP
+--> CALLED SEGMENT START LENGTH START LENGTH
--------------------------------------------------------------------------
?C_C51STARTUP ----- ----- ----- -----
+--> ?PR?MAIN?MAIN
+--> ?C_INITSEG
?PR?MAIN?MAIN ----- ----- ----- -----
+--> ?PR?I2C_INIT?MAIN
+--> ?PR?UART1_INIT?MAIN
+--> ?CO?MAIN
+--> ?PR?PRINTF?PRINTF
+--> ?PR?_DELAY_MS?MAIN
+--> ?PR?I2C_SCANALLADDRESSES?MAIN
+--> ?PR?UART_PRINTSCANRESULTS?MAIN
+--> ?PR?DELAY5000MS?MAIN
?PR?PRINTF?PRINTF 0020H.0 0001H.1 0009H 0014H
+--> ?PR?_PUTCHAR?MAIN
?PR?I2C_SCANALLADDRESSES?MAIN ----- ----- ----- -----
+--> ?PR?_I2C_SCANADDRESS?MAIN
+--> ?PR?_DELAY_MS?MAIN
?PR?_I2C_SCANADDRESS?MAIN 0020H.0 0000H.1 ----- -----
+--> ?PR?I2C_START?MAIN
+--> ?PR?_I2C_SENDDATA?MAIN
+--> ?PR?I2C_RECVACK?MAIN
+--> ?PR?I2C_STOP?MAIN
?PR?UART_PRINTSCANRESULTS?MAIN ----- ----- 0008H 0001H
+--> ?CO?MAIN
+--> ?PR?PRINTF?PRINTF
SYMBOL TABLE OF MODULE: .\Objects\STC8G1K08_I2C_SCAN (?C_STARTUP)
VALUE TYPE NAME
----------------------------------
------- MODULE ?C_STARTUP
C:0606H SEGMENT ?C_C51STARTUP
I:0022H SEGMENT ?STACK
C:0000H PUBLIC ?C_STARTUP
D:00E0H SYMBOL ACC
BL51 BANKED LINKER/LOCATER V6.22 04/10/2026 09:44:22 PAGE 3
D:00F0H SYMBOL B
D:0083H SYMBOL DPH
D:0082H SYMBOL DPL
N:0000H SYMBOL IBPSTACK
N:0100H SYMBOL IBPSTACKTOP
N:0080H SYMBOL IDATALEN
C:0609H SYMBOL IDATALOOP
N:0000H SYMBOL PBPSTACK
N:0100H SYMBOL PBPSTACKTOP
N:0000H SYMBOL PDATALEN
N:0000H SYMBOL PDATASTART
N:0000H SYMBOL PPAGE
N:0000H SYMBOL PPAGEENABLE
D:00A0H SYMBOL PPAGE_SFR
D:0081H SYMBOL SP
C:0606H SYMBOL STARTUP1
N:0000H SYMBOL XBPSTACK
N:0000H SYMBOL XBPSTACKTOP
N:0000H SYMBOL XDATALEN
N:0000H SYMBOL XDATASTART
C:0000H LINE# 126
C:0606H LINE# 133
C:0608H LINE# 134
C:0609H LINE# 135
C:060AH LINE# 136
C:060CH LINE# 185
C:060FH LINE# 196
------- ENDMOD ?C_STARTUP
------- MODULE MAIN
C:0000H SYMBOL _ICE_DUMMY_
D:0092H PUBLIC P1M0
D:0091H PUBLIC P1M1
D:0090H PUBLIC P1
C:07FDH PUBLIC I2C_RecvACK
B:00A8H.7 PUBLIC EA
C:07ADH PUBLIC uart1_init
D:00BAH PUBLIC P_SW2
C:07E2H PUBLIC Delay5000ms
B:0098H.1 PUBLIC TI
C:0692H PUBLIC main
C:07C2H PUBLIC _I2C_SendData
C:0003H PUBLIC UART_PrintScanResults
C:07F1H PUBLIC I2C_Start
D:0099H PUBLIC SBUF
C:0776H PUBLIC _Delay_ms
D:001DH PUBLIC scan_count
D:0098H PUBLIC SCON
C:0796H PUBLIC I2C_Init
C:07D3H PUBLIC I2C_Wait
D:008EH PUBLIC AUXR
B:0021H.1 PUBLIC busy
C:0809H PUBLIC I2C_Stop
C:0755H PUBLIC I2C_Isr
D:00D6H PUBLIC T2H
D:00D7H PUBLIC T2L
B:0090H.2 PUBLIC LED
BL51 BANKED LINKER/LOCATER V6.22 04/10/2026 09:44:22 PAGE 4
X:0000H PUBLIC i2c_scan_buffer
C:0704H PUBLIC I2C_ScanAllAddresses
C:0732H PUBLIC _I2C_ScanAddress
C:00B8H PUBLIC _putchar
------- PROC I2C_ISR
C:0755H LINE# 50
C:075BH LINE# 52
C:075DH LINE# 53
C:0760H LINE# 54
C:0767H LINE# 55
C:0767H LINE# 56
C:076BH LINE# 57
C:076DH LINE# 58
C:076DH LINE# 59
C:076FH LINE# 60
------- ENDPROC I2C_ISR
------- PROC _DELAY_MS
D:0006H SYMBOL ms
------- DO
D:0004H SYMBOL i
D:0002H SYMBOL j
------- ENDDO
C:0776H LINE# 67
C:0776H LINE# 68
C:0776H LINE# 70
C:0780H LINE# 71
C:0780H LINE# 72
C:078EH LINE# 73
C:0795H LINE# 74
------- ENDPROC _DELAY_MS
------- PROC I2C_WAIT
C:07D3H LINE# 79
C:07D3H LINE# 80
C:07D3H LINE# 81
C:07DAH LINE# 82
C:07E1H LINE# 83
------- ENDPROC I2C_WAIT
------- PROC I2C_START
C:07F1H LINE# 88
C:07F1H LINE# 89
C:07F1H LINE# 90
C:07F3H LINE# 91
C:07F9H LINE# 92
C:07FCH LINE# 93
------- ENDPROC I2C_START
------- PROC _I2C_SENDDATA
D:0007H SYMBOL dat
C:07C2H LINE# 99
C:07C2H LINE# 100
C:07C2H LINE# 101
C:07C7H LINE# 102
C:07C9H LINE# 103
C:07CFH LINE# 104
C:07D2H LINE# 105
------- ENDPROC _I2C_SENDDATA
------- PROC I2C_RECVACK
C:07FDH LINE# 110
BL51 BANKED LINKER/LOCATER V6.22 04/10/2026 09:44:22 PAGE 5
C:07FDH LINE# 111
C:07FDH LINE# 112
C:07FFH LINE# 113
C:0805H LINE# 114
C:0808H LINE# 115
------- ENDPROC I2C_RECVACK
------- PROC I2C_STOP
C:0809H LINE# 120
C:0809H LINE# 121
C:0809H LINE# 122
C:080BH LINE# 123
C:0811H LINE# 124
C:0814H LINE# 125
------- ENDPROC I2C_STOP
------- PROC I2C_INIT
C:0796H LINE# 131
C:0796H LINE# 132
C:0796H LINE# 134
C:0799H LINE# 135
C:079CH LINE# 138
C:079FH LINE# 146
C:07A5H LINE# 149
C:07AAH LINE# 152
C:07ACH LINE# 153
------- ENDPROC I2C_INIT
------- PROC _I2C_SCANADDRESS
D:0007H SYMBOL addr
------- DO
B:0020H.0 SYMBOL ack_received
------- ENDDO
C:0732H LINE# 164
C:0732H LINE# 165
C:0732H LINE# 166
C:0734H LINE# 169
C:0737H LINE# 170
C:0737H LINE# 171
C:0739H LINE# 172
C:0739H LINE# 174
C:073CH LINE# 175
C:0743H LINE# 176
C:0746H LINE# 179
C:074DH LINE# 180
C:074DH LINE# 181
C:074FH LINE# 182
C:074FH LINE# 184
C:0752H LINE# 186
C:0754H LINE# 187
------- ENDPROC _I2C_SCANADDRESS
------- PROC I2C_SCANALLADDRESSES
------- DO
D:0001H SYMBOL i
------- ENDDO
C:0704H LINE# 193
C:0704H LINE# 194
C:0704H LINE# 196
C:0707H LINE# 199
C:0708H LINE# 200
BL51 BANKED LINKER/LOCATER V6.22 04/10/2026 09:44:22 PAGE 6
C:0708H LINE# 201
C:070FH LINE# 202
C:070FH LINE# 204
C:0716H LINE# 205
C:0716H LINE# 206
C:0726H LINE# 207
C:0726H LINE# 208
C:072DH LINE# 209
C:072DH LINE# 210
C:0731H LINE# 211
------- ENDPROC I2C_SCANALLADDRESSES
------- PROC UART1_INIT
C:07ADH LINE# 217
C:07ADH LINE# 218
C:07ADH LINE# 219
C:07B0H LINE# 220
C:07B3H LINE# 221
C:07B6H LINE# 222
C:07B9H LINE# 223
C:07BCH LINE# 224
C:07BFH LINE# 225
C:07C1H LINE# 226
------- ENDPROC UART1_INIT
------- PROC _PUTCHAR
D:0007H SYMBOL c
C:00B8H LINE# 233
C:00B8H LINE# 234
C:00B8H LINE# 235
C:00BAH LINE# 236
C:00BDH LINE# 237
C:00BFH LINE# 238
C:00BFH LINE# 239
------- ENDPROC _PUTCHAR
------- PROC UART_PRINTSCANRESULTS
------- DO
D:0008H SYMBOL i
------- ENDDO
C:0003H LINE# 245
C:0003H LINE# 246
C:0003H LINE# 249
C:000CH LINE# 252
C:0016H LINE# 253
C:0016H LINE# 254
C:001FH LINE# 255
C:0029H LINE# 256
C:0029H LINE# 257
C:0040H LINE# 258
C:0047H LINE# 259
C:0047H LINE# 260
C:0050H LINE# 261
C:0050H LINE# 262
C:0054H LINE# 263
C:005DH LINE# 264
C:0066H LINE# 265
C:0070H LINE# 266
C:0070H LINE# 267
C:008AH LINE# 268
BL51 BANKED LINKER/LOCATER V6.22 04/10/2026 09:44:22 PAGE 7
C:0091H LINE# 269
C:0091H LINE# 270
C:009AH LINE# 271
C:009AH LINE# 272
C:009EH LINE# 273
C:00A4H LINE# 274
C:00A6H LINE# 276
C:00A6H LINE# 277
C:00AFH LINE# 278
C:00AFH LINE# 279
------- ENDPROC UART_PRINTSCANRESULTS
------- PROC DELAY5000MS
------- DO
D:0007H SYMBOL i
D:0006H SYMBOL j
D:0005H SYMBOL k
------- ENDDO
C:07E2H LINE# 284
C:07E2H LINE# 285
C:07E2H LINE# 288
C:07E3H LINE# 289
C:07E4H LINE# 290
C:07E6H LINE# 291
C:07E8H LINE# 292
C:07EAH LINE# 294
C:07EAH LINE# 296
C:07EAH LINE# 297
C:07ECH LINE# 298
C:07EEH LINE# 299
C:07F0H LINE# 300
------- ENDPROC DELAY5000MS
------- PROC MAIN
C:0692H LINE# 305
C:0692H LINE# 306
C:0692H LINE# 308
C:0695H LINE# 309
C:0698H LINE# 311
C:069AH LINE# 314
C:06A3H LINE# 315
C:06ACH LINE# 316
C:06B5H LINE# 317
C:06BEH LINE# 318
C:06C7H LINE# 319
C:06D0H LINE# 320
C:06D9H LINE# 323
C:06D9H LINE# 324
C:06D9H LINE# 326
C:06DBH LINE# 327
C:06E2H LINE# 328
C:06E4H LINE# 330
C:06EDH LINE# 331
C:06F0H LINE# 332
C:06F9H LINE# 334
C:06FCH LINE# 336
C:06FFH LINE# 338
C:0702H LINE# 339
------- ENDPROC MAIN
BL51 BANKED LINKER/LOCATER V6.22 04/10/2026 09:44:22 PAGE 8
------- ENDMOD MAIN
------- MODULE PRINTF
D:0009H PUBLIC ?_PRINTF517?BYTE
D:0009H PUBLIC ?_PRINTF?BYTE
D:0009H PUBLIC ?_SPRINTF517?BYTE
D:0009H PUBLIC ?_SPRINTF?BYTE
C:0128H PUBLIC _PRINTF
C:0128H PUBLIC _PRINTF517
C:0122H PUBLIC _SPRINTF
C:0122H PUBLIC _SPRINTF517
------- ENDMOD PRINTF
------- MODULE ?C?CLDPTR
C:0578H PUBLIC ?C?CLDPTR
------- ENDMOD ?C?CLDPTR
------- MODULE ?C?CLDOPTR
C:0591H PUBLIC ?C?CLDOPTR
------- ENDMOD ?C?CLDOPTR
------- MODULE ?C?CSTPTR
C:05BEH PUBLIC ?C?CSTPTR
------- ENDMOD ?C?CSTPTR
------- MODULE ?C?PLDIIDATA
C:05D0H PUBLIC ?C?PLDIIDATA
------- ENDMOD ?C?PLDIIDATA
------- MODULE ?C?CCASE
C:05E0H PUBLIC ?C?CCASE
------- ENDMOD ?C?CCASE
*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS
SEGMENT: ?PR?I2C_WAIT?MAIN
Program Size: data=32.2 xdata=128 code=2070
LINK/LOCATE RUN COMPLETE. 1 WARNING(S), 0 ERROR(S)

374
Listings/main.lst Normal file
View File

@ -0,0 +1,374 @@
C51 COMPILER V9.55 MAIN 04/10/2026 09:44:22 PAGE 1
C51 COMPILER V9.55, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN .\Objects\main.obj
COMPILER INVOKED BY: C:\Keil_v5\C51\BIN\C51.EXE main.c OPTIMIZE(8,SPEED) BROWSE DEBUG OBJECTEXTEND PRINT(.\Listings\main
-.lst) TABS(2) OBJECT(.\Objects\main.obj)
line level source
1 /*
2 * 文件名: main.c
3 * 功能: STC8G1K08 I2C设备扫描器
4 * 描述:
5 * 1. 作为I2C主机扫描所有7位地址0x00-0x7F接收并记录所有应答
6 * 2. 每5秒自动进行一次扫描
7 * 3. 每次扫描完成后通过UART输出所有应答地址
8 * 芯片: STC8G1K08
9 * 系统时钟: 11.0592MHz
10 */
11
12 #include "reg51.h"
13 #include "intrins.h"
14 #include <stdio.h>
15
16 /* 定义STC8G专用寄存器 */
17 sfr P_SW2 = 0xba; // 端口切换寄存器
18 sfr AUXR = 0x8e; // 辅助寄存器
19 sfr T2L = 0xd7; // 定时器2低字节
20 sfr T2H = 0xd6; // 定时器2高字节
21
22 /* 定义I2C相关寄存器使用xdata指针访问扩展SFR */
23 #define I2CCFG (*(unsigned char volatile xdata *)0xfe80) // I2C配置寄存器
24 #define I2CMSCR (*(unsigned char volatile xdata *)0xfe81) // I2C主机控制寄存器
25 #define I2CMSST (*(unsigned char volatile xdata *)0xfe82) // I2C主机状态寄存器
26 #define I2CSLCR (*(unsigned char volatile xdata *)0xfe83) // I2C从机控制寄存器
27 #define I2CSLST (*(unsigned char volatile xdata *)0xfe84) // I2C从机状态寄存器
28 #define I2CSLADR (*(unsigned char volatile xdata *)0xfe85) // I2C从机地址寄存器
29 #define I2CTXD (*(unsigned char volatile xdata *)0xfe86) // I2C数据发送寄存器
30 #define I2CRXD (*(unsigned char volatile xdata *)0xfe87) // I2C数据接收寄存器
31
32 /* 定义端口模式寄存器 */
33 sfr P1M1 = 0x91; // P1模式配置寄存器1
34 sfr P1M0 = 0x92; // P1模式配置寄存器0
35
36 /* 定义I2C引脚 */
37 sbit SDA = P1^4; // I2C数据线
38 sbit SCL = P1^5; // I2C时钟线
39
40 /* 定义LED引脚 */
41 sbit LED = P1^2; // 状态指示LED
42
43 /* 全局变量 */
44 bit busy; // I2C忙碌标志位
45
46 /**
47 * @brief I2C中断服务函数
48 * @note 用于处理I2C通信完成事件
49 */
50 void I2C_Isr() interrupt 24 // 关键修复中断号从24改为7
51 {
52 1 _push_(P_SW2); // 保存P_SW2寄存器
53 1 P_SW2 |= 0x80; // 访问扩展寄存器
54 1 if (I2CMSST & 0x40) // 检查中断标志位BIT6: 主机操作完成)
C51 COMPILER V9.55 MAIN 04/10/2026 09:44:22 PAGE 2
55 1 {
56 2 I2CMSST &= ~0x40; // 清除中断标志
57 2 busy = 0; // 清除忙碌标志
58 2 }
59 1 _pop_(P_SW2); // 恢复P_SW2寄存器
60 1 }
61
62 /**
63 * @brief 延时函数
64 * @param ms 延时毫秒数
65 * @note 系统时钟11.0592MHz
66 */
67 void Delay_ms(unsigned int ms)
68 {
69 1 unsigned int i, j;
70 1 for (i = 0; i < ms; i++)
71 1 {
72 2 for (j = 0; j < 1100; j++); // 修正延时参数更准确的1ms
73 2 }
74 1 }
75
76 /**
77 * @brief 等待I2C操作完成
78 */
79 void I2C_Wait()
80 {
81 1 while(!(I2CMSST & 0x40)); // 等待中断标志置位
82 1 I2CMSST &= ~0x40; // 清除中断标志
83 1 }
84
85 /**
86 * @brief 发送I2C起始信号
87 */
88 void I2C_Start()
89 {
90 1 busy = 1; // 设置忙碌标志
91 1 I2CMSCR = 0x81; // 发送START命令0x80=主机模式0x01=START
92 1 while (busy); // 等待操作完成
93 1 }
94
95 /**
96 * @brief 发送I2C数据
97 * @param dat 要发送的数据
98 */
99 void I2C_SendData(unsigned char dat)
100 {
101 1 I2CTXD = dat; // 写数据到发送缓冲区
102 1 busy = 1; // 设置忙碌标志
103 1 I2CMSCR = 0x82; // 发送SEND命令0x80=主机模式0x02=SEND
104 1 while (busy); // 等待操作完成
105 1 }
106
107 /**
108 * @brief 接收I2C应答信号
109 */
110 void I2C_RecvACK()
111 {
112 1 busy = 1; // 设置忙碌标志
113 1 I2CMSCR = 0x83; // 发送读ACK命令0x80=主机模式0x03=RECV ACK
114 1 while (busy); // 等待操作完成
115 1 }
116
C51 COMPILER V9.55 MAIN 04/10/2026 09:44:22 PAGE 3
117 /**
118 * @brief 发送I2C停止信号
119 */
120 void I2C_Stop()
121 {
122 1 busy = 1; // 增加busy标志保持逻辑一致
123 1 I2CMSCR = 0x86; // 发送STOP命令0x80=主机模式0x06=STOP
124 1 while (busy); // 等待操作完成
125 1 }
126
127 /**
128 * @brief I2C初始化函数
129 * @note 配置P1.4为SDAP1.5为SCL设置50kHz通信速率启用中断
130 */
131 void I2C_Init()
132 {
133 1 /* 配置端口模式 */
134 1 P1M0 = 0x04; // P1.2设置为推挽输出LEDP1.4和P1.5保持准双向口
135 1 P1M1 = 0x00;
136 1
137 1 /* 访问扩展寄存器 */
138 1 P_SW2 = 0x80;
139 1
140 1 /* 配置I2C参数 */
141 1 // 0xF3 = 11110011
142 1 // bit7=1: 启用I2C
143 1 // bit6=1: 主机模式
144 1 // bit5=1: 启用I2C中断关键修复开启中断
145 1 // bit4~0=0x13: MSSPEED=19计算50kHz11059200/(2*(19+4)*2)=~50kHz
146 1 I2CCFG = 0xF3;
147 1
148 1 /* 初始化I2C状态 */
149 1 I2CMSST = 0x00;
150 1
151 1 /* 启用全局中断和I2C中断 */
152 1 EA = 1; // 全局中断使能
153 1 }
154
155 /* I2C扫描缓冲区用于存储检测到的设备地址 */
156 unsigned char xdata i2c_scan_buffer[128]; // 7位地址最多128个
157 unsigned char scan_count = 0; // 扫描到的设备数量
158
159 /**
160 * @brief 扫描指定I2C 7位地址
161 * @param addr 要扫描的7位I2C地址0x00-0x7F
162 * @return 1表示收到应答0表示无应答
163 */
164 bit I2C_ScanAddress(unsigned char addr)
165 {
166 1 bit ack_received = 0; // 应答接收标志
167 1
168 1 /* 跳过保留地址0x00通用呼叫地址 */
169 1 if (addr == 0x00)
170 1 {
171 2 return 0;
172 2 }
173 1
174 1 I2C_Start(); // 发送起始信号
175 1 I2C_SendData(addr << 1); // 7位地址左移+读写位0=写)
176 1 I2C_RecvACK(); // 接收应答信号
177 1
178 1 /* 检查是否收到ACKI2CMSST的bit1为0表示收到ACK */
C51 COMPILER V9.55 MAIN 04/10/2026 09:44:22 PAGE 4
179 1 if (!(I2CMSST & 0x02))
180 1 {
181 2 ack_received = 1; // 收到应答
182 2 }
183 1
184 1 I2C_Stop(); // 发送停止信号
185 1
186 1 return ack_received;
187 1 }
188
189 /**
190 * @brief 扫描所有I2C 7位地址0x00-0x7F
191 * @note 将所有应答的设备地址存储到缓冲区中
192 */
193 void I2C_ScanAllAddresses(void)
194 {
195 1 unsigned char i;
196 1 scan_count = 0; // 清零扫描计数
197 1
198 1 /* 遍历所有7位I2C地址规范扫描范围 */
199 1 for (i = 0; i < 128; i++)
200 1 {
201 2 if (I2C_ScanAddress(i)) // 如果收到应答
202 2 {
203 3 /* 防止缓冲区溢出 */
204 3 if (scan_count < 128)
205 3 {
206 4 i2c_scan_buffer[scan_count++] = i; // 将7位地址存入缓冲区
207 4 }
208 3 Delay_ms(1); // 短暂延时,避免总线冲突
209 3 }
210 2 }
211 1 }
212
213 /**
214 * @brief UART1初始化函数
215 * @note 波特率115200bps系统时钟11.0592MHz
216 */
217 void uart1_init(void)
218 {
219 1 SCON = 0x50; // 8位UART允许接收
220 1 AUXR |= 0x01; // 串口1选择定时器2为波特率发生器
221 1 AUXR &= 0xFB; // 定时器2时钟为12T模式
222 1 T2L = 0xFE; // 设置定时器2初值
223 1 T2H = 0xFF; // 设置定时器2初值
224 1 AUXR |= 0x10; // 启动定时器2
225 1 TI = 1; // 设置TI标志用于printf重定向
226 1 }
227
228 /**
229 * @brief putchar重定向函数用于printf输出
230 * @param c 要输出的字符
231 * @return 输出的字符
232 */
233 char putchar(char c)
234 {
235 1 SBUF = c; // 写入发送缓冲区
236 1 while (!TI); // 等待发送完成
237 1 TI = 0; // 清除发送完成标志
238 1 return c;
239 1 }
240
C51 COMPILER V9.55 MAIN 04/10/2026 09:44:22 PAGE 5
241 /**
242 * @brief 通过UART打印I2C扫描结果
243 * @note 输出格式化的扫描结果,包括设备数量和地址列表
244 */
245 void UART_PrintScanResults(void)
246 {
247 1 unsigned char i;
248 1
249 1 printf("\r\n=== I2C扫描结果 ===\r\n");
250 1 // printf("检测到的7位I2C设备数量: %d\r\n", scan_count);
251 1
252 1 if (scan_count > 0)
253 1 {
254 2 printf("应答地址列表7位:\r\n");
255 2 for (i = 0; i < scan_count; i++)
256 2 {
257 3 printf("0x%02X ", i2c_scan_buffer[i]); // 以十六进制格式输出7位地址
258 3 if ((i + 1) % 8 == 0) // 每8个地址换行
259 3 {
260 4 printf("\r\n");
261 4 }
262 3 }
263 2 printf("\r\n");
264 2 printf("对应发送地址8位写模式:\r\n");
265 2 for (i = 0; i < scan_count; i++)
266 2 {
267 3 printf("0x%02X ", i2c_scan_buffer[i] << 1);
268 3 if ((i + 1) % 8 == 0) // 每8个地址换行
269 3 {
270 4 printf("\r\n");
271 4 }
272 3 }
273 2 printf("\r\n");
274 2 }
275 1 else
276 1 {
277 2 printf("未检测到任何I2C设备\r\n");
278 2 }
279 1 printf("==================\r\n");
280 1 }
281
282
283
284 void Delay5000ms(void) //@11.0592MHz
285 {
286 1 unsigned char data i, j, k;
287 1
288 1 _nop_();
289 1 _nop_();
290 1 i = 211;
291 1 j = 30;
292 1 k = 11;
293 1 do
294 1 {
295 2 do
296 2 {
297 3 while (--k);
298 3 } while (--j);
299 2 } while (--i);
300 1 }
301
302 /**
C51 COMPILER V9.55 MAIN 04/10/2026 09:44:22 PAGE 6
303 * @brief 主函数
304 */
305 void main()
306 {
307 1 /* 初始化各模块 */
308 1 I2C_Init(); // 初始化I2C
309 1 uart1_init(); // 初始化UART1
310 1
311 1 LED = 0; // 点亮LED推挽输出低电平点亮
312 1
313 1 /* 输出启动信息 */
314 1 printf("\r\n");
315 1 printf("========================================\r\n");
316 1 printf(" STC8G1K08 I2C设备扫描器\r\n");
317 1 printf("========================================\r\n");
318 1 printf("系统初始化完成...\r\n");
319 1 printf("每5秒自动扫描一次I2C总线\r\n");
320 1 printf("========================================\r\n");
321 1
322 1 /* 主循环 */
323 1 while (1)
324 1 {
325 2 /* LED闪烁指示扫描开始 */
326 2 LED = 1; // 熄灭LED
327 2 Delay_ms(100);
328 2 LED = 0; // 点亮LED
329 2
330 2 printf("\r\n[开始扫描...]\r\n");
331 2 I2C_ScanAllAddresses(); // 执行I2C扫描
332 2 printf("[扫描完成]\r\n");
333 2
334 2 UART_PrintScanResults(); // 输出扫描结果
335 2
336 2 scan_count = 0; // 清零扫描计数,准备下一次扫描
337 2
338 2 Delay5000ms(); // 等待5秒后再次扫描
339 2 }
340 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 576 ----
CONSTANT SIZE = 342 ----
XDATA SIZE = 128 ----
PDATA SIZE = ---- ----
DATA SIZE = 1 1
IDATA SIZE = ---- ----
BIT SIZE = 1 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)