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

238
I2CM_refer/main.c Normal file
View File

@ -0,0 +1,238 @@
#include "reg51.h"
#include "intrins.h"
// 定义I2C相关寄存器
sfr P_SW2 = 0xba;
#define I2CCFG (*(unsigned char volatile xdata *)0xfe80)
#define I2CMSCR (*(unsigned char volatile xdata *)0xfe81)
#define I2CMSST (*(unsigned char volatile xdata *)0xfe82)
#define I2CSLCR (*(unsigned char volatile xdata *)0xfe83)
#define I2CSLST (*(unsigned char volatile xdata *)0xfe84)
#define I2CSLADR (*(unsigned char volatile xdata *)0xfe85)
#define I2CTXD (*(unsigned char volatile xdata *)0xfe86)
#define I2CRXD (*(unsigned char volatile xdata *)0xfe87)
// 定义端口模式寄存器
sfr P1M1 = 0x91;
sfr P1M0 = 0x92;
// 定义I2C引脚
sbit SDA = P1^4;
sbit SCL = P1^5;
// 定义LED引脚
sbit LED = P1^2;
// 全局变量
bit busy; // I2C忙碌标志
/**
* @brief I2C中断服务函数
* @note 中断号24用于处理I2C通信完成事件
*/
void I2C_Isr() interrupt 24
{
_push_(P_SW2);
P_SW2 |= 0x80; // 访问扩展寄存器
if (I2CMSST & 0x40) // 检查中断标志
{
I2CMSST &= ~0x40; // 清除中断标志
busy = 0; // 清除忙碌标志
}
_pop_(P_SW2);
}
/**
* @brief 等待I2C操作完成
*/
void I2C_Wait()
{
while(!(I2CMSST & 0x40));
I2CMSST &= ~0x40; // 清除中断标志
}
/**
* @brief 发送I2C起始信号
*/
void I2C_Start()
{
busy = 1;
I2CMSCR = 0x81; // 发送START命令
while (busy); // 等待操作完成
}
/**
* @brief 发送I2C数据
* @param dat 要发送的数据
*/
void I2C_SendData(unsigned char dat)
{
I2CTXD = dat; // 写数据到数据缓冲区
busy = 1;
I2CMSCR = 0x82; // 发送SEND命令
while (busy); // 等待操作完成
}
/**
* @brief 接收I2C应答信号
*/
void I2C_RecvACK()
{
busy = 1;
I2CMSCR = 0x83; // 发送读ACK命令
while (busy); // 等待操作完成
}
char I2C_RecvData()
{
busy = 1;
I2CMSCR = 0x84; // 发送读数据命令
while (busy); // 等待操作完成
return I2CRXD; // 返回接收数据
}
void I2C_SendACK()
{
I2CMSST = 0x00; //设置ACK信号
I2CMSCR = 0x05; // 发送ACK命令
I2C_Wait(); // 等待操作完成
}
void I2C_SendNAK()
{
I2CMSST = 0x01; //设置NACK信号
I2CMSCR = 0x05; // 发送NACK命令
I2C_Wait(); // 等待操作完成
}
/**
* @brief 发送I2C停止信号
*/
void I2C_Stop()
{
I2CMSCR = 0x06; // 发送STOP命令
I2C_Wait(); // 等待操作完成
}
// /**
// * @brief 延时函数
// * @param ms 延时毫秒数
// */
// void Delay_ms(unsigned int ms) //@24.000MHz
// {
// unsigned int i, j;
// for (i = 0; i < ms; i++)
// {
// for (j = 0; j < 3500; j++);
// }
// }
// void Delay10us(void) //@24.000MHz
// {
// unsigned char data i;
// i = 78;
// while (--i);
// }
/**
* @brief 延时函数
* @param ms 延时毫秒数
*/
void Delay_ms(unsigned int ms) //@11.0592MHz
{
unsigned int i, j;
for (i = 0; i < ms; i++)
{
for (j = 0; j < 1550; j++);
}
}
void Delay10us(void) //@11.0592MHz
{
unsigned char data i;
i = 35;
while (--i);
}
/**
* @brief I2C初始化函数
* @note 配置P1.4为SDAP1.5为SCL设置100k通信速率
*/
void I2C_Init()
{
// 配置端口模式
P1M0 = 0x04; // P1.2设置为推挽输出P1.4和P1.5保持准双向口
P1M1 = 0x00;
// 访问扩展寄存器
P_SW2 = 0x80;
// 配置I2C通信速率为50kHz
// 系统时钟11.059MHz
// MSSPEED = (1105900/100000/2 -4)/2 = 25
I2CCFG = 0xe0 | 0x10; // 0xe0使能I2C主机模式0x10设置MSSPEED=25
// 初始化I2C状态
I2CMSST = 0x00;
// 启用全局中断·
EA = 1;
}
/**
* @brief 向指定设备的指定寄存器发送I2C数据
* @param devAddr 设备地址
* @param regAddr 寄存器地址
* @param dat 要发送的数据
*/
void I2C_SendToRegister(unsigned char devAddr, unsigned char regAddr, unsigned char dat)
{
I2C_Start(); // 发送起始信号
I2C_SendData(devAddr); // 发送设备地址+写命令
I2C_RecvACK(); // 接收应答
I2C_SendData(regAddr); // 发送寄存器地址
I2C_RecvACK(); // 接收应答
I2C_SendData(dat); // 发送数据
I2C_RecvACK(); // 接收应答
I2C_Stop(); // 发送停止信号
}
/**
* @brief 主函数
*/
void main()
{
// 初始化数据变量用于0x96寄存器的数据递增
unsigned char reg96_data = 0;
// 初始化I2C
I2C_Init();
// 点亮LED保持常亮
LED = 0; // 推挽输出低电平点亮LED
// 主循环
while (1)
{
// 向设备0x8A的三个不同寄存器发送数据
// 发送到寄存器0x94数据0x03
I2C_SendToRegister(0x8A, 0x94, 0x03);
Delay10us(); // 延时10us
// 发送到寄存器0x95数据0x17
I2C_SendToRegister(0x8A, 0x95, 0x17);
Delay10us(); // 延时10us
// 发送到寄存器0x96数据递增
I2C_SendToRegister(0x8A, 0x96, reg96_data);
// 数据递增5达到255后重置为0
reg96_data += 5;
if (reg96_data > 0xFF)
{
reg96_data = 0;
}
Delay_ms(1000); // 延时1秒
}
}

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)

BIN
Objects/STARTUP.obj Normal file

Binary file not shown.

BIN
Objects/STC8G1K08_I2C_SCAN Normal file

Binary file not shown.

View File

@ -0,0 +1,37 @@
<html>
<body>
<pre>
<h1><EFBFBD>Vision Build Log</h1>
<h2>Tool Versions:</h2>
IDE-Version: <20><>Vision V5.43.1.0
Copyright (C) 2025 ARM Ltd and ARM Germany GmbH. All rights reserved.
License Information: x xtell, x, LIC=58E4T-RI3SS-94BS2-9VME3-DGA97-597R7
Tool Versions:
Toolchain: PK51 Prof. Developers Kit Version: 9.55
Toolchain Path: C:\Keil_v5\C51\BIN
C Compiler: C51.exe V9.55
Assembler: A51.exe V8.02c
Linker/Locator: BL51.exe V6.22
Library Manager: LIB51.exe V4.30.1.0
Hex Converter: OH51.exe V2.7.0.0
CPU DLL: S8051.DLL V3.101.0.0
Dialog DLL: DP51.DLL V2.62.0.1
<h2>Project:</h2>
C:\workfile\102_RasberryPi_DSI\software\STC8G1K08_I2C_SCAN\STC8G1K08_I2C_SCAN.uvproj
Project File Date: 02/13/2026
<h2>Output:</h2>
Rebuild target 'Target_1'
assembling STARTUP.A51...
compiling main.c...
linking...
*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS
SEGMENT: ?PR?I2C_WAIT?MAIN
Program Size: data=32.2 xdata=128 code=2070
creating hex file from ".\Objects\STC8G1K08_I2C_SCAN"...
".\Objects\STC8G1K08_I2C_SCAN" - 0 Error(s), 1 Warning(s).
Build Time Elapsed: 00:00:01
</pre>
</body>
</html>

View File

@ -0,0 +1,148 @@
:03000000020606EF
:0C060600787FE4F6D8FD75812102064DD6
:100422000D0A3D3D3D20493243E689ABE68F8FE719
:10043200BB93E69E9C203D3D3D0D0A00E5BA94E744
:10044200AD94E59CB0E59D80E58897E8A1A8EFBC56
:100452008837E4BD8DEFBC893A0D0A00307825302B
:10046200325820000D0A00E5AFB9E5BA94E58F9144
:10047200E98081E59CB0E59D80EFBC8838E4BD8DC4
:10048200E58699E6A8A1E5BC8FEFBC893A0D0A0082
:10049200E69CAAE6A380E6B58BE588B0E4BBBBE4A4
:1004A200BD95493243E8AEBEE5A4870D0A003D3D45
:1004B2003D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D6A
:1004C2000D0A003D3D3D3D3D3D3D3D3D3D3D3D3DFA
:1004D2003D3D3D3D3D3D3D3D3D3D3D3D3D3D3D3D4A
:1004E2003D3D3D3D3D3D3D3D3D3D3D0D0A00202014
:1004F2005354433847314B303820493243E8AEBE7B
:10050200E5A487E689ABE68F8FE599A80D0A00E797
:10051200B3BBE7BB9FE5889DE5A78BE58C96E5AE6F
:100522008CE688902E2E2E0D0A00E6AF8F35E7A7B7
:1005320092E887AAE58AA8E689ABE68F8FE4B880BD
:10054200E6ACA1493243E680BBE7BABF0D0A000D13
:100552000A5BE5BC80E5A78BE689ABE68F8F2E2E82
:100562002E5D0D0A005BE689ABE68F8FE5AE8CE669
:0605720088905D0D0A00F7
:03081500011D00C2
:0300C300020755DC
:10075500C0E0C083C082C0BA43BA8090FE82E03058
:10076500E606E054BFF0C209D0BAD082D083D0E00B
:010775003251
:10077600E4FDFCC3ED9FEC9E5015E4FBFA0BBB00B9
:0F078600010ABA04F8BB4CF50DBD00010C80E46C
:010795002241
:0F07D30090FE82E030E6F990FE82E054BFF02203
:0C07F100D20990FE817481F02009FD22E5
:1007C20090FE86EFF0D20990FE817482F02009FD3E
:0107D2002204
:0C07FD00D20990FE817483F02009FD22D7
:0C080900D20990FE817486F02009FD22C7
:10079600759204E4F59175BA8090FE8074F3F0903A
:0707A600FE82E4F0D2AF2255
:10073200C200EF7002C3221207F1EF25E0FF120799
:10074200C21207FD90FE82E020E102D200120809E7
:02075200A20003
:010754002282
:10070400E4F51DF9AF01120732501EE51DC39480B4
:100714005010AF1D051D74002FF582E43400F583DD
:0D072400E9F07F017E0012077609B980D749
:0107310022A5
:1007AD00759850438E01538EFB75D7FE75D6FF435A
:0507BD008E10D299220C
:0800B8008F993099FDC29922D5
:100003007BFF7A047922120128E51DD39400500363
:100013000200A67BFF7A04793E120128E4F508E585
:1000230008C3951D502B7BFF7A04795E7400250865
:10003300F582E43400F583E0F50C120128E50804A9
:10004300540770097BFF7A0479661201280508803A
:10005300CE7BFF7A0479661201287BFF7A047969E3
:10006300120128E4F508E508C3951D502E7BFF7A9D
:1000730004795E74002508F582E43400F583E0FF1B
:1000830025E0F50C120128E50804540770097BFFED
:100093007A047966120128050880CB7BFF7A0479FC
:1000A3006680067BFF7A0479921201287BFF7A042B
:0500B30079B0020128F4
:0E07E20000007FD37E1E7D0BDDFEDEFCDFFA05
:0107F00022E6
:100692001207961207ADC2927BFF7A0479661201A5
:1006A200287BFF7A0479C51201287BFF7A0479F04E
:1006B2001201287BFF7A0479C51201287BFF7A0593
:1006C20079111201287BFF7A05792C1201287BFF10
:1006D2007A0479C5120128D2927F647E00120776CD
:1006E200C2927BFF7A0579511201281207047BFF1F
:1006F2007A057967120128120003E4F51D1207E258
:0207020080D5A0
:10061200020692E493A3F8E493A34003F68001F266
:1006220008DFF48029E493A3F85407240CC8C333E9
:10063200C4540F4420C8834004F456800146F6DFB8
:10064200E4800B0102040810204080900815E47E2B
:10065200019360BCA3FF543F30E509541FFEE493AD
:10066200A360010ECF54C025E060A840B8E493A374
:10067200FAE493A3F8E493A3C8C582C8CAC583CA9F
:10068200F0A3C8C582C8CAC583CADFE9DEE780BE57
:0108180000DF
:1000C600E518240CF8E60518227809300702780CA2
:1000D600E475F0011205D00205782000EB7F2ED2E0
:1000E600008018EF540F2490D43440D4FF30040B12
:1000F600EF24BFB41A0050032461FFE5196002150E
:1001060019051CE51C7002051B30070D7809E475FE
:10011600F0011205D0EF0205BE0200B87403D20743
:100126008003E4C207F5188B098A0A890BE4F519DE
:10013600F51BF51CE51960077F2012010180F57596
:100146001AFFC201C200C202C203C205C206C20829
:100156001200CFFF700D3007057F00120112AF1C91
:10016600AE1B22B4255FC2D5C2041200CFFF24D035
:10017600B40A00501A75F00A781930D50508B6FF8A
:100186000106C6A426F620D5047002D20380D9241F
:10019600CFB41A00EF5004C2E5D204020312D20112
:1001A60080C6D20080C0D20280BCD2D580BAD20529
:1001B60080B47F201201012002077401B5190040A6
:1001C600F11200C6FF12010102013AD208D20680DE
:1001D600951200C6FB1200C6FA1200C6F94A4B7009
:1001E6000679E37A037BFF20022EE519602A7E005A
:1001F6008E8275830012059160060EEE651A70F008
:10020600C2D5EBC0E0EAC0E0E9C0E0EE120359D087
:10021600E0F9D0E0FAD0E0FB120578FF60AAEBC067
:10022600E0EAC0E0E9C0E0120101D0E02401F9D023
:10023600E03400FAD0E0FBE51A0460DCD51AD98078
:10024600877BFF7A037955D202809C7910800279E8
:1002560008C206C2088008D2D5790A8004790AC283
:10026600D5E51A047002F51AE4FAFDFEFF1200C67F
:10027600FC7B082001131200C6FD7B1030000A1219
:1002860000C6FE1200C6FF7B20EC3382D592D55005
:1002960013C3E43000069FFFE49EFEE42001039DA5
:1002A600FDE49CFCE4CBF8C201EC700CCFCECDCCC7
:1002B600E824F8F870F38017C3EF33FFEE33FEED52
:1002C60033FDEC33FCEB33FB994002FB0FD8E9EB33
:1002D600300105F8D0E0C448B201C0E00AEC4D4E4A
:1002E6004F78207B0070C2EAB51A0040BCC0E0120D
:1002F600035BD0F0D0E0200104C4C0E0C4B201C06A
:10030600F01200EAD0F0D5F0EB02013A1205E00156
:10031600D75302515801A84C01A44202554F025D21
:0F03260044025D4901BD43026355024746024749
:100335004502474704035001AC2D01B02E01D32BD4
:1003450001B42301D12003EC2A016C48000001CB44
:100355003F3F3F00790AA2D5200314300509B910A3
:10036500020404B9080104A2D520060250010420A4
:1003750002689202B519005034C0E07F203003199D
:100385007F30A20272067205500F1203B2C202C27A
:1003950006C205C2087F30800F300503E9C0E012B0
:1003A5000101300503D0E0F9D0E0B519CC300517CF
:1003B5007F30B9100C1201017F583004077F788017
:1003C50003B908031201013002057F2D0201017FE7
:1003D500202008F87F2B2006F322920280CF286E7A
:1003E500756C6C2900D2011200C63001F8C2017883
:1003F5001930D50108F602016C2D504349581200F9
:10040500C62403B405004001E49003FE931200F2F4
:0D041500743A1200F2D2037519040202516C
:10057800BB010689828A83E0225002E722BBFE0281
:09058800E32289828A83E49322B4
:10059100BB010CE58229F582E5833AF583E022501F
:1005A10006E92582F8E622BBFE06E92582F8E22269
:0D05B100E58229F582E5833AF583E4932283
:1005BE00BB010689828A83F0225002F722BBFE011C
:0205CE00F32216
:1005D000FAE6FB0808E6F925F0F618E6CA3AF6222C
:1005E000D083D082F8E4937012740193700DA3A3AA
:1005F00093F8740193F5828883E4737402936860BE
:06060000EFA3A3A380DFBD
:00000001FF

View File

@ -0,0 +1,4 @@
".\Objects\STARTUP.obj",
".\Objects\main.obj"
TO ".\Objects\STC8G1K08_I2C_SCAN"
PRINT(".\Listings\STC8G1K08_I2C_SCAN.m51") RAMSIZE(256)

BIN
Objects/main.obj Normal file

Binary file not shown.

198
STARTUP.A51 Normal file
View File

@ -0,0 +1,198 @@
$NOMOD51
;------------------------------------------------------------------------------
; This file is part of the C51 Compiler package
; Copyright (c) 1988-2005 Keil Elektronik GmbH and Keil Software, Inc.
; Version 8.01
;
; *** <<< Use Configuration Wizard in Context Menu >>> ***
;------------------------------------------------------------------------------
; STARTUP.A51: This code is executed after processor reset.
;
; To translate this file use A51 with the following invocation:
;
; A51 STARTUP.A51
;
; To link the modified STARTUP.OBJ file to your application use the following
; Lx51 invocation:
;
; Lx51 your object file list, STARTUP.OBJ controls
;
;------------------------------------------------------------------------------
;
; User-defined <h> Power-On Initialization of Memory
;
; With the following EQU statements the initialization of memory
; at processor reset can be defined:
;
; <o> IDATALEN: IDATA memory size <0x0-0x100>
; <i> Note: The absolute start-address of IDATA memory is always 0
; <i> The IDATA space overlaps physically the DATA and BIT areas.
IDATALEN EQU 80H
;
; <o> XDATASTART: XDATA memory start address <0x0-0xFFFF>
; <i> The absolute start address of XDATA memory
XDATASTART EQU 0
;
; <o> XDATALEN: XDATA memory size <0x0-0xFFFF>
; <i> The length of XDATA memory in bytes.
XDATALEN EQU 0
;
; <o> PDATASTART: PDATA memory start address <0x0-0xFFFF>
; <i> The absolute start address of PDATA memory
PDATASTART EQU 0H
;
; <o> PDATALEN: PDATA memory size <0x0-0xFF>
; <i> The length of PDATA memory in bytes.
PDATALEN EQU 0H
;
;</h>
;------------------------------------------------------------------------------
;
;<h> Reentrant Stack Initialization
;
; The following EQU statements define the stack pointer for reentrant
; functions and initialized it:
;
; <h> Stack Space for reentrant functions in the SMALL model.
; <q> IBPSTACK: Enable SMALL model reentrant stack
; <i> Stack space for reentrant functions in the SMALL model.
IBPSTACK EQU 0 ; set to 1 if small reentrant is used.
; <o> IBPSTACKTOP: End address of SMALL model stack <0x0-0xFF>
; <i> Set the top of the stack to the highest location.
IBPSTACKTOP EQU 0xFF +1 ; default 0FFH+1
; </h>
;
; <h> Stack Space for reentrant functions in the LARGE model.
; <q> XBPSTACK: Enable LARGE model reentrant stack
; <i> Stack space for reentrant functions in the LARGE model.
XBPSTACK EQU 0 ; set to 1 if large reentrant is used.
; <o> XBPSTACKTOP: End address of LARGE model stack <0x0-0xFFFF>
; <i> Set the top of the stack to the highest location.
XBPSTACKTOP EQU 0xFFFF +1 ; default 0FFFFH+1
; </h>
;
; <h> Stack Space for reentrant functions in the COMPACT model.
; <q> PBPSTACK: Enable COMPACT model reentrant stack
; <i> Stack space for reentrant functions in the COMPACT model.
PBPSTACK EQU 0 ; set to 1 if compact reentrant is used.
;
; <o> PBPSTACKTOP: End address of COMPACT model stack <0x0-0xFFFF>
; <i> Set the top of the stack to the highest location.
PBPSTACKTOP EQU 0xFF +1 ; default 0FFH+1
; </h>
;</h>
;------------------------------------------------------------------------------
;
; Memory Page for Using the Compact Model with 64 KByte xdata RAM
; <e>Compact Model Page Definition
;
; <i>Define the XDATA page used for PDATA variables.
; <i>PPAGE must conform with the PPAGE set in the linker invocation.
;
; Enable pdata memory page initalization
PPAGEENABLE EQU 0 ; set to 1 if pdata object are used.
;
; <o> PPAGE number <0x0-0xFF>
; <i> uppermost 256-byte address of the page used for PDATA variables.
PPAGE EQU 0
;
; <o> SFR address which supplies uppermost address byte <0x0-0xFF>
; <i> most 8051 variants use P2 as uppermost address byte
PPAGE_SFR DATA 0A0H
;
; </e>
;------------------------------------------------------------------------------
; Standard SFR Symbols
ACC DATA 0E0H
B DATA 0F0H
SP DATA 81H
DPL DATA 82H
DPH DATA 83H
NAME ?C_STARTUP
?C_C51STARTUP SEGMENT CODE
?STACK SEGMENT IDATA
RSEG ?STACK
DS 1
EXTRN CODE (?C_START)
PUBLIC ?C_STARTUP
CSEG AT 0
?C_STARTUP: LJMP STARTUP1
RSEG ?C_C51STARTUP
STARTUP1:
IF IDATALEN <> 0
MOV R0,#IDATALEN - 1
CLR A
IDATALOOP: MOV @R0,A
DJNZ R0,IDATALOOP
ENDIF
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
IF PPAGEENABLE <> 0
MOV PPAGE_SFR,#PPAGE
ENDIF
IF PDATALEN <> 0
MOV R0,#LOW (PDATASTART)
MOV R7,#LOW (PDATALEN)
CLR A
PDATALOOP: MOVX @R0,A
INC R0
DJNZ R7,PDATALOOP
ENDIF
IF IBPSTACK <> 0
EXTRN DATA (?C_IBP)
MOV ?C_IBP,#LOW IBPSTACKTOP
ENDIF
IF XBPSTACK <> 0
EXTRN DATA (?C_XBP)
MOV ?C_XBP,#HIGH XBPSTACKTOP
MOV ?C_XBP+1,#LOW XBPSTACKTOP
ENDIF
IF PBPSTACK <> 0
EXTRN DATA (?C_PBP)
MOV ?C_PBP,#LOW PBPSTACKTOP
ENDIF
MOV SP,#?STACK-1
; This code is required if you use L51_BANK.A51 with Banking Mode 4
;<h> Code Banking
; <q> Select Bank 0 for L51_BANK.A51 Mode 4
#if 0
; <i> Initialize bank mechanism to code bank 0 when using L51_BANK.A51 with Banking Mode 4.
EXTRN CODE (?B_SWITCH0)
CALL ?B_SWITCH0 ; init bank mechanism to code bank 0
#endif
;</h>
LJMP ?C_START
END

File diff suppressed because one or more lines are too long

197
STC8G1K08_I2C_SCAN.uvopt Normal file
View File

@ -0,0 +1,197 @@
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<ProjectOpt xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_opt.xsd">
<SchemaVersion>1.0</SchemaVersion>
<Header>### uVision Project, (C) Keil Software</Header>
<Extensions>
<cExt>*.c</cExt>
<aExt>*.s*; *.src; *.a*</aExt>
<oExt>*.obj; *.o</oExt>
<lExt>*.lib</lExt>
<tExt>*.txt; *.h; *.inc; *.md</tExt>
<pExt>*.plm</pExt>
<CppX>*.cpp; *.cc; *.cxx</CppX>
<nMigrate>0</nMigrate>
</Extensions>
<DaveTm>
<dwLowDateTime>0</dwLowDateTime>
<dwHighDateTime>0</dwHighDateTime>
</DaveTm>
<Target>
<TargetName>Target_1</TargetName>
<ToolsetNumber>0x0</ToolsetNumber>
<ToolsetName>MCS-51</ToolsetName>
<TargetOption>
<CLK51>35000000</CLK51>
<OPTTT>
<gFlags>1</gFlags>
<BeepAtEnd>1</BeepAtEnd>
<RunSim>1</RunSim>
<RunTarget>0</RunTarget>
<RunAbUc>0</RunAbUc>
</OPTTT>
<OPTHX>
<HexSelection>0</HexSelection>
<FlashByte>65535</FlashByte>
<HexRangeLowAddress>0</HexRangeLowAddress>
<HexRangeHighAddress>0</HexRangeHighAddress>
<HexOffset>0</HexOffset>
</OPTHX>
<OPTLEX>
<PageWidth>120</PageWidth>
<PageLength>65</PageLength>
<TabStop>8</TabStop>
<ListingPath>.\Listings\</ListingPath>
</OPTLEX>
<ListingPage>
<CreateCListing>1</CreateCListing>
<CreateAListing>1</CreateAListing>
<CreateLListing>1</CreateLListing>
<CreateIListing>0</CreateIListing>
<AsmCond>1</AsmCond>
<AsmSymb>1</AsmSymb>
<AsmXref>0</AsmXref>
<CCond>1</CCond>
<CCode>0</CCode>
<CListInc>0</CListInc>
<CSymb>0</CSymb>
<LinkerCodeListing>0</LinkerCodeListing>
</ListingPage>
<OPTXL>
<LMap>1</LMap>
<LComments>1</LComments>
<LGenerateSymbols>1</LGenerateSymbols>
<LLibSym>1</LLibSym>
<LLines>1</LLines>
<LLocSym>1</LLocSym>
<LPubSym>1</LPubSym>
<LXref>0</LXref>
<LExpSel>0</LExpSel>
</OPTXL>
<OPTFL>
<tvExp>1</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<IsCurrentTarget>1</IsCurrentTarget>
</OPTFL>
<CpuCode>255</CpuCode>
<DebugOpt>
<uSim>1</uSim>
<uTrg>0</uTrg>
<sLdApp>1</sLdApp>
<sGomain>1</sGomain>
<sRbreak>1</sRbreak>
<sRwatch>1</sRwatch>
<sRmem>1</sRmem>
<sRfunc>1</sRfunc>
<sRbox>1</sRbox>
<tLdApp>1</tLdApp>
<tGomain>0</tGomain>
<tRbreak>1</tRbreak>
<tRwatch>1</tRwatch>
<tRmem>1</tRmem>
<tRfunc>0</tRfunc>
<tRbox>1</tRbox>
<tRtrace>1</tRtrace>
<sRSysVw>1</sRSysVw>
<tRSysVw>1</tRSysVw>
<sRunDeb>0</sRunDeb>
<sLrtime>0</sLrtime>
<bEvRecOn>1</bEvRecOn>
<bSchkAxf>0</bSchkAxf>
<bTchkAxf>0</bTchkAxf>
<nTsel>-1</nTsel>
<sDll></sDll>
<sDllPa></sDllPa>
<sDlgDll></sDlgDll>
<sDlgPa></sDlgPa>
<sIfile></sIfile>
<tDll></tDll>
<tDllPa></tDllPa>
<tDlgDll></tDlgDll>
<tDlgPa></tDlgPa>
<tIfile></tIfile>
<pMon></pMon>
</DebugOpt>
<Breakpoint/>
<Tracepoint>
<THDelay>0</THDelay>
</Tracepoint>
<DebugFlag>
<trace>0</trace>
<periodic>1</periodic>
<aLwin>0</aLwin>
<aCover>0</aCover>
<aSer1>0</aSer1>
<aSer2>0</aSer2>
<aPa>0</aPa>
<viewmode>0</viewmode>
<vrSel>0</vrSel>
<aSym>0</aSym>
<aTbox>0</aTbox>
<AscS1>0</AscS1>
<AscS2>0</AscS2>
<AscS3>0</AscS3>
<aSer3>0</aSer3>
<eProf>0</eProf>
<aLa>0</aLa>
<aPa1>0</aPa1>
<AscS4>0</AscS4>
<aSer4>0</aSer4>
<StkLoc>0</StkLoc>
<TrcWin>0</TrcWin>
<newCpu>0</newCpu>
<uProt>0</uProt>
</DebugFlag>
<LintExecutable></LintExecutable>
<LintConfigFile></LintConfigFile>
<bLintAuto>0</bLintAuto>
<bAutoGenD>0</bAutoGenD>
<LntExFlags>0</LntExFlags>
<pMisraName></pMisraName>
<pszMrule></pszMrule>
<pSingCmds></pSingCmds>
<pMultCmds></pMultCmds>
<pMisraNamep></pMisraNamep>
<pszMrulep></pszMrulep>
<pSingCmdsp></pSingCmdsp>
<pMultCmdsp></pMultCmdsp>
</TargetOption>
</Target>
<Group>
<GroupName>Source Group 1</GroupName>
<tvExp>1</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<cbSel>0</cbSel>
<RteFlg>0</RteFlg>
<File>
<GroupNumber>1</GroupNumber>
<FileNumber>1</FileNumber>
<FileType>2</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>.\STARTUP.A51</PathWithFileName>
<FilenameWithoutPath>STARTUP.A51</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>1</GroupNumber>
<FileNumber>2</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>.\main.c</PathWithFileName>
<FilenameWithoutPath>main.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
</Group>
</ProjectOpt>

395
STC8G1K08_I2C_SCAN.uvproj Normal file
View File

@ -0,0 +1,395 @@
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<Project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="project_proj.xsd">
<SchemaVersion>1.1</SchemaVersion>
<Header>### uVision Project, (C) Keil Software</Header>
<Targets>
<Target>
<TargetName>Target_1</TargetName>
<ToolsetNumber>0x0</ToolsetNumber>
<ToolsetName>MCS-51</ToolsetName>
<uAC6>0</uAC6>
<TargetOption>
<TargetCommonOption>
<Device>STC8G1K08 Series</Device>
<Vendor>STC</Vendor>
<Cpu>IRAM(0-0xFF) XRAM(0-0x03FF) IROM(0-0x1FF8) CLOCK(35000000)</Cpu>
<FlashUtilSpec></FlashUtilSpec>
<StartupFile>"LIB\STARTUP.A51" ("Standard 8051 Startup Code")</StartupFile>
<FlashDriverDll></FlashDriverDll>
<DeviceId>63316</DeviceId>
<RegisterFile>STC8G.H</RegisterFile>
<MemoryEnv></MemoryEnv>
<Cmp></Cmp>
<Asm></Asm>
<Linker></Linker>
<OHString></OHString>
<InfinionOptionDll></InfinionOptionDll>
<SLE66CMisc></SLE66CMisc>
<SLE66AMisc></SLE66AMisc>
<SLE66LinkerMisc></SLE66LinkerMisc>
<SFDFile></SFDFile>
<bCustSvd>0</bCustSvd>
<UseEnv>0</UseEnv>
<BinPath></BinPath>
<IncludePath></IncludePath>
<LibPath></LibPath>
<RegisterFilePath>STC\</RegisterFilePath>
<DBRegisterFilePath>STC\</DBRegisterFilePath>
<TargetStatus>
<Error>0</Error>
<ExitCodeStop>0</ExitCodeStop>
<ButtonStop>0</ButtonStop>
<NotGenerated>0</NotGenerated>
<InvalidFlash>1</InvalidFlash>
</TargetStatus>
<OutputDirectory>.\Objects\</OutputDirectory>
<OutputName>STC8G1K08_I2C_SCAN</OutputName>
<CreateExecutable>1</CreateExecutable>
<CreateLib>0</CreateLib>
<CreateHexFile>1</CreateHexFile>
<DebugInformation>1</DebugInformation>
<BrowseInformation>1</BrowseInformation>
<ListingPath>.\Listings\</ListingPath>
<HexFormatSelection>0</HexFormatSelection>
<Merge32K>0</Merge32K>
<CreateBatchFile>0</CreateBatchFile>
<BeforeCompile>
<RunUserProg1>0</RunUserProg1>
<RunUserProg2>0</RunUserProg2>
<UserProg1Name></UserProg1Name>
<UserProg2Name></UserProg2Name>
<UserProg1Dos16Mode>0</UserProg1Dos16Mode>
<UserProg2Dos16Mode>0</UserProg2Dos16Mode>
<nStopU1X>0</nStopU1X>
<nStopU2X>0</nStopU2X>
</BeforeCompile>
<BeforeMake>
<RunUserProg1>0</RunUserProg1>
<RunUserProg2>0</RunUserProg2>
<UserProg1Name></UserProg1Name>
<UserProg2Name></UserProg2Name>
<UserProg1Dos16Mode>0</UserProg1Dos16Mode>
<UserProg2Dos16Mode>0</UserProg2Dos16Mode>
<nStopB1X>0</nStopB1X>
<nStopB2X>0</nStopB2X>
</BeforeMake>
<AfterMake>
<RunUserProg1>0</RunUserProg1>
<RunUserProg2>0</RunUserProg2>
<UserProg1Name></UserProg1Name>
<UserProg2Name></UserProg2Name>
<UserProg1Dos16Mode>0</UserProg1Dos16Mode>
<UserProg2Dos16Mode>0</UserProg2Dos16Mode>
<nStopA1X>0</nStopA1X>
<nStopA2X>0</nStopA2X>
</AfterMake>
<SelectedForBatchBuild>0</SelectedForBatchBuild>
<SVCSIdString></SVCSIdString>
</TargetCommonOption>
<CommonProperty>
<UseCPPCompiler>0</UseCPPCompiler>
<RVCTCodeConst>0</RVCTCodeConst>
<RVCTZI>0</RVCTZI>
<RVCTOtherData>0</RVCTOtherData>
<ModuleSelection>0</ModuleSelection>
<IncludeInBuild>1</IncludeInBuild>
<AlwaysBuild>0</AlwaysBuild>
<GenerateAssemblyFile>0</GenerateAssemblyFile>
<AssembleAssemblyFile>0</AssembleAssemblyFile>
<PublicsOnly>0</PublicsOnly>
<StopOnExitCode>3</StopOnExitCode>
<CustomArgument></CustomArgument>
<IncludeLibraryModules></IncludeLibraryModules>
<ComprImg>1</ComprImg>
<BankNo>65535</BankNo>
</CommonProperty>
<DllOption>
<SimDllName>S8051.DLL</SimDllName>
<SimDllArguments></SimDllArguments>
<SimDlgDll>DP51.DLL</SimDlgDll>
<SimDlgDllArguments>-pDP8051</SimDlgDllArguments>
<TargetDllName>S8051.DLL</TargetDllName>
<TargetDllArguments></TargetDllArguments>
<TargetDlgDll>TP51.DLL</TargetDlgDll>
<TargetDlgDllArguments>-p51</TargetDlgDllArguments>
</DllOption>
<DebugOption>
<OPTHX>
<HexSelection>0</HexSelection>
<HexRangeLowAddress>0</HexRangeLowAddress>
<HexRangeHighAddress>0</HexRangeHighAddress>
<HexOffset>0</HexOffset>
<Oh166RecLen>16</Oh166RecLen>
</OPTHX>
<Simulator>
<UseSimulator>1</UseSimulator>
<LoadApplicationAtStartup>1</LoadApplicationAtStartup>
<RunToMain>1</RunToMain>
<RestoreBreakpoints>1</RestoreBreakpoints>
<RestoreWatchpoints>1</RestoreWatchpoints>
<RestoreMemoryDisplay>1</RestoreMemoryDisplay>
<RestoreFunctions>1</RestoreFunctions>
<RestoreToolbox>1</RestoreToolbox>
<LimitSpeedToRealTime>0</LimitSpeedToRealTime>
<RestoreSysVw>1</RestoreSysVw>
</Simulator>
<Target>
<UseTarget>0</UseTarget>
<LoadApplicationAtStartup>1</LoadApplicationAtStartup>
<RunToMain>0</RunToMain>
<RestoreBreakpoints>1</RestoreBreakpoints>
<RestoreWatchpoints>1</RestoreWatchpoints>
<RestoreMemoryDisplay>1</RestoreMemoryDisplay>
<RestoreFunctions>0</RestoreFunctions>
<RestoreToolbox>1</RestoreToolbox>
<RestoreTracepoints>1</RestoreTracepoints>
<RestoreSysVw>1</RestoreSysVw>
</Target>
<RunDebugAfterBuild>0</RunDebugAfterBuild>
<TargetSelection>-1</TargetSelection>
<SimDlls>
<CpuDll></CpuDll>
<CpuDllArguments></CpuDllArguments>
<PeripheralDll></PeripheralDll>
<PeripheralDllArguments></PeripheralDllArguments>
<InitializationFile></InitializationFile>
</SimDlls>
<TargetDlls>
<CpuDll></CpuDll>
<CpuDllArguments></CpuDllArguments>
<PeripheralDll></PeripheralDll>
<PeripheralDllArguments></PeripheralDllArguments>
<InitializationFile></InitializationFile>
<Driver></Driver>
</TargetDlls>
</DebugOption>
<Utilities>
<Flash1>
<UseTargetDll>0</UseTargetDll>
<UseExternalTool>0</UseExternalTool>
<RunIndependent>0</RunIndependent>
<UpdateFlashBeforeDebugging>0</UpdateFlashBeforeDebugging>
<Capability>0</Capability>
<DriverSelection>-1</DriverSelection>
</Flash1>
<bUseTDR>0</bUseTDR>
<Flash2></Flash2>
<Flash3></Flash3>
<Flash4></Flash4>
<pFcarmOut></pFcarmOut>
<pFcarmGrp></pFcarmGrp>
<pFcArmRoot></pFcArmRoot>
<FcArmLst>0</FcArmLst>
</Utilities>
<Target51>
<Target51Misc>
<MemoryModel>0</MemoryModel>
<RTOS>0</RTOS>
<RomSize>2</RomSize>
<DataHold>0</DataHold>
<XDataHold>0</XDataHold>
<UseOnchipRom>0</UseOnchipRom>
<UseOnchipArithmetic>0</UseOnchipArithmetic>
<UseMultipleDPTR>0</UseMultipleDPTR>
<UseOnchipXram>0</UseOnchipXram>
<HadIRAM>1</HadIRAM>
<HadXRAM>1</HadXRAM>
<HadIROM>1</HadIROM>
<Moda2>0</Moda2>
<Moddp2>0</Moddp2>
<Modp2>0</Modp2>
<Mod517dp>0</Mod517dp>
<Mod517au>0</Mod517au>
<Mode2>0</Mode2>
<useCB>0</useCB>
<useXB>0</useXB>
<useL251>0</useL251>
<useA251>0</useA251>
<Mx51>0</Mx51>
<ModC812>0</ModC812>
<ModCont>0</ModCont>
<Lp51>0</Lp51>
<useXBS>0</useXBS>
<ModDA>0</ModDA>
<ModAB2>0</ModAB2>
<Mx51P>0</Mx51P>
<hadXRAM2>0</hadXRAM2>
<uocXram2>0</uocXram2>
<hadXRAM3>0</hadXRAM3>
<ModC2>0</ModC2>
<ModH2>0</ModH2>
<Mdu_R515>0</Mdu_R515>
<Mdu_F120>0</Mdu_F120>
<Psoc>0</Psoc>
<hadIROM2>0</hadIROM2>
<hadIROM3>0</hadIROM3>
<ModSmx2>0</ModSmx2>
<cBanks>0</cBanks>
<xBanks>0</xBanks>
<OnChipMemories>
<RCB>
<Type>0</Type>
<StartAddress>0x0</StartAddress>
<Size>0x10000</Size>
</RCB>
<RXB>
<Type>0</Type>
<StartAddress>0x0</StartAddress>
<Size>0x0</Size>
</RXB>
<Ocm1>
<Type>0</Type>
<StartAddress>0x0</StartAddress>
<Size>0x0</Size>
</Ocm1>
<Ocm2>
<Type>0</Type>
<StartAddress>0x0</StartAddress>
<Size>0x0</Size>
</Ocm2>
<Ocm3>
<Type>0</Type>
<StartAddress>0x0</StartAddress>
<Size>0x0</Size>
</Ocm3>
<Ocr1>
<Type>0</Type>
<StartAddress>0x0</StartAddress>
<Size>0x0</Size>
</Ocr1>
<Ocr2>
<Type>0</Type>
<StartAddress>0x0</StartAddress>
<Size>0x0</Size>
</Ocr2>
<Ocr3>
<Type>0</Type>
<StartAddress>0x0</StartAddress>
<Size>0x0</Size>
</Ocr3>
<IRO>
<Type>1</Type>
<StartAddress>0x0</StartAddress>
<Size>0x1ff9</Size>
</IRO>
<IRA>
<Type>0</Type>
<StartAddress>0x0</StartAddress>
<Size>0x100</Size>
</IRA>
<XRA>
<Type>0</Type>
<StartAddress>0x0</StartAddress>
<Size>0x400</Size>
</XRA>
<XRA512>
<Type>0</Type>
<StartAddress>0x0</StartAddress>
<Size>0x0</Size>
</XRA512>
<IROM512>
<Type>0</Type>
<StartAddress>0x0</StartAddress>
<Size>0x0</Size>
</IROM512>
<XRA513>
<Type>0</Type>
<StartAddress>0x0</StartAddress>
<Size>0x0</Size>
</XRA513>
<IROM513>
<Type>0</Type>
<StartAddress>0x0</StartAddress>
<Size>0x0</Size>
</IROM513>
</OnChipMemories>
</Target51Misc>
<C51>
<RegisterColoring>0</RegisterColoring>
<VariablesInOrder>0</VariablesInOrder>
<IntegerPromotion>1</IntegerPromotion>
<uAregs>0</uAregs>
<UseInterruptVector>1</UseInterruptVector>
<Fuzzy>3</Fuzzy>
<Optimize>8</Optimize>
<WarningLevel>2</WarningLevel>
<SizeSpeed>1</SizeSpeed>
<ObjectExtend>1</ObjectExtend>
<ACallAJmp>0</ACallAJmp>
<InterruptVectorAddress>0</InterruptVectorAddress>
<VariousControls>
<MiscControls></MiscControls>
<Define></Define>
<Undefine></Undefine>
<IncludePath></IncludePath>
</VariousControls>
</C51>
<Ax51>
<UseMpl>0</UseMpl>
<UseStandard>1</UseStandard>
<UseCase>0</UseCase>
<UseMod51>0</UseMod51>
<VariousControls>
<MiscControls></MiscControls>
<Define></Define>
<Undefine></Undefine>
<IncludePath></IncludePath>
</VariousControls>
</Ax51>
<Lx51>
<useFile>0</useFile>
<linkonly>0</linkonly>
<UseMemoryFromTarget>1</UseMemoryFromTarget>
<CaseSensitiveSymbols>0</CaseSensitiveSymbols>
<WarningLevel>2</WarningLevel>
<DataOverlaying>1</DataOverlaying>
<OverlayString></OverlayString>
<MiscControls></MiscControls>
<DisableWarningNumbers></DisableWarningNumbers>
<LinkerCmdFile></LinkerCmdFile>
<Assign></Assign>
<ReserveString></ReserveString>
<CClasses></CClasses>
<UserClasses></UserClasses>
<CSection></CSection>
<UserSection></UserSection>
<CodeBaseAddress></CodeBaseAddress>
<XDataBaseAddress></XDataBaseAddress>
<PDataBaseAddress></PDataBaseAddress>
<BitBaseAddress></BitBaseAddress>
<DataBaseAddress></DataBaseAddress>
<IDataBaseAddress></IDataBaseAddress>
<Precede></Precede>
<Stack></Stack>
<CodeSegmentName></CodeSegmentName>
<XDataSegmentName></XDataSegmentName>
<BitSegmentName></BitSegmentName>
<DataSegmentName></DataSegmentName>
<IDataSegmentName></IDataSegmentName>
</Lx51>
</Target51>
</TargetOption>
<Groups>
<Group>
<GroupName>Source Group 1</GroupName>
<Files>
<File>
<FileName>STARTUP.A51</FileName>
<FileType>2</FileType>
<FilePath>.\STARTUP.A51</FilePath>
</File>
<File>
<FileName>main.c</FileName>
<FileType>1</FileType>
<FilePath>.\main.c</FilePath>
</File>
</Files>
</Group>
</Groups>
</Target>
</Targets>
</Project>

435
UART_refer/main.c Normal file
View File

@ -0,0 +1,435 @@
/*
* main.c
* <20><><EFBFBD>ܣ<EFBFBD>ʵ<EFBFBD><CAB5>I2C<32>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD><EFBFBD><EFBFBD>LED<45><44>PWM<57><4D><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8>UART1<54><31><EFBFBD><EFBFBD>LOG<4F><47>Ϣ
* <20><><EFBFBD>ߣ<EFBFBD>
* <20><><EFBFBD>ڣ<EFBFBD>
* <20><EFBFBD><E6B1BE>1.0
*
* <20><>Ҫ<EFBFBD><D2AA><EFBFBD>ܣ<EFBFBD>
* 1. I2C<32>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD>ַΪ0x8A<38><41><EFBFBD><EFBFBD>Ӧ7λ<37><CEBB>ַ45<34><35>
* 2. ֧<>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD><E8B1B8>ַ<EFBFBD><D6B7><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* 3. <20><><EFBFBD><EFBFBD>LED<45><44><EFBFBD>أ<EFBFBD>0xCC<43>رգ<D8B1>0xDD<44>򿪣<EFBFBD>
* 4. <20><><EFBFBD><EFBFBD>PWMռ<4D>ձȣ<D5B1>0x00-0x64<36><34>Ӧ0%-100%<25><>
* 5. ͨ<><CDA8>UART1<54><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* 6. ÿ<>η<EFBFBD><CEB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD>
*/
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>ͷ<EFBFBD>ļ<EFBFBD>
#include "xtell.h" // <20><><EFBFBD><EFBFBD>LOG<4F><47><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#include "uart.h" // UART1<54><31><EFBFBD>غ<EFBFBD><D8BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#include "intrins.h" // <20>ṩ_nop_()<29><><EFBFBD><EFBFBD><EFBFBD>ú<EFBFBD><C3BA><EFBFBD>
// <20><><EFBFBD><EFBFBD>PCA<43><41><EFBFBD>ɱ<EFBFBD><C9B1>̼<EFBFBD><CCBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD>ؼĴ<D8BC><C4B4><EFBFBD>
sfr CCON = 0xd8; // PCA<43><41><EFBFBD>ƼĴ<C6BC><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڿ<EFBFBD><DABF><EFBFBD>PCAģ<41><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>к<EFBFBD><D0BA>ж<EFBFBD>
sbit CF = CCON^7; // PCA<43><41><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD>PCA<43><41><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>1
sbit CR = CCON^6; // PCA<43><41><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>п<EFBFBD><D0BF><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><31><CAB1><EFBFBD><EFBFBD>PCA<43><41><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
sbit CCF2 = CCON^2; // PCAģ<41><C4A3>2<EFBFBD>жϱ<D0B6>־<EFBFBD><D6BE><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>2<EFBFBD><32><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>ʱ<EFBFBD><CAB1>1
sbit CCF1 = CCON^1; // PCAģ<41><C4A3>1<EFBFBD>жϱ<D0B6>־<EFBFBD><D6BE><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>ʱ<EFBFBD><CAB1>1
sbit CCF0 = CCON^0; // PCAģ<41><C4A3>0<EFBFBD>жϱ<D0B6>־<EFBFBD><D6BE><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>0<EFBFBD><30><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>ʱ<EFBFBD><CAB1>1
sfr CMOD = 0xd9; // PCAģʽ<C4A3>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>PCA<43><41>ʱ<EFBFBD><CAB1>Դ<EFBFBD>͹<EFBFBD><CDB9><EFBFBD>ģʽ
sfr CL = 0xe9; // PCA<43><41><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><38><CEBB><EFBFBD>洢PCA<43><41><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>8λֵ
sfr CH = 0xf9; // PCA<43><41><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><38><CEBB><EFBFBD>洢PCA<43><41><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĸ<EFBFBD>8λֵ
sfr CCAPM1 = 0xdb; // PCAģ<41><C4A3>1<EFBFBD>Ƚ<EFBFBD>/<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƼĴ<C6BC><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>1<EFBFBD>Ĺ<EFBFBD><C4B9><EFBFBD>ģʽ
sfr CCAP1L = 0xeb; // PCAģ<41><C4A3>1<EFBFBD>Ƚ<EFBFBD>/<2F><><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><38><CEBB><EFBFBD><EFBFBD><EFBFBD>ڴ洢PWMռ<4D>ձȵĵ<C8B5>
sfr CCAP1H = 0xfb; // PCAģ<41><C4A3>1<EFBFBD>Ƚ<EFBFBD>/<2F><><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><38><CEBB><EFBFBD><EFBFBD><EFBFBD>ڴ洢PWMռ<4D>ձȵĸ<C8B5>
sfr PCA_PWM1 = 0xf3; // PCAģ<41><C4A3>1 PWM<57><4D><EFBFBD>ƼĴ<C6BC><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>PWM<57><4D><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>
// <20><><EFBFBD><EFBFBD>I2C<32><43><EFBFBD>ؼĴ<D8BC><C4B4><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>xdataָ<61><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>չSFR<46><52>
#define I2CCFG (*(unsigned char volatile xdata *)0xfe80) // I2C<32><43><EFBFBD>üĴ<C3BC><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>I2C<32>Ĺ<EFBFBD><C4B9><EFBFBD>ģʽ<C4A3>Ͳ<EFBFBD><CDB2><EFBFBD>
#define I2CMSCR (*(unsigned char volatile xdata *)0xfe81) // I2C<32><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƼĴ<C6BC><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڿ<EFBFBD><DABF><EFBFBD>I2C<32><43><EFBFBD><EFBFBD><EFBFBD>IJ<EFBFBD><C4B2><EFBFBD>
#define I2CMSST (*(unsigned char volatile xdata *)0xfe82) // I2C<32><43><EFBFBD><EFBFBD>״̬<D7B4>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָʾI2C<32><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬
#define I2CSLCR (*(unsigned char volatile xdata *)0xfe83) // I2C<32>ӻ<EFBFBD><D3BB><EFBFBD><EFBFBD>ƼĴ<C6BC><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڿ<EFBFBD><DABF><EFBFBD>I2C<32>ӻ<EFBFBD><D3BB>IJ<EFBFBD><C4B2><EFBFBD>
#define I2CSLST (*(unsigned char volatile xdata *)0xfe84) // I2C<32>ӻ<EFBFBD>״̬<D7B4>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָʾI2C<32>ӻ<EFBFBD><D3BB><EFBFBD>״̬
#define I2CSLADR (*(unsigned char volatile xdata *)0xfe85) // I2C<32>ӻ<EFBFBD><D3BB><EFBFBD>ַ<EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>I2C<32>ӻ<EFBFBD><D3BB>ĵ<EFBFBD>ַ
#define I2CTXD (*(unsigned char volatile xdata *)0xfe86) // I2C<32><43><EFBFBD>ݷ<EFBFBD><DDB7>ͼĴ<CDBC><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڷ<EFBFBD><DAB7><EFBFBD>I2C<32><43><EFBFBD><EFBFBD>
#define I2CRXD (*(unsigned char volatile xdata *)0xfe87) // I2C<32><43><EFBFBD>ݽ<EFBFBD><DDBD>ռĴ<D5BC><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڽ<EFBFBD><DABD><EFBFBD>I2C<32><43><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>I2C<32>¼<EFBFBD><C2BC><EFBFBD>־λ
#define I2C_EVENT_START 0x40 // START<52>¼<EFBFBD><C2BC><EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⵽I2C START<52>ź<EFBFBD>ʱ<EFBFBD><CAB1>1
#define I2C_EVENT_RECV 0x20 // RECV<43>¼<EFBFBD><C2BC><EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD>I2C<32><43><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>1
#define I2C_EVENT_SEND 0x10 // SEND<4E>¼<EFBFBD><C2BC><EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>I2C<32><43><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>1
#define I2C_EVENT_STOP 0x08 // STOP<4F>¼<EFBFBD><C2BC><EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⵽I2C STOP<4F>ź<EFBFBD>ʱ<EFBFBD><CAB1>1
// <20><><EFBFBD><EFBFBD>I2C<32>ӻ<EFBFBD><D3BB><EFBFBD>ַ<EFBFBD><D6B7>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><E6B4A2>ַ
#define I2C_SLAVE_ADDR 0x5A // I2C<32>ӻ<EFBFBD><D3BB><EFBFBD>ַ,<2C><>Ӧ7λ2D
// #define I2C_SLAVE_ADDR 0x8A // I2C<32>ӻ<EFBFBD><D3BB><EFBFBD>ַ,<2C><>Ӧ7λ45
#define REG_ADDR 0x86 // Լ<><D4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><EFBFBD><E6B4A2>ַ<EFBFBD><D6B7>ֻ<EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD>յ<EFBFBD><D5B5>ļĴ<C4BC><C4B4><EFBFBD><EFBFBD><EFBFBD>ַΪ0x86ʱ<36>Ž<EFBFBD><C5BD><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// ȫ<>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
unsigned char xdata buffer[64]; // I2C<32><43><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ洢<DAB4><E6B4A2><EFBFBD>յ<EFBFBD><D5B5><EFBFBD>I2C<32><43><EFBFBD>ݣ<EFBFBD>ʹ<EFBFBD><CAB9>xdata<74><EFBFBD>Խ<EFBFBD>ʡdata<74>οռ<CEBF>
unsigned char data_len; // <20><><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
unsigned char recv_reg_addr_global; // <20><EFBFBD><E6B4A2><EFBFBD>յ<EFBFBD><D5B5>ļĴ<C4BC><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
bit isda; // <20><EFBFBD><E8B1B8>ַ<EFBFBD><D6B7>־<EFBFBD><D6BE>Ϊ1ʱ<31><CAB1>ʾ<EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8>ַ
bit isma; // <20><EFBFBD><E6B4A2>ַ<EFBFBD><D6B7>־<EFBFBD><D6BE>Ϊ1ʱ<31><CAB1>ʾ<EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>մ洢<D5B4><E6B4A2>ַ
bit is_header_received; // ֡ͷ<D6A1><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD><D6BE>Ϊ1ʱ<31><CAB1>ʾ<EFBFBD>ѽ<EFBFBD><D1BD>յ<EFBFBD>֡ͷ0xAA
// <20><>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD>ӡ<EFBFBD><D3A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6>ڴ<EFBFBD><DAB4>ں<EFBFBD>ʱ<EFBFBD><CAB1>
unsigned char xdata log_buffer[128]; // <20><>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ洢<DAB4><E6B4A2>Ҫͨ<D2AA><CDA8>UART1<54><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD>
unsigned char log_idx = 0; // <20><>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָʾ<D6B8><CABE>ǰ<EFBFBD><C7B0>־<EFBFBD><D6BE><EFBFBD>ݴ洢<DDB4><E6B4A2>λ<EFBFBD><CEBB>
unsigned char buffer_idx; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>׷<EFBFBD>ٵ<EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD>ݴ洢λ<E6B4A2><CEBB>
/**
* @brief <20><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>500ms<6D><73>
* @details ʵ<><CAB5>Լ500ms<6D><73><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>11.0592MHz<EFBFBD><EFBFBD>ϵͳʱ<EFBFBD><EFBFBD>
* @param <20><>
* @return <20><>
*/
void Delay500ms(void) // @11.0592MHz
{
unsigned char data i, j, k; // <20><><EFBFBD><EFBFBD><EFBFBD>ֲ<EFBFBD><D6B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
_nop_(); // ִ<><D6B4>һ<EFBFBD><D2BB><EFBFBD>ղ<EFBFBD><D5B2><EFBFBD>ָ<EFBFBD><EFBFBD><EEA3AC><EFBFBD><EFBFBD>΢<EFBFBD><CEA2><EFBFBD><EFBFBD>ʱʱ<CAB1><CAB1>
_nop_(); // ִ<><D6B4>һ<EFBFBD><D2BB><EFBFBD>ղ<EFBFBD><D5B2><EFBFBD>ָ<EFBFBD><EFBFBD><EEA3AC><EFBFBD><EFBFBD>΢<EFBFBD><CEA2><EFBFBD><EFBFBD>ʱʱ<CAB1><CAB1>
i = 22; // <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>i
j = 3; // <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>j
k = 227; // <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>k
do { // <20><><EFBFBD><EFBFBD>do-whileѭ<65><D1AD>
do { // <20>в<EFBFBD>do-whileѭ<65><D1AD>
while (--k); // <20>ڲ<EFBFBD>whileѭ<65><D1AD><EFBFBD><EFBFBD>k<EFBFBD><6B>227<32>ݼ<EFBFBD><DDBC><EFBFBD>0
} while (--j); // <20>в<EFBFBD>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD>j<EFBFBD><6A>3<EFBFBD>ݼ<EFBFBD><DDBC><EFBFBD>0
} while (--i); // <20><><EFBFBD><EFBFBD>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD>i<EFBFBD><69>22<32>ݼ<EFBFBD><DDBC><EFBFBD>0
}
/**
* @brief <20><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>30ms<6D><73>
* @details ʵ<><CAB5>Լ30ms<6D><73><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>11.0592MHz<EFBFBD><EFBFBD>ϵͳʱ<EFBFBD><EFBFBD>
* @param <20><>
* @return <20><>
*/
void Delay30ms(void) // @11.0592MHz
{
unsigned char data i, j, k; // <20><><EFBFBD><EFBFBD><EFBFBD>ֲ<EFBFBD><D6B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
_nop_(); // ִ<><D6B4>һ<EFBFBD><D2BB><EFBFBD>ղ<EFBFBD><D5B2><EFBFBD>ָ<EFBFBD><EFBFBD><EEA3AC><EFBFBD><EFBFBD>΢<EFBFBD><CEA2><EFBFBD><EFBFBD>ʱʱ<CAB1><CAB1>
_nop_(); // ִ<><D6B4>һ<EFBFBD><D2BB><EFBFBD>ղ<EFBFBD><D5B2><EFBFBD>ָ<EFBFBD><EFBFBD><EEA3AC><EFBFBD><EFBFBD>΢<EFBFBD><CEA2><EFBFBD><EFBFBD>ʱʱ<CAB1><CAB1>
i = 2; // <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>i
j = 175; // <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>j
k = 220; // <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>k
do { // <20><><EFBFBD><EFBFBD>do-whileѭ<65><D1AD>
do { // <20>в<EFBFBD>do-whileѭ<65><D1AD>
while (--k); // <20>ڲ<EFBFBD>whileѭ<65><D1AD><EFBFBD><EFBFBD>k<EFBFBD><6B>220<32>ݼ<EFBFBD><DDBC><EFBFBD>0
} while (--j); // <20>в<EFBFBD>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD>j<EFBFBD><6A>175<37>ݼ<EFBFBD><DDBC><EFBFBD>0
} while (--i); // <20><><EFBFBD><EFBFBD>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD>i<EFBFBD><69>2<EFBFBD>ݼ<EFBFBD><DDBC><EFBFBD>0
}
void Delay10us(void) //@11.0592MHz
{
unsigned char data i;
i = 35;
while (--i);
}
/**
* @brief Ӳ<><D3B2><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @details <20><><EFBFBD><EFBFBD>GPIOģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD>ø<EFBFBD><C3B8><EFBFBD><EFBFBD>ŵĹ<C5B5><C4B9><EFBFBD>ģʽ
* @param <20><>
* @return <20><>
*/
void HardwareInit(void)
{
// <20><><EFBFBD><EFBFBD>GPIOģʽ
// P1.0:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>BL_PWM<57><4D>, P1.2:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>LED<45><44>, P1.1:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>루TP_INT<4E><54>
// P1.3:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>EN_6211<31><31>, P1.6:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>EN_DISP<53><50>
P1M0 = 0x4d; // P1<50><31>ģʽ<C4A3><CABD><EFBFBD>ƼĴ<C6BC><C4B4><EFBFBD>0<EFBFBD><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD>P1.0<EFBFBD><EFBFBD>P1.2<EFBFBD><EFBFBD>P1.3<EFBFBD><EFBFBD>P1.6Ϊ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
P1M1 = 0x02; // P1<50><31>ģʽ<C4A3><CABD><EFBFBD>ƼĴ<C6BC><C4B4><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>P1.1Ϊ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// P3.2:SCL, P3.3:SDA, P3.4:BL_EN(<28><><EFBFBD><EFBFBD>), P3.7:TP_SHUTDOWN(<28><><EFBFBD><EFBFBD>)
P3M0 = 0xb0; // P3<50><33>ģʽ<C4A3><CABD><EFBFBD>ƼĴ<C6BC><C4B4><EFBFBD>0<EFBFBD><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD>P3.4<EFBFBD><EFBFBD>P3.7Ϊ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
P3M1 = 0x00; // P3<50><33>ģʽ<C4A3><CABD><EFBFBD>ƼĴ<C6BC><C4B4><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ׼˫<D7BC><CBAB><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĭ<EFBFBD><C4AC>׼˫<D7BC><CBAB>
P5M0 = 0x00; // P5<50><35>ģʽ<C4A3><CABD><EFBFBD>ƼĴ<C6BC><C4B4><EFBFBD>0<EFBFBD><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΪĬ<CEAA><C4AC>׼˫<D7BC><CBAB><EFBFBD><EFBFBD>
P5M1 = 0x00; // P5<50><35>ģʽ<C4A3><CABD><EFBFBD>ƼĴ<C6BC><C4B4><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΪĬ<CEAA><C4AC>׼˫<D7BC><CBAB><EFBFBD><EFBFBD>
}
/**
* @brief PWM<57><4D>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @details <20><>ʼ<EFBFBD><CABC>PCAģ<41><EFBFBD><E9A3AC><EFBFBD><EFBFBD>PWM<57><4D><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڿ<EFBFBD><DABF><EFBFBD>LED<45><44><EFBFBD>Ȼ<EFBFBD><C8BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param <20><>
* @return <20><>
*/
void PWMInit()
{
CCON = 0x00; // <20><><EFBFBD><EFBFBD>PCA<43><41><EFBFBD>ƼĴ<C6BC><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD>־λ
CMOD = 0x08; // PCAʱ<41><CAB1>Ϊϵͳʱ<CDB3>ӣ<EFBFBD><D3A3><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD>ⲿ<EFBFBD><E2B2BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
CL = 0x00; // <20><><EFBFBD><EFBFBD>PCA<43><41><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CH = 0x00; // <20><><EFBFBD><EFBFBD>PCA<43><41><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CCAPM1 = 0x42; // PCAģ<41><C4A3>1ΪPWM<57><4D><EFBFBD><EFBFBD>ģʽ<C4A3><CABD>ʹ<EFBFBD>ܱȽ<DCB1><C8BD><EFBFBD>
PCA_PWM1 = 0x00; // PCAģ<41><C4A3>1<EFBFBD><31><EFBFBD><EFBFBD>8λPWM<57><4D><EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD>Ϊ256<35><36>
CCAP1L = 0x80; // PWMռ<4D>ձ<EFBFBD>Ϊ50% [(0xFF - 0x80) / 0xFF]
CCAP1H = 0x80; // <20><>CCAP1L<31><4C><EFBFBD><EFBFBD>һ<EFBFBD>£<EFBFBD>ȷ<EFBFBD><C8B7>PWMռ<4D>ձ<EFBFBD><D5B1><EFBFBD>ȷ
CR = 1; // <20><><EFBFBD><EFBFBD>PCA<43><41>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼPWM<57><4D><EFBFBD><EFBFBD>
}
/**
* @brief I2C<32><43>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @details <20><><EFBFBD><EFBFBD>I2C<32>ӻ<EFBFBD>ģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD>ôӻ<C3B4><D3BB><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>ж<EFBFBD>
* @param <20><>
* @return <20><>
*/
void I2CInit()
{
// <20><><EFBFBD><EFBFBD>I2C<32><43><EFBFBD><EFBFBD>ӳ<EFBFBD><D3B3>ΪP3.2(SCL)/P3.3(SDA)
P_SW2 = 0x30; // <20><><EFBFBD><EFBFBD>P_SW2Ϊ0x30<33><30>ѡ<EFBFBD><D1A1>SCL_4/P3.2, SDA_4/P3.3
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>չRAM<41><4D><EFBFBD><EFBFBD>ģʽ<C4A3><CABD><EFBFBD>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD><EFBFBD>I2C<32><43><EFBFBD>ؼĴ<D8BC><C4B4><EFBFBD>
P_SW2 |= 0x80;
// <20><><EFBFBD><EFBFBD>I2C<32>ӻ<EFBFBD>ģʽ
I2CCFG = 0x81; // ʹ<><CAB9>I2C<32>ӻ<EFBFBD>ģʽ<C4A3><CABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>SCLʱ<4C><CAB1>Ϊϵͳʱ<CDB3><CAB1>/16
I2CSLADR = I2C_SLAVE_ADDR; // <20><><EFBFBD>ôӻ<C3B4><D3BB><EFBFBD><E8B1B8>ַΪ8A
I2CSLST = 0x00; // <20><><EFBFBD><EFBFBD><EFBFBD>ӻ<EFBFBD>״̬<D7B4>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬<D7B4><CCAC>־
I2CSLCR = 0x78; // ʹ<>ܴӻ<DCB4>ģʽ<C4A3>жϣ<D0B6><CFA3><EFBFBD><EFBFBD><EFBFBD>START<52><54>STOP<4F><50>RECV<43><56>SEND<4E>¼<EFBFBD><C2BC>ж<EFBFBD>
// <20>˳<EFBFBD><CBB3><EFBFBD>չRAM<41><4D><EFBFBD><EFBFBD>ģʽ
P_SW2 &= ~0x80;
// ȫ<><C8AB><EFBFBD>ж<EFBFBD>ʹ<EFBFBD><CAB9>
EA = 1;
// <20><>ʼ<EFBFBD><CABC><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD>
isda = 1; // <20><EFBFBD><E8B1B8>ַ<EFBFBD><D6B7>־<EFBFBD><D6BE>1<EFBFBD><31><EFBFBD><EFBFBD>ʾ<EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8>ַ
isma = 1; // <20><EFBFBD><E6B4A2>ַ<EFBFBD><D6B7>־<EFBFBD><D6BE>1<EFBFBD><31><EFBFBD><EFBFBD>ʾ<EFBFBD>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>մ洢<D5B4><E6B4A2>ַ
is_header_received = 0; // ֡ͷ<D6A1><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD><D6BE>0<EFBFBD><30>δ<EFBFBD><CEB4><EFBFBD>յ<EFBFBD>֡ͷ<D6A1><CDB7>
buffer_idx = 0; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>Ϊ0<CEAA><30>ָ<EFBFBD>򻺳<EFBFBD><F2BBBAB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼλ<CABC><CEBB>
data_len = 0; // <20><><EFBFBD>ݳ<EFBFBD><DDB3>ȳ<EFBFBD>ʼ<EFBFBD><CABC>Ϊ0
I2CTXD = buffer[buffer_idx]; // <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD>ͼĴ<CDBC><C4B4><EFBFBD><EFBFBD><EFBFBD>׼<EFBFBD><D7BC><EFBFBD><EFBFBD><EFBFBD>͵<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
/**
* @brief <20><><EFBFBD><EFBFBD>PWMռ<4D>ձȺ<D5B1><C8BA><EFBFBD>
* @details <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ռ<EFBFBD>ձȣ<D5B1>0-100<30><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD>PWM<57><4D><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڿ<EFBFBD><DABF><EFBFBD>LED<45><44><EFBFBD>Ȼ<EFBFBD><C8BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param duty_cycle ռ<>ձȣ<D5B1><C8A3><EFBFBD>Χ0-100
* @return <20><>
*/
void SetPWM(unsigned char duty_cycle)
{
unsigned char ccap_value; // <20><><EFBFBD>ڴ洢<DAB4><E6B4A2><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD><C3B5><EFBFBD>CCAPֵ
unsigned char pwm_duty; // <20><><EFBFBD>ڴ洢<DAB4><E6B4A2><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD><C3B5><EFBFBD>ռ<EFBFBD>ձȰٷֱ<D9B7>
// <20><>0x00-0xFFӳ<46>䵽0-100%<25><>ռ<EFBFBD>ձ<EFBFBD>
pwm_duty = (duty_cycle * 100) / 255;
// <20><><EFBFBD><EFBFBD>CCAPֵ<50><D6B5>ccap_value = 255 - (ռ<>ձ<EFBFBD> * 255 / 100)
// <20><>ΪPCA<43><41>PWM<57><4D><EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD>CCAPֵ<50><D6B5>ʼΪ<CABC>ߵ<EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD>255ʱ<35><CAB1>Ϊ<EFBFBD>͵<EFBFBD>ƽ
ccap_value = 255 - ((unsigned int)pwm_duty * 255 / 100);
// <20><><EFBFBD><EFBFBD>PWMռ<4D>ձȣ<D5B1>ͬʱ<CDAC><CAB1><EFBFBD><EFBFBD>CCAP1L<31><4C>CCAP1H<31><48>ȷ<EFBFBD><C8B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵһ<D6B5><D2BB>
CCAP1L = ccap_value;
CCAP1H = ccap_value;
}
/**
* @brief I2C<32>жϴ<D0B6><CFB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޸<EFBFBD><DEB8><EFBFBD>־λ+<2B><EFBFBD><E6B4A2>ַУ<D6B7>
* @details <20><><EFBFBD><EFBFBD>I2C<32><43><EFBFBD><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD>START<52><54>RECV<43><56>SEND<4E><44>STOP<4F><50>ʵ<EFBFBD><CAB5>I2C<32>ӻ<EFBFBD><D3BB><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD>߼<EFBFBD>
* @param <20><>
* @return <20><>
*/
void I2C_Isr() interrupt 24
{
// <20><><EFBFBD><EFBFBD><EFBFBD>ֲ<EFBFBD><D6B2><EFBFBD><EFBFBD><EFBFBD>
unsigned char i; // <20><><EFBFBD><EFBFBD>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
unsigned char recv_dev_addr; // <20><><EFBFBD>ڴ洢<DAB4><E6B4A2><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><E8B1B8>ַ
unsigned char recv_reg_addr; // <20><><EFBFBD>ڴ洢<DAB4><E6B4A2><EFBFBD>յ<EFBFBD><D5B5>ļĴ<C4BC><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ
unsigned char recv_data; // <20><><EFBFBD>ڴ洢<DAB4><E6B4A2><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD>P_SW2<57>Ĵ<EFBFBD><C4B4><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD>Ա<EFBFBD><D4B1>ں<EFBFBD><DABA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>ָ<EFBFBD>
_push_(P_SW2);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>չRAM<41><4D><EFBFBD><EFBFBD>ģʽ<C4A3><CABD><EFBFBD>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD><EFBFBD>I2C<32><43><EFBFBD>ؼĴ<D8BC><C4B4><EFBFBD>
P_SW2 |= 0x80;
// <20><><EFBFBD><EFBFBD>START<52>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⵽I2C START<52>ź<EFBFBD>ʱִ<CAB1><D6B4>
if (I2CSLST & I2C_EVENT_START)
{
I2CSLST &= ~I2C_EVENT_START; // <20><><EFBFBD><EFBFBD>START<52>¼<EFBFBD><C2BC><EFBFBD>־
is_header_received = 0; // <20><><EFBFBD><EFBFBD>֡ͷ<D6A1><CDB7>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬<D7B4><CCAC><EFBFBD><EFBFBD>
// <20><><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD><C2B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>׼<EFBFBD><D7BC>
buffer_idx = 0;
data_len = 0;
// <20><><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD>ȷ<EFBFBD><C8B7>ÿ<EFBFBD><C3BF>ͨ<EFBFBD>ſ<EFBFBD>ʼʱ<CABC><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǹɾ<C7B8><C9BE><EFBFBD>
for(i=0; i<64; i++)
{
buffer[i] = 0; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>Ϊ0
}
}
// <20><><EFBFBD><EFBFBD>RECV<43>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD>I2C<32><43><EFBFBD><EFBFBD>ʱִ<CAB1><D6B4>
else if (I2CSLST & I2C_EVENT_RECV)
{
I2CSLST &= ~I2C_EVENT_RECV; // <20><><EFBFBD><EFBFBD>RECV<43>¼<EFBFBD><C2BC><EFBFBD>־
// <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8>ַ
if (isda)
{
recv_dev_addr = I2CRXD; // <20><>ȡ<EFBFBD><EFBFBD><E8B1B8>ַ
buffer[buffer_idx++] = recv_dev_addr; // <20><><EFBFBD><EFBFBD><E8B1B8>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EBBBBA><EFBFBD><EFBFBD>
if(buffer_idx >= 63) buffer_idx = 0; // <20><>ֹ<EFBFBD><D6B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
data_len++;
isda = 0; // <20><EFBFBD><E8B1B8>ַƥ<D6B7><C6A5><EFBFBD>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8>ַ<EFBFBD><D6B7>־
}
// <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD>մ洢<D5B4><E6B4A2>ַ
else if (isma)
{
isma = 0; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E6B4A2>ַ<EFBFBD><D6B7>־
recv_reg_addr = I2CRXD; // <20><>ȡ<EFBFBD><EFBFBD><E6B4A2>ַ<EFBFBD><D6B7><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7>
recv_reg_addr_global = recv_reg_addr; // <20><><EFBFBD>浽ȫ<E6B5BD>ֱ<EFBFBD><D6B1><EFBFBD>
// <20><><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD>buffer
buffer[buffer_idx++] = recv_reg_addr; // <20>ѼĴ<D1BC><C4B4><EFBFBD><EFBFBD><EFBFBD>ַд<D6B7><D0B4>buffer<65><72><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD>ܲ<EFBFBD><DCB2><EFBFBD>
if(buffer_idx >= 63) buffer_idx = 0; // <20><>ֹ<EFBFBD><D6B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
data_len++;
// У<><D0A3><EFBFBD><EFBFBD><E6B4A2>ַ
if (recv_reg_addr == REG_ADDR)
{
// <20><>ַΪ0x96<39><36><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
else if (recv_reg_addr == 0x94 || recv_reg_addr == 0x95)
{
// <20><>ַΪ0x94<39><34>0x95<39><35>ֻ<EFBFBD><D6BB>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
else
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>ñ<EFBFBD>־λ<D6BE><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
isda = 1; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8>ַ<EFBFBD><D6B7>־
isma = 1; // <20><><EFBFBD>ô洢<C3B4><E6B4A2>ַ<EFBFBD><D6B7>־
I2CTXD = buffer[0]; // ׼<><D7BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
_pop_(P_SW2); // <20>ָ<EFBFBD>P_SW2<57>Ĵ<EFBFBD><C4B4><EFBFBD>ֵ
return; // ֱ<>ӷ<EFBFBD><D3B7>أ<EFBFBD><D8A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
I2CTXD = buffer[0]; // ׼<><D7BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
// <20><><EFBFBD>򣬽<EFBFBD><F2A3ACBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD>
else
{
recv_data = I2CRXD; // <20><>ȡ<EFBFBD><C8A1><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD><DDB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD>
buffer[buffer_idx++] = recv_data;
if(buffer_idx >= 63) buffer_idx = 0; // <20><>ֹ<EFBFBD><D6B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
data_len++;
// ֻ<>е<EFBFBD><D0B5><EFBFBD><E6B4A2>ַΪ0x96ʱ<36>Ž<EFBFBD><C5BD><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (recv_reg_addr_global == REG_ADDR)
{
// <20><><EFBFBD>ݽ<EFBFBD><DDBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>PWMռ<4D>ձȣ<D5B1>0x00-0xFF<46><46>Ӧ0-100%<25><>
SetPWM(recv_data);
}
}
}
// <20><><EFBFBD><EFBFBD>SEND<4E>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>I2C<32><43><EFBFBD><EFBFBD>ʱִ<CAB1><D6B4>
else if (I2CSLST & I2C_EVENT_SEND)
{
I2CSLST &= ~I2C_EVENT_SEND; // <20><><EFBFBD><EFBFBD>SEND<4E>¼<EFBFBD><C2BC><EFBFBD>־
// <20><><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>յ<EFBFBD>NAK<41><4B><EFBFBD>ӻ<EFBFBD>δȷ<CEB4>ϣ<EFBFBD>
if (I2CSLST & 0x02)
{
I2CTXD = 0xff; // <20><><EFBFBD>յ<EFBFBD>NAK<41><4B>ֹͣ<CDA3><D6B9><EFBFBD>ͣ<EFBFBD><CDA3><EFBFBD><EFBFBD><EFBFBD>0xff
}
else
{
static unsigned char send_idx = 0;
I2CTXD = buffer[send_idx++]; // <20><><EFBFBD>յ<EFBFBD>ACK<43><4B><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(send_idx >= data_len) send_idx = 0;
}
}
// <20><><EFBFBD><EFBFBD>STOP<4F>¼<EFBFBD><C2BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⵽I2C STOP<4F>ź<EFBFBD>ʱִ<CAB1><D6B4>
else if (I2CSLST & I2C_EVENT_STOP)
{
I2CSLST &= ~I2C_EVENT_STOP; // <20><><EFBFBD><EFBFBD>STOP<4F>¼<EFBFBD><C2BC><EFBFBD>־
// <20><><EFBFBD>ø<EFBFBD><C3B8>ֱ<EFBFBD>־λ<D6BE><CEBB>Ϊ<EFBFBD><CEAA>һ<EFBFBD><D2BB>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD>׼<EFBFBD><D7BC>
isda = 1; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E8B1B8>ַ<EFBFBD><D6B7>־
isma = 1; // <20><><EFBFBD>ô洢<C3B4><E6B4A2>ַ<EFBFBD><D6B7>־
is_header_received = 0; // <20><><EFBFBD><EFBFBD>֡ͷ<D6A1><CDB7>־
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD><DDB5><EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ա<EFBFBD><D4B1><EFBFBD>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӡ
for(i=0; i<data_len; i++)
{
log_buffer[log_idx++] = buffer[i]; // <20><><EFBFBD><EFBFBD><EFBFBD>յ<EFBFBD><D5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݸ<EFBFBD><DDB8>Ƶ<EFBFBD><C6B5><EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(log_idx >= 127) log_idx = 0; // <20><>ֹ<EFBFBD><D6B9>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
// <20><><EFBFBD>ջ<EFBFBD><D5BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD>ȷ<EFBFBD><C8B7>ÿ<EFBFBD>η<EFBFBD><CEB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϻ󻺳<CFBA><F3BBBAB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǹɾ<C7B8><C9BE><EFBFBD>
for(i=0; i<64; i++)
{
buffer[i] = 0; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD>ֽ<EFBFBD><D6BD><EFBFBD><EFBFBD><EFBFBD>Ϊ0
}
buffer_idx = 0; // <20><><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
data_len = 0; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3><EFBFBD>
}
// <20>ָ<EFBFBD>P_SW2<57>Ĵ<EFBFBD><C4B4><EFBFBD>ֵ<EFBFBD><D6B5>ȷ<EFBFBD><C8B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵͳ״̬<D7B4><CCAC>ȷ
_pop_(P_SW2);
}
/**
* @brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>޸<EFBFBD>forѭ<72><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E5A3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @details <20><>ʼ<EFBFBD><CABC>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD>ʵ<EFBFBD><CAB5>ϵͳ<CFB5><CDB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߼<EFBFBD>
* @param <20><>
* @return <20><>
*/
void main()
{
// <20><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>C51<35><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֧<EFBFBD><D6A7>ѭ<EFBFBD><D1AD><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
unsigned char i;
// Ӳ<><D3B2><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>
HardwareInit(); // <20><><EFBFBD><EFBFBD>GPIOģʽ
PWMInit(); // <20><>ʼ<EFBFBD><CABC>PWMģ<4D><C4A3>
I2CInit(); // <20><>ʼ<EFBFBD><CABC>I2C<32>ӻ<EFBFBD>ģʽ
uart1_init(); // <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>LOG<4F><47>Ϣ
SetPWM(50); // <20><>ʼ<EFBFBD><CABC>PWMռ<4D>ձ<EFBFBD>Ϊ50%
// P3.5<EFBFBD><EFBFBD>ƽ<EFBFBD>л<EFBFBD><EFBFBD>߼<EFBFBD><EFBFBD><EFBFBD>LCD_RESET<EFBFBD><EFBFBD>
P3 |= 0x20; // <20><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>P3.5
Delay30ms(); // <20>ӳ<EFBFBD>30ms
P3 &= ~0x20; // <20>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>P3.5
Delay30ms(); // <20>ӳ<EFBFBD>30ms
P3 |= 0x20; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٴ<EFBFBD><D9B4><EFBFBD><EFBFBD><EFBFBD>P3.5<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ձ<EFBFBD><EFBFBD>ָߵ<EFBFBD>ƽ<EFBFBD><EFBFBD>
// P3.7<EFBFBD><EFBFBD>ƽ<EFBFBD>л<EFBFBD><EFBFBD>߼<EFBFBD><EFBFBD><EFBFBD>TP_SHUTDOWN<EFBFBD><EFBFBD>
P3 |= 0x80; // <20><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>P3.7
Delay30ms(); // <20>ӳ<EFBFBD>30ms
P3 &= ~0x80; // <20>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>P3.7
Delay30ms(); // <20>ӳ<EFBFBD>30ms
P3 |= 0x80; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٴ<EFBFBD><D9B4><EFBFBD><EFBFBD><EFBFBD>P3.7<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ձ<EFBFBD><EFBFBD>ָߵ<EFBFBD>ƽ<EFBFBD><EFBFBD>
// LED<45><44><EFBFBD><EFBFBD><EFBFBD><EFBFBD>BL_EN<45>ø<EFBFBD>
P1 |= 0x04; // <20><><EFBFBD><EFBFBD>P1.2Ϊ<EFBFBD>ߵ<EFBFBD>ƽ<EFBFBD><EFBFBD>LED<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
P3 |= 0x10; // <20><><EFBFBD><EFBFBD>P3.4Ϊ<EFBFBD>ߵ<EFBFBD>ƽ<EFBFBD><EFBFBD>BL_EN<EFBFBD>ø<EFBFBD>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>Ϣ<EFBFBD><CFA2>ͨ<EFBFBD><CDA8>UART1<54><31><EFBFBD>͵<EFBFBD><CDB5><EFBFBD>λ<EFBFBD><CEBB>
LOG("System initialized\r\n"); // ϵͳ<CFB5><CDB3>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӡ<EFBFBD><D3A1>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD><D0B6>ڴ<EFBFBD><DAB4>ں<EFBFBD>ʱ
while (1)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if (log_idx > 0)
{
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӡ<EFBFBD><D3A1>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>i<EFBFBD><69>
for (i=0; i<log_idx; i++)
{
LOG("%c", log_buffer[i]); // <20><>ӡ<EFBFBD><D3A1>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD>ַ<EFBFBD>
}
// LOG("\n"); // <20><>ӡ<EFBFBD><D3A1><EFBFBD>з<EFBFBD><D0B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0>־<EFBFBD><D6BE>
log_idx = 0; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>׼<EFBFBD><D7BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>µ<EFBFBD><C2B5><EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD>
}
Delay10us();
}
}

21
UART_refer/uart.c Normal file
View File

@ -0,0 +1,21 @@
#include "uart.h"
#include "xtell.h"
void uart1_init(void) //115200bps@11.0592MHz
{
SCON = 0x50; //8λ<38><CEBB><EFBFBD><EFBFBD>,<2C>ɱ䲨<C9B1><E4B2A8><EFBFBD><EFBFBD>
AUXR |= 0x01; //<2F><><EFBFBD><EFBFBD>1ѡ<31><D1A1><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><32><CEAA><EFBFBD><EFBFBD><EFBFBD>ʷ<EFBFBD><CAB7><EFBFBD><EFBFBD><EFBFBD>
AUXR &= 0xFB; //<2F><>ʱ<EFBFBD><CAB1>ʱ<EFBFBD><CAB1>12Tģʽ
T2L = 0xFE; //<2F><><EFBFBD>ö<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ʼֵ
T2H = 0xFF; //<2F><><EFBFBD>ö<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ʼֵ
AUXR |= 0x10; //<2F><>ʱ<EFBFBD><CAB1>2<EFBFBD><32>ʼ<EFBFBD><CABC>ʱ
TI = 1; //STC-ISP<53>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD>ɵĴ<C9B5><C4B4><EFBFBD>,<2C>ڴ<EFBFBD><DAB4>ڳ<EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӵ<EFBFBD><D3B4>д<EFBFBD><D0B4><EFBFBD>,<2C><><EFBFBD><EFBFBD>printf<74><66><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}

6
UART_refer/uart.h Normal file
View File

@ -0,0 +1,6 @@
#ifndef __UART_H
#define __UART_H
void uart1_init(void); //115200bps@11.0592MHz
#endif

56
UART_refer/xtell.h Normal file
View File

@ -0,0 +1,56 @@
#ifndef __XTELL_H
#define __XTELL_H
#include "STC8G.h"
#include "intrins.h"
#include "reg51.h"
#include <stdio.h>
#include "helper.h"
#include "typedef.h"
#define MY_DEBUG 1
#if MY_DEBUG
#define LOG printf
#else
#define LOG printf("");
#endif
/*
#define _LOG_ENABLE
#ifdef _LOG_ENABLE
#define LOG printf
#else
#define LOG(...)
#endif
*/
#define VERSION_NUMBER "20220709-0901"
/********************************************************************/
//STC8H1K08<30><38><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӣ<EFBFBD> <20><>ȡ<EFBFBD><C8A1><EFBFBD>룺1234
//https://pan.baidu.com/s/1EfH7I16LwM0gtapMV0oONg
//STC<54><43>Ƭ<EFBFBD><C6AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
//https://view.inews.qq.com/a/20220304A00VOV00
//keil C51<35><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ:
//keil memory model:
//https://wenku.baidu.com/view/26cecb842b4ac850ad02de80d4d8d15abe23007e.html
//KEIL<49><4C><EFBFBD>Ż<EFBFBD><C5BB>ȼ<EFBFBD><C8BC><EFBFBD><EFBFBD><EFBFBD>:
//https://jingyan.baidu.com/article/546ae185d915971148f28c69.html
// Keil<69><6C>Option optimization<6F>ȼ<EFBFBD><C8BC>Ż<EFBFBD><C5BB><EFBFBD><EFBFBD><EFBFBD>:
// https://blog.csdn.net/qq_20017379/article/details/122770788
//<2F><>KEIL<49><4C><EFBFBD><EFBFBD><EFBFBD><EFBFBD>STC<54>ͺŵ<CDBA>Ƭ<EFBFBD><C6AC><EFBFBD><EFBFBD>3<EFBFBD>ַ<EFBFBD><D6B7><EFBFBD>:
//https://wenku.baidu.com/view/904916af8462caaedd3383c4bb4cf7ec4afeb6ba.html
#endif

340
main.c Normal file
View File

@ -0,0 +1,340 @@
/*
* 文件名: main.c
* 功能: STC8G1K08 I2C设备扫描器
* 描述:
* 1. 作为I2C主机扫描所有7位地址0x00-0x7F接收并记录所有应答
* 2. 每5秒自动进行一次扫描
* 3. 每次扫描完成后通过UART输出所有应答地址
* 芯片: STC8G1K08
* 系统时钟: 11.0592MHz
*/
#include "reg51.h"
#include "intrins.h"
#include <stdio.h>
/* 定义STC8G专用寄存器 */
sfr P_SW2 = 0xba; // 端口切换寄存器
sfr AUXR = 0x8e; // 辅助寄存器
sfr T2L = 0xd7; // 定时器2低字节
sfr T2H = 0xd6; // 定时器2高字节
/* 定义I2C相关寄存器使用xdata指针访问扩展SFR */
#define I2CCFG (*(unsigned char volatile xdata *)0xfe80) // I2C配置寄存器
#define I2CMSCR (*(unsigned char volatile xdata *)0xfe81) // I2C主机控制寄存器
#define I2CMSST (*(unsigned char volatile xdata *)0xfe82) // I2C主机状态寄存器
#define I2CSLCR (*(unsigned char volatile xdata *)0xfe83) // I2C从机控制寄存器
#define I2CSLST (*(unsigned char volatile xdata *)0xfe84) // I2C从机状态寄存器
#define I2CSLADR (*(unsigned char volatile xdata *)0xfe85) // I2C从机地址寄存器
#define I2CTXD (*(unsigned char volatile xdata *)0xfe86) // I2C数据发送寄存器
#define I2CRXD (*(unsigned char volatile xdata *)0xfe87) // I2C数据接收寄存器
/* 定义端口模式寄存器 */
sfr P1M1 = 0x91; // P1模式配置寄存器1
sfr P1M0 = 0x92; // P1模式配置寄存器0
/* 定义I2C引脚 */
sbit SDA = P1^4; // I2C数据线
sbit SCL = P1^5; // I2C时钟线
/* 定义LED引脚 */
sbit LED = P1^2; // 状态指示LED
/* 全局变量 */
bit busy; // I2C忙碌标志位
/**
* @brief I2C中断服务函数
* @note 用于处理I2C通信完成事件
*/
void I2C_Isr() interrupt 24 // 关键修复中断号从24改为7
{
_push_(P_SW2); // 保存P_SW2寄存器
P_SW2 |= 0x80; // 访问扩展寄存器
if (I2CMSST & 0x40) // 检查中断标志位BIT6: 主机操作完成)
{
I2CMSST &= ~0x40; // 清除中断标志
busy = 0; // 清除忙碌标志
}
_pop_(P_SW2); // 恢复P_SW2寄存器
}
/**
* @brief 延时函数
* @param ms 延时毫秒数
* @note 系统时钟11.0592MHz
*/
void Delay_ms(unsigned int ms)
{
unsigned int i, j;
for (i = 0; i < ms; i++)
{
for (j = 0; j < 1100; j++); // 修正延时参数更准确的1ms
}
}
/**
* @brief 等待I2C操作完成
*/
void I2C_Wait()
{
while(!(I2CMSST & 0x40)); // 等待中断标志置位
I2CMSST &= ~0x40; // 清除中断标志
}
/**
* @brief 发送I2C起始信号
*/
void I2C_Start()
{
busy = 1; // 设置忙碌标志
I2CMSCR = 0x81; // 发送START命令0x80=主机模式0x01=START
while (busy); // 等待操作完成
}
/**
* @brief 发送I2C数据
* @param dat 要发送的数据
*/
void I2C_SendData(unsigned char dat)
{
I2CTXD = dat; // 写数据到发送缓冲区
busy = 1; // 设置忙碌标志
I2CMSCR = 0x82; // 发送SEND命令0x80=主机模式0x02=SEND
while (busy); // 等待操作完成
}
/**
* @brief 接收I2C应答信号
*/
void I2C_RecvACK()
{
busy = 1; // 设置忙碌标志
I2CMSCR = 0x83; // 发送读ACK命令0x80=主机模式0x03=RECV ACK
while (busy); // 等待操作完成
}
/**
* @brief 发送I2C停止信号
*/
void I2C_Stop()
{
busy = 1; // 增加busy标志保持逻辑一致
I2CMSCR = 0x86; // 发送STOP命令0x80=主机模式0x06=STOP
while (busy); // 等待操作完成
}
/**
* @brief I2C初始化函数
* @note 配置P1.4为SDAP1.5为SCL设置50kHz通信速率启用中断
*/
void I2C_Init()
{
/* 配置端口模式 */
P1M0 = 0x04; // P1.2设置为推挽输出LEDP1.4和P1.5保持准双向口
P1M1 = 0x00;
/* 访问扩展寄存器 */
P_SW2 = 0x80;
/* 配置I2C参数 */
// 0xF3 = 11110011
// bit7=1: 启用I2C
// bit6=1: 主机模式
// bit5=1: 启用I2C中断关键修复开启中断
// bit4~0=0x13: MSSPEED=19计算50kHz11059200/(2*(19+4)*2)=~50kHz
I2CCFG = 0xF3;
/* 初始化I2C状态 */
I2CMSST = 0x00;
/* 启用全局中断和I2C中断 */
EA = 1; // 全局中断使能
}
/* I2C扫描缓冲区用于存储检测到的设备地址 */
unsigned char xdata i2c_scan_buffer[128]; // 7位地址最多128个
unsigned char scan_count = 0; // 扫描到的设备数量
/**
* @brief 扫描指定I2C 7位地址
* @param addr 要扫描的7位I2C地址0x00-0x7F
* @return 1表示收到应答0表示无应答
*/
bit I2C_ScanAddress(unsigned char addr)
{
bit ack_received = 0; // 应答接收标志
/* 跳过保留地址0x00通用呼叫地址 */
if (addr == 0x00)
{
return 0;
}
I2C_Start(); // 发送起始信号
I2C_SendData(addr << 1); // 7位地址左移+读写位0=写)
I2C_RecvACK(); // 接收应答信号
/* 检查是否收到ACKI2CMSST的bit1为0表示收到ACK */
if (!(I2CMSST & 0x02))
{
ack_received = 1; // 收到应答
}
I2C_Stop(); // 发送停止信号
return ack_received;
}
/**
* @brief 扫描所有I2C 7位地址0x00-0x7F
* @note 将所有应答的设备地址存储到缓冲区中
*/
void I2C_ScanAllAddresses(void)
{
unsigned char i;
scan_count = 0; // 清零扫描计数
/* 遍历所有7位I2C地址规范扫描范围 */
for (i = 0; i < 128; i++)
{
if (I2C_ScanAddress(i)) // 如果收到应答
{
/* 防止缓冲区溢出 */
if (scan_count < 128)
{
i2c_scan_buffer[scan_count++] = i; // 将7位地址存入缓冲区
}
Delay_ms(1); // 短暂延时,避免总线冲突
}
}
}
/**
* @brief UART1初始化函数
* @note 波特率115200bps系统时钟11.0592MHz
*/
void uart1_init(void)
{
SCON = 0x50; // 8位UART允许接收
AUXR |= 0x01; // 串口1选择定时器2为波特率发生器
AUXR &= 0xFB; // 定时器2时钟为12T模式
T2L = 0xFE; // 设置定时器2初值
T2H = 0xFF; // 设置定时器2初值
AUXR |= 0x10; // 启动定时器2
TI = 1; // 设置TI标志用于printf重定向
}
/**
* @brief putchar重定向函数用于printf输出
* @param c 要输出的字符
* @return 输出的字符
*/
char putchar(char c)
{
SBUF = c; // 写入发送缓冲区
while (!TI); // 等待发送完成
TI = 0; // 清除发送完成标志
return c;
}
/**
* @brief 通过UART打印I2C扫描结果
* @note 输出格式化的扫描结果,包括设备数量和地址列表
*/
void UART_PrintScanResults(void)
{
unsigned char i;
printf("\r\n=== I2C扫描结果 ===\r\n");
// printf("检测到的7位I2C设备数量: %d\r\n", scan_count);
if (scan_count > 0)
{
printf("应答地址列表7位:\r\n");
for (i = 0; i < scan_count; i++)
{
printf("0x%02X ", i2c_scan_buffer[i]); // 以十六进制格式输出7位地址
if ((i + 1) % 8 == 0) // 每8个地址换行
{
printf("\r\n");
}
}
printf("\r\n");
printf("对应发送地址8位写模式:\r\n");
for (i = 0; i < scan_count; i++)
{
printf("0x%02X ", i2c_scan_buffer[i] << 1);
if ((i + 1) % 8 == 0) // 每8个地址换行
{
printf("\r\n");
}
}
printf("\r\n");
}
else
{
printf("未检测到任何I2C设备\r\n");
}
printf("==================\r\n");
}
void Delay5000ms(void) //@11.0592MHz
{
unsigned char data i, j, k;
_nop_();
_nop_();
i = 211;
j = 30;
k = 11;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
/**
* @brief 主函数
*/
void main()
{
/* 初始化各模块 */
I2C_Init(); // 初始化I2C
uart1_init(); // 初始化UART1
LED = 0; // 点亮LED推挽输出低电平点亮
/* 输出启动信息 */
printf("\r\n");
printf("========================================\r\n");
printf(" STC8G1K08 I2C设备扫描器\r\n");
printf("========================================\r\n");
printf("系统初始化完成...\r\n");
printf("每5秒自动扫描一次I2C总线\r\n");
printf("========================================\r\n");
/* 主循环 */
while (1)
{
/* LED闪烁指示扫描开始 */
LED = 1; // 熄灭LED
Delay_ms(100);
LED = 0; // 点亮LED
printf("\r\n[开始扫描...]\r\n");
I2C_ScanAllAddresses(); // 执行I2C扫描
printf("[扫描完成]\r\n");
UART_PrintScanResults(); // 输出扫描结果
scan_count = 0; // 清零扫描计数,准备下一次扫描
Delay5000ms(); // 等待5秒后再次扫描
}
}