This commit is contained in:
moyuhai
2026-06-12 09:12:35 +08:00
commit 02f1638ef2
91 changed files with 38366 additions and 0 deletions
File diff suppressed because it is too large Load Diff
+3876
View File
File diff suppressed because it is too large Load Diff
+253
View File
@@ -0,0 +1,253 @@
A51 MACRO ASSEMBLER STARTUP 03/28/2026 16:50:50 PAGE 1
MACRO ASSEMBLER A51 V8.2.7.0
OBJECT MODULE PLACED IN .\hex\STARTUP.obj
ASSEMBLER INVOKED BY: C:\keil5\C51\BIN\A51.EXE Library\Lib\STARTUP.A51 NOMOD51 SET(SMALL) DEBUG PRINT(.\lst\STARTUP.lst)
OBJECT(.\hex\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 03/28/2026 16:50:50 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 03/28/2026 16:50:50 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 03/28/2026 16:50:50 PAGE 4
190
195 ;</h>
0009 020000 F 196 LJMP ?C_START
197
198 END
A51 MACRO ASSEMBLER STARTUP 03/28/2026 16:50:50 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)
+3875
View File
File diff suppressed because it is too large Load Diff
+157
View File
@@ -0,0 +1,157 @@
C51 COMPILER V9.60.0.0 DEBUG 03/28/2026 16:50:48 PAGE 1
C51 COMPILER V9.60.0.0, COMPILATION OF MODULE DEBUG
OBJECT MODULE PLACED IN .\hex\debug.obj
COMPILER INVOKED BY: C:\keil5\C51\BIN\C51.EXE TS_Lib\Sources\debug.c OMF2 OPTIMIZE(9,SIZE) BROWSE DEBUG PRINT(.\lst\debu
-g.lst) TABS(2) OBJECT(.\hex\debug.obj)
line level source
1 #ifndef _I2C_C_
2 #define _I2C_C_
3
4 /*********************************************************************************************************
-************/
5 #include "ca51f5_config.h"
6 #include "includes\ca51f5sfr.h"
7 #include "includes\ca51f5xsfr.h"
8 #include "includes\gpiodef_f5.h"
9 #include "Library\Includes\system_clock.h"
10 #include "Library\Includes\i2c.h"
11 /*********************************************************************************************************
-************/
12 #include "TS_Lib\Includes\ts_configuration.h"
13 #include "TS_Lib\Includes\ts_def.h"
14 #include "TS_Lib\Includes\ts_api.h"
15 #include "TS_Lib\Includes\ts_service.h"
16 /*********************************************************************************************************
-************/
17 #if DEBUG
#define I2C_ADDR 0xCA
unsigned char xdata TouchDebugID = '5';
unsigned char rxOffset;
unsigned char regAddr;
bit iicReadMode;
extern TSState_T xdata TS_State_Debug;
extern unsigned char xdata Key_Cnt_Debug;
extern unsigned char xdata TS_CH_Debug[OPENED_TS_COUNT];
extern unsigned int xdata TS_RefChBaseLineData;
extern unsigned int xdata TS_RefPostData;
extern unsigned int xdata KeysFlagSN_Debug;
code unsigned char *TS_INFO[]=
{
&TouchDebugID,
&TS_State_Debug,
&Key_Cnt_Debug,
&TS_RefChBaseLineData,
&TS_RefPostData,
&KeysFlagSN_Debug,
&TS_BaseLineData[0],
&TS_PostData[0],
&TSKey_FingerThd[0],
&TS_CH_Debug[0],
};
unsigned char *pTS_Info;
void I2C_ISR(void)
{
unsigned char Sta_Temp;
TouchDebugID = '5';
Sta_Temp = I2CSTA;
if(Sta_Temp == 0x60) //接收到从机地址+写位
{
rxOffset = 0xff;
C51 COMPILER V9.60.0.0 DEBUG 03/28/2026 16:50:48 PAGE 2
iicReadMode = 0;
I2CCON |= AAK(1);
}
else if(Sta_Temp == 0x80)
{
if(iicReadMode) //发送一字节数据
{
rxOffset++;
I2CDAT = *(pTS_Info+rxOffset);
}
else //接收到一字节数据
{
if(rxOffset == 0xff) //地址
{
regAddr=I2CDAT;
pTS_Info = TS_INFO[regAddr];
rxOffset=0;
I2CCON |= AAK(1);
}
else //数据
{
*(pTS_Info+rxOffset) = I2CDAT;
rxOffset++;
I2CCON |= AAK(1);
}
}
}
else if(Sta_Temp==0xA8) //接收到从机地址+读位,发送ACK信号
{
I2CDAT = *(pTS_Info+rxOffset);
iicReadMode = 1;
}
else if(Sta_Temp == 0x88)
{
}
I2CFLG |= I2CF;
}
void Debug_init(void)
{
#ifdef I2C_SELECT_P30_P31
I2CIOS = 0;
GPIO_Init(P30F,P30_I2C_SDA_SETTING);
GPIO_Init(P31F,P31_I2C_SCL_SETTING);
#elif defined I2C_SELECT_P02_P03
I2CIOS = 1;
GPIO_Init(P03F,P03_I2C_SDA_SETTING);
GPIO_Init(P02F,P02_I2C_SCL_SETTING);
#endif
I2CCON = I2CE(1) | I2CIE(1) | STA(0) | STP(0)| CKHD(0) | AAK(1)| CBSE(0) | STFE(0);
I2CADR = (I2C_ADDR>>1);
INT4EN = 1;
PS1 = 1;
}
void Debug_ParamLoad(void)
{
unsigned char i;
KeysFlagSN_Debug = (unsigned int)KeysFlagSN;
TS_State_Debug = TS_State;
Key_Cnt_Debug = KEY_CH_COUNT;
for(i = 0; i < KEY_CH_COUNT; i++)
C51 COMPILER V9.60.0.0 DEBUG 03/28/2026 16:50:48 PAGE 3
{
TS_CH_Debug[i] = TS_CH[i];
}
TS_RefPostData = TS_PostData[OPENED_TS_COUNT];
TS_RefChBaseLineData = TS_RefPostData;
}
#endif
122 #endif
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = ---- ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
EDATA SIZE = ---- ----
HDATA SIZE = ---- ----
XDATA CONST SIZE = ---- ----
FAR CONST SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
+50
View File
@@ -0,0 +1,50 @@
C51 COMPILER V9.60.0.0 DELAY 03/28/2026 16:50:46 PAGE 1
C51 COMPILER V9.60.0.0, COMPILATION OF MODULE DELAY
OBJECT MODULE PLACED IN .\hex\delay.obj
COMPILER INVOKED BY: C:\keil5\C51\BIN\C51.EXE Library\Sources\delay.c OMF2 OPTIMIZE(9,SIZE) BROWSE DEBUG PRINT(.\lst\del
-ay.lst) TABS(2) OBJECT(.\hex\delay.obj)
line level source
1 #ifndef _Delay_C_
2 #define _Delay_C_
3 /*********************************************************************************************************
-************/
4 void Delay_50us(unsigned int n)
5 {
6 1 unsigned char i;
7 1 while(n--)
8 1 {
9 2 for(i=0;i<71;i++);
10 2 }
11 1 }
12 void Delay_ms(unsigned int delay_nms)
13 {
14 1 while(delay_nms--)
15 1 {
16 2 Delay_50us(20);
17 2 }
18 1 }
19 /*********************************************************************************************************
-************/
20 #endif
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 53 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
EDATA SIZE = ---- ----
HDATA SIZE = ---- ----
XDATA CONST SIZE = ---- ----
FAR CONST SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
+125
View File
@@ -0,0 +1,125 @@
C51 COMPILER V9.60.0.0 INTERRUPT 03/28/2026 16:50:47 PAGE 1
C51 COMPILER V9.60.0.0, COMPILATION OF MODULE INTERRUPT
OBJECT MODULE PLACED IN .\hex\interrupt.obj
COMPILER INVOKED BY: C:\keil5\C51\BIN\C51.EXE interrupt.c OMF2 OPTIMIZE(9,SIZE) BROWSE DEBUG PRINT(.\lst\interrupt.lst)
-TABS(2) OBJECT(.\hex\interrupt.obj)
line level source
1 #ifndef _INTERRUPT_C_
2 #define _INTERRUPT_C_
3
4 /*********************************************************************************************************
-************/
5 #include "ca51f5_config.h"
6 #include "includes\ca51f5sfr.h"
7 #include "includes\ca51f5xsfr.h"
8 #include "includes\gpiodef_f5.h"
9 #include "includes\system.h"
10 #include "Library\includes\uart.h"
11 #include "Library\Includes\tmc.h"
12
13 #include "TS_Lib\Includes\ts_configuration.h"
14 #include "TS_Lib\Includes\ts_def.h"
15 #include "TS_Lib\Includes\ts_api.h"
16 #include "TS_Lib\Includes\ts_service.h"
17 #include <intrins.h>
18
19 #include "rf_send.h"
20
21
22 #if DEBUG
#include "Library\Includes\i2c.h"
void I2C_ISR(void);
#endif
26 /*********************************************************************************************************
-************/
27 extern unsigned char xdata TS_HalfSecCnt;
28 void INT2_Handler (void) interrupt 4
29 {
30 1 #ifdef UART0_EN
if(RI0)
{
UART0_RX_ISR();
}
if(TI0)
{
UART0_TX_ISR();
}
#endif
40 1 }
41
42 void INT3_ISR (void) interrupt 5
43 {
44 1 static unsigned char TmCnt = 0;
45 1 if(TMCON & TMF) //ºÁÃëÖжÏ
46 1 {
47 2 TMCON |= TMF;
48 2 #if SUPPORT_TOUCH_SLEEP_MODE
if(TS_SleepMode)
{
TS_HalfSecCnt++;
return;
C51 COMPILER V9.60.0.0 INTERRUPT 03/28/2026 16:50:47 PAGE 2
}
else
{
TS_MS_ISR();
}
#else
59 2 TS_MS_ISR();
60 2 #endif
61 2 if(TS_LongKeyTimer)
62 2 {
63 3 TS_LongKeyTimer--;
64 3 }
65 2 TmCnt++;
66 2 if(TmCnt >= 128)
67 2 {
68 3 TmCnt = 0;
69 3 TS_HS_ISR();
70 3 }
71 2 if(RF_Time<250)RF_Time++; //4ms
72 2 }
73 1 #if SUPPORT_TOUCH_SLEEP_MODE
if(TS_SleepMode)
{
return;
}
#endif
79 1 if(TKIF != 0)
80 1 {
81 2 TS_ISR();
82 2 }
83 1 }
84 void INT4_ISR(void) interrupt 6
85 {
86 1 #if DEBUG
if(I2CFLG & I2CF)
{
I2C_ISR();
}
#endif
92 1 }
93 #endif
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 132 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 1 ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
EDATA SIZE = ---- ----
HDATA SIZE = ---- ----
XDATA CONST SIZE = ---- ----
FAR CONST SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
+662
View File
@@ -0,0 +1,662 @@
C51 COMPILER V9.60.0.0 MAIN 03/28/2026 16:50:45 PAGE 1
C51 COMPILER V9.60.0.0, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN .\hex\main.obj
COMPILER INVOKED BY: C:\keil5\C51\BIN\C51.EXE main.c OMF2 OPTIMIZE(9,SIZE) BROWSE DEBUG PRINT(.\lst\main.lst) TABS(2) OB
-JECT(.\hex\main.obj)
line level source
1 #ifndef _MAIN_C_
2 #define _MAIN_C_
3 /*********************************************************************************************************
-************/
4 #include "ca51f5_config.h"
5 #include "includes\ca51f5sfr.h"
6 #include "includes\ca51f5xsfr.h"
7 #include "includes\gpiodef_f5.h"
8
9 #include "Library\includes\uart.h"
10 #include "Library\includes\system_clock.h"
11 #include "Library\Includes\tmc.h"
12 #include "includes\system.h"
13 #include "Library\includes\wdt.h"
14 /*********************************************************************************************************
-************/
15 #include "TS_Lib\Includes\ts_configuration.h"
16 #include "TS_Lib\Includes\ts_def.h"
17 #include "TS_Lib\Includes\ts_api.h"
18 #include "TS_Lib\Includes\ts_service.h"
19 #include "rf_send.h"
20
21
22 #include "Library\Includes\delay.h"
23
24 #define INT_TIME 100 //定时时间,单位为us
25
26 #define TH_VAL (unsigned char)((0x2000 - (INT_TIME*(FOSC/1000))/12000)>>5)
27 #define TL_VAL (unsigned char)(0x2000 - (INT_TIME*(FOSC/1000))/12000)&0x1F
28
29
30
31 unsigned char flagSend = 0;
32 unsigned char valueSend = 0;
33 unsigned char flagStart = 0;
34
35
36
37 void Delay_ms(unsigned int n);
38
39 void TIMER0_ISR (void) interrupt 1 //每100us产生中断
40 {
41 1 TH0 = TH_VAL;
42 1 TL0 = TL_VAL;
43 1
44 1 Send433_Byte();
45 1 }
46 /*********************************************************************************************************
-************/
47 /*********************************************************************************************************
-**********************************
48 说明:
49 ----------------------------------------------------------------------------------------------------------
---
C51 COMPILER V9.60.0.0 MAIN 03/28/2026 16:50:45 PAGE 2
50 1.ts_configuration.h是触摸的配置文件,可在配置文件中设置触摸通道、灵敏度等。详见ts_configuration.h中的说明
-。
51 ----------------------------------------------------------------------------------------------------------
---
52 2.如果需要使用UART来调试,可在ca51f5_config.h中打开宏定义UART0_EN
53 ----------------------------------------------------------------------------------------------------------
---
54 3.触摸库对外的数据接口为KeysFlagSN,用户可根据KeysFlagSN的值来判断触摸键是否按下(如果触摸键按下,KeysFlag
-SN
55 的对应位一直为1,触摸键松开,对应位变为0),TS_Key是根据KeysFlagSN的值生成的按键消息,用户如不使用可忽略。
56 ----------------------------------------------------------------------------------------------------------
---
57 4.使能了触摸省电模式后,在无按键时,在定义的时间后会进入省电模式,进入省电模式前会关闭TMC中断和触摸中断(
-⒁猓
58 中断仍是开启的),在触摸省电模式下,CPU会进入STOP模式,在被触摸唤醒后,程序在省电函数(TS_EnterSleepMode
-的循环内运行(注意,触摸省电模式程序不
59 会在主循环内运行),在触摸省电模式下如果还要响应其他中断,用户需在进入触摸省电模式前自行开启其他中断,
60 如果需要退出省电模式,用户只需要在省电函数循环内加入条件判断,跳出循环即可。
61
62 变量TS_SleepEn是控制触摸省电模式的开关,如果希望程序在某些条件下不进入省电模式,只需在此条件下设置TS_Sleep
-En = 0
63
64
65 ----------------------------------------------------------------------------------------------------------
---
66 5.触摸外挂电容(即TK_CAP引脚连接电容)范围:6nF~50nF,建议值:20nF(即203
67 ----------------------------------------------------------------------------------------------------------
---
68 6.触摸引脚串联电阻范围:0~5K,建议值:1K欧姆,如果有抗对讲机等电磁干扰要求, 此电阻至少3K以上。
69 **********************************************************************************************************
-*********************************/
70 unsigned long int Read_32bit_UID(void)
71 {
72 1 unsigned long int ID;
73 1 FSCMD = 0x80;
74 1 PTSH = 0x00;
75 1 PTSL = 0x00;
76 1 FSCMD = 0x81;
77 1 ID = FSDAT;
78 1 ID *= 256;
79 1 ID |= FSDAT;
80 1 ID *= 256;
81 1 ID |= FSDAT;
82 1 ID *= 256;
83 1 ID |= FSDAT;
84 1 FSCMD = 0;
85 1 return ID;
86 1 }
87 code unsigned char rf_data[255]=
88 {
89 0 ,
90 1 ,
91 2 ,
92 3 ,
93 4 ,
94 5 ,
95 6 ,
96 7 ,
97 8 ,
98 9 ,
99 10 ,
100 11 ,
C51 COMPILER V9.60.0.0 MAIN 03/28/2026 16:50:45 PAGE 3
101 12 ,
102 13 ,
103 16 ,
104 16 ,
105 16 ,
106 17 ,
107 18 ,
108 18 ,
109 19 ,
110 20 ,
111 21 ,
112 22 ,
113 23 ,
114 24 ,
115 25 ,
116 26 ,
117 27 ,
118 28 ,
119 29 ,
120 30 ,
121 31 ,
122 32 ,
123 33 ,
124 34 ,
125 35 ,
126 36 ,
127 37 ,
128 37 ,
129 38 ,
130 39 ,
131 40 ,
132 41 ,
133 42 ,
134 43 ,
135 44 ,
136 45 ,
137 46 ,
138 47 ,
139 48 ,
140 49 ,
141 50 ,
142 51 ,
143 52 ,
144 53 ,
145 54 ,
146 55 ,
147 56 ,
148 56 ,
149 57 ,
150 58 ,
151 59 ,
152 60 ,
153 61 ,
154 62 ,
155 63 ,
156 64 ,
157 65 ,
158 66 ,
159 67 ,
160 68 ,
161 69 ,
162 70 ,
C51 COMPILER V9.60.0.0 MAIN 03/28/2026 16:50:45 PAGE 4
163 71 ,
164 72 ,
165 73 ,
166 74 ,
167 74 ,
168 75 ,
169 76 ,
170 77 ,
171 78 ,
172 79 ,
173 80 ,
174 81 ,
175 82 ,
176 83 ,
177 84 ,
178 85 ,
179 86 ,
180 87 ,
181 88 ,
182 89 ,
183 90 ,
184 91 ,
185 92 ,
186 93 ,
187 93 ,
188 94 ,
189 95 ,
190 96 ,
191 97 ,
192 98 ,
193 99 ,
194 100 ,
195 101 ,
196 102 ,
197 103 ,
198 104 ,
199 105 ,
200 106 ,
201 107 ,
202 108 ,
203 109 ,
204 110 ,
205 111 ,
206 112 ,
207 112 ,
208 113 ,
209 114 ,
210 115 ,
211 116 ,
212 117 ,
213 118 ,
214 119 ,
215 120 ,
216 121 ,
217 122 ,
218 123 ,
219 124 ,
220 125 ,
221 126 ,
222 127 ,
223 128 ,
224 129 ,
C51 COMPILER V9.60.0.0 MAIN 03/28/2026 16:50:45 PAGE 5
225 130 ,
226 130 ,
227 131 ,
228 132 ,
229 133 ,
230 134 ,
231 135 ,
232 136 ,
233 137 ,
234 138 ,
235 139 ,
236 140 ,
237 141 ,
238 142 ,
239 143 ,
240 144 ,
241 145 ,
242 146 ,
243 147 ,
244 148 ,
245 149 ,
246 149 ,
247 150 ,
248 151 ,
249 152 ,
250 153 ,
251 154 ,
252 155 ,
253 156 ,
254 157 ,
255 158 ,
256 159 ,
257 160 ,
258 161 ,
259 162 ,
260 163 ,
261 164 ,
262 165 ,
263 166 ,
264 167 ,
265 168 ,
266 168 ,
267 169 ,
268 170 ,
269 171 ,
270 172 ,
271 173 ,
272 174 ,
273 175 ,
274 176 ,
275 177 ,
276 178 ,
277 179 ,
278 180 ,
279 181 ,
280 182 ,
281 183 ,
282 184 ,
283 185 ,
284 186 ,
285 186 ,
286 187 ,
C51 COMPILER V9.60.0.0 MAIN 03/28/2026 16:50:45 PAGE 6
287 188 ,
288 189 ,
289 190 ,
290 191 ,
291 192 ,
292 193 ,
293 194 ,
294 195 ,
295 196 ,
296 197 ,
297 198 ,
298 199 ,
299 200 ,
300 201 ,
301 202 ,
302 203 ,
303 204 ,
304 205 ,
305 205 ,
306 206 ,
307 207 ,
308 208 ,
309 209 ,
310 210 ,
311 211 ,
312 212 ,
313 213 ,
314 214 ,
315 215 ,
316 216 ,
317 217 ,
318 218 ,
319 219 ,
320 220 ,
321 221 ,
322 222 ,
323 223 ,
324 224 ,
325 224 ,
326 225 ,
327 226 ,
328 227 ,
329 228 ,
330 229 ,
331 230 ,
332 231 ,
333 232 ,
334 233 ,
335 234 ,
336 235 ,
337 236 ,
338 237 ,
339 238 ,
340 239 ,
341 239,
342 };
343
344
345 void main(void)
346 {
347 1 unsigned long int addr=0;
348 1 unsigned char send_times = 0;
C51 COMPILER V9.60.0.0 MAIN 03/28/2026 16:50:45 PAGE 7
349 1 #ifdef LVD_RST_ENABLE
350 1 LVDCON = 0xE3; //设置LVD复位电压为2.0V
351 1 #endif
352 1
353 1 #ifdef UART0_EN
Uart0_Initial(UART0_BAUTRATE);
#endif
356 1
357 1 //看门狗时钟源为IRCL
358 1 CKCON |= ILCKE; //使能IRCL
359 1 WDCON = WDTS(WDTS_IRCL) | WDRE(WDRE_reset); //设置看门狗时钟源为ILCKE,模式为复位模式
360 1 WDVTHH = 0; //看门狗复位阈值高八位设置 当前值为5s
361 1 WDVTHL = 75; //看门狗复位阈值低八位设置
362 1 WDFLG = 0xA5;
363 1
364 1 EA = 1;
365 1
366 1 TS_init();
367 1
368 1 P07F = OUTPUT; //P00设置为推挽输出模式
369 1 P07=0;
370 1
371 1 addr = (unsigned int)Read_32bit_UID(); //获取遥控ID
372 1 D0 = (unsigned char)(addr >> 8);
373 1 D1 = (unsigned char)(addr);
374 1
375 1
376 1 Yaokong_Data[0] = D1;
377 1 Yaokong_Data[1] = D0;
378 1
379 1 TMOD = (TMOD&0xFC)|0x00; //模式选择: 定时器0,模式0。
380 1 TH0 = TH_VAL; //高8位装初值
381 1 TL0 = TL_VAL; //低8位装初值
382 1
383 1 TR0 = 1; //定时器0使能
384 1 ET0 = 1; //定时器0中断使能
385 1 PT0 = 0; //设置定时器0中断优先级为低优先级
386 1 while(1)
387 1 {
388 2 TS_Action();
389 2 if(WheelSliderPosition == -1)
390 2 {
391 3 flagStart = 1;
392 3 }
393 2 if(WheelSliderPosition != -1&&KeysFlagSN==0)
394 2 {
395 3 flagSend = 1;
396 3 flagStart = 0;
397 3 send_times = 1;
398 3 //当WheelSliderPosition不等于-1时, 表示滑条或圆环有触摸事件发生。WheelSliderPosition的值表示滑条或圆环
-的位置。
399 3 valueSend=rf_data[ WheelSliderPosition];//0-240
400 3 valueSend=239-valueSend;
401 3 valueSend +=16;//15-255//色环出现问题颜色需要校准
402 3
403 3 }
404 2 if(KeysFlagSN != 0)
405 2 {
406 3 flagSend = 1;
407 3 flagStart=0;
408 3 send_times = 3;
409 3 switch(KeysFlagSN)
C51 COMPILER V9.60.0.0 MAIN 03/28/2026 16:50:45 PAGE 8
410 3 {
411 4 case 0x0001://TK4亮度++
412 4 valueSend = 0x08;
413 4 break;
414 4 case 0x0002://TK5//亮度--
415 4 valueSend = 0X0D;
416 4 break;
417 4 case 0x0004://TK7//。功能--
418 4 valueSend = 0X0E;
419 4 break;
420 4 case 0x0008://TK9//off
421 4 valueSend = 0X04;
422 4 break;
423 4 case 0x0010://TK10//。功能++
424 4 valueSend = 0X06;
425 4 break;
426 4 case 0x0020://TK12//on
427 4 valueSend = 0X02;
428 4 break;
429 4 default:
430 4 flagSend = 0;
431 4 break;
432 4 }
433 3 }
434 2
435 2 if(WheelSliderPosition == -1)
436 2 {
437 3 flagStart = 1;
438 3 }
439 2
440 2
441 2 #if GENERATE_TS_KEY_EN
/*************************************************************************************************
变量TS_Key是根据KeysFlagSN得到的按键信息,以下为按键产生的过程:
|---------------------------------------------------------------------------------------------------------
---------------------------|
| 单键:以K1为例,K1按键产生的流程如下所示: |
| |
| |---> K1|KEY_BREAK(短按松开) |
| K1(按下)--| |
| |---> K1|KEY_LONG_START(长按大约1秒)---> K1|KEY_LONG(一直长按,约每300ms产生一次长按键)---->K1|KEY
-_LONG_BREAK(长按松开) |
| ^ | |
| | | |
| |----------<-----------<------------<--------------| |
|---------------------------------------------------------------------------------------------------------
---------------------------|
|---------------------------------------------------------------------------------------------------------
---------------------------------------------------------------|
| |
| 复合键:以K1(K1=0x0001),K2(K2=0x0002)为例, 当K1K2同时按下时,产生按键为(K1<<5)|K2,即0x22, 产生按键的
-流程如下所示: |
| |
| |---> ((K1<<5)|K2)|KEY_BREAK(短按松开) |
| (K1<<5)|K2(按下)--| |
| |---> ((K1<<5)|K2)|KEY_LONG_START(长按大约1秒)---> ((K1<<5)|K2)|KEY_LONG(一直长按,约每300ms产
-ぐ醇)---->((K1<<5)|K2)|KEY_LONG_BREAK(长按松开) |
| ^ | |
| | | |
| |---------<-------------<----------------<----------------|
- |
C51 COMPILER V9.60.0.0 MAIN 03/28/2026 16:50:45 PAGE 9
|---------------------------------------------------------------------------------------------------------
---------------------------------------------------------------|
注意:由于复合键按下时,软件不一定同时检测到双键,而是先检测到单键按下,例如先检测到K1,此时会先产生K1键,
-等到检测到K2也按
下时,才会产生按键(K1<<5)|K2,检测到双键后,如果双键一直按下,会产生((K1<<5)|K2)|KEY_LONG_START和((K1<<5)|
-K2)|KEY_LONG,如果
有一个键先松手,会停止产生按键, 等到双键都松开时,才会产生((K1<<5)|K2)|KEY_BREAK(短按松开)或((K1<<5)|K2)|
-KEY_LONG_BREAK(长按松开)
*************************************************************************************************/
if(TS_Key != 0)
{
switch(TS_Key)
{
//单按键消息
case K1:
// valueSend = 0x05; //K1短按产生的按键消息
break;
case (K1|KEY_BREAK): flagNoPress = 1; //K1短按松手产生的按键消息
break;
case (K1|KEY_LONG_START): longPressFlag=1;//K1长按开始产生的消息(长按约1秒时产生)
break;
case (K1|KEY_LONG): //K1长按产生的消息(每隔约300ms产生一次)
break;
case (K1|KEY_LONG_BREAK): longPressFlag=0;//K1长按松手产生的消息
break;
//单按键消息
case K2: //K1短按产生的按键消息
// valueSend = 0x0c;
break;
case (K2|KEY_BREAK): flagNoPress = 1; //K1短按松手产生的按键消息
break;
case (K2|KEY_LONG_START): longPressFlag=1;//K1长按开始产生的消息(长按约1秒时产生)
break;
case (K2|KEY_LONG): //K1长按产生的消息(每隔约300ms产生一次)
break;
case (K2|KEY_LONG_BREAK):longPressFlag=0; //K1长按松手产生的消息
break;
//单按键消息
case K3: //K1短按产生的按键消息
// valueSend = 0x0a;
break;
case (K3|KEY_BREAK): flagNoPress = 1; //K1短按松手产生的按键消息
break;
case (K3|KEY_LONG_START): longPressFlag=1;//K1长按开始产生的消息(长按约1秒时产生)
break;
case (K3|KEY_LONG): //K1长按产生的消息(每隔约300ms产生一次)
break;
case (K3|KEY_LONG_BREAK): longPressFlag=0;///K1长按松手产生的消息
break;
//单按键消息
case K4: //K1短按产生的按键消息
// valueSend = 0x0b;
break;
case (K4|KEY_BREAK): flagNoPress = 1; //K1短按松手产生的按键消息
flagStart = 1;
break;
case (K4|KEY_LONG_START):longPressFlag=1; //K1长按开始产生的消息(长按约1秒时产生)
valueSend = 0x0b;
flagStart = 1;
break;
case (K4|KEY_LONG): //K1长按产生的消息(每隔约300ms产生一次)
C51 COMPILER V9.60.0.0 MAIN 03/28/2026 16:50:45 PAGE 10
valueSend = 0x0b;
flagStart = 1;
break;
case (K4|KEY_LONG_BREAK):longPressFlag=0;//K1长按松手产生的消息
break;
//单按键消息
case K5: //K1短按产生的按键消息
// valueSend = 0x09;
break;
case (K5|KEY_BREAK): flagNoPress = 1; //K1短按松手产生的按键消息
break;
case (K5|KEY_LONG_START):longPressFlag=1; //K1长按开始产生的消息(长按约1秒时产生)
break;
case (K5|KEY_LONG): //K1长按产生的消息(每隔约300ms产生一次)
break;
case (K5|KEY_LONG_BREAK):longPressFlag=0; //K1长按松手产生的消息
break;
//单按键消息
case K6: //K1短按产生的按键消息
// valueSend = 0x07;
break;
case (K6|KEY_BREAK): flagNoPress = 1; //K1短按松手产生的按键消息
break;
case (K6|KEY_LONG_START): longPressFlag=1;//K1长按开始产生的消息(长按约1秒时产生)
break;
case (K6|KEY_LONG): //K1长按产生的消息(每隔约300ms产生一次)
break;
case (K6|KEY_LONG_BREAK):longPressFlag=0; //K1长按松手产生的消息
break;
//单按键消息
#if GENERATE_DOUBLE_KEY_EN
//复合键消息
// case (K1<<5)|K2: //K1和K2同时按下时产生的按键消息
// break;
// case ((K1<<5)|K2)|KEY_BREAK: //K1和K2短按松手产生的按键消息
// break;
// case ((K1<<5)|K2)|KEY_LONG_START: //K1和K2长按开始产生的按键消息(长按约1秒时产生)
// break;
// case ((K1<<5)|K2)|KEY_LONG: //K1和K2长按产生的消息(每隔约300ms产生一次)
// break;
// case ((K1<<5)|K2)|KEY_LONG_BREAK: //K1和K2长按松手产生的消息
// break;
#endif
}
}
#endif
569 2
570 2
571 2
572 2
573 2 if(flagSend==1)//短按
574 2 {
575 3 EA=0;RF_Time=0;
576 3 flagSend = 0;
577 3 RF_Time=0;
578 3 TR0 = 1; //定时器0使能
579 3 EA=0;
580 3 Yaokong_Data[2] = valueSend;
581 3 EA=1;
582 3 }
583 2
584 2 }
C51 COMPILER V9.60.0.0 MAIN 03/28/2026 16:50:45 PAGE 11
585 1 }
586 #endif
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 454 ----
CONSTANT SIZE = 255 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 3 9
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
EDATA SIZE = ---- ----
HDATA SIZE = ---- ----
XDATA CONST SIZE = ---- ----
FAR CONST SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
+171
View File
@@ -0,0 +1,171 @@
C51 COMPILER V9.60.0.0 RF_SEND 03/28/2026 16:50:47 PAGE 1
C51 COMPILER V9.60.0.0, COMPILATION OF MODULE RF_SEND
OBJECT MODULE PLACED IN .\hex\rf_send.obj
COMPILER INVOKED BY: C:\keil5\C51\BIN\C51.EXE rf_send.c OMF2 OPTIMIZE(9,SIZE) BROWSE DEBUG PRINT(.\lst\rf_send.lst) TABS
-(2) OBJECT(.\hex\rf_send.obj)
line level source
1 #ifndef _rf_send_C_
2 #define _rf_send_C_
3 /*********************************************************************************************************
-************/
4 #include "ca51f5_config.h"
5 #include "includes\ca51f5sfr.h"
6 #include "includes\ca51f5xsfr.h"
7 #include "includes\gpiodef_f5.h"
8
9 #include "Library\Includes\delay.h"
10
11 #include "rf_send.h"
12
13 sbit Pin_rf = P0^7;
14 unsigned char D0,D1;
15 unsigned int idata ID;
16 unsigned char RF_Time; //用于控制RF发送间隔时间
17
18
19 unsigned char Send433_Status = 0; //发送过程的状态
20 unsigned int Send433_Time = 0; //记录433发送数据的高低电平时间
21
22 unsigned char Yaokong_Data[3]={0};
23
24 unsigned char Send433_Byte_Cont=0;//记录发送一组433数据的字节数
25 unsigned char Send433_Bit_Cont = 0; //记录发送位
26 unsigned char Temp=0;
27 unsigned char Chose_Data_En=0;//使能选择一组433数据的第N个字节
28
29 void Send433_Byte(void) //100us执行一次
30 {
31 1 switch (Send433_Status)
32 1 {
33 2 case 0: //同步头高
34 2 Pin_rf = 1;
35 2 if (++Send433_Time >= 4)//高电平400us
36 2 {
37 3 Send433_Time = 0;
38 3 Send433_Status = 1; //进入同步头低
39 3 }
40 2 break;
41 2 case 1://同步头低电平
42 2 Pin_rf = 0;
43 2 if (++Send433_Time >= 120)//电平12300us
44 2 {
45 3 Send433_Time = 0;
46 3 Send433_Status = 2; //进入发送24位
47 3 }
48 2 break;
49 2 case 2:
50 2
51 2 if(!Chose_Data_En)//还没开始发送 或者上次已经发送完一个字节才使能选择
52 2 {
53 3 Chose_Data_En=1;
C51 COMPILER V9.60.0.0 RF_SEND 03/28/2026 16:50:47 PAGE 2
54 3 Temp=Yaokong_Data[Send433_Byte_Cont];
55 3 //Send433_Byte_Cont++;
56 3 }
57 2
58 2 Send433_Time++;
59 2 if (Temp & 0x80) //1
60 2 {
61 3 if (Send433_Time <= 12)
62 3 {
63 4 Pin_rf = 1;
64 4 }
65 3 else if (Send433_Time >= 13)
66 3 {
67 4 Pin_rf = 0;
68 4 if (Send433_Time == 16)
69 4 {
70 5 Send433_Time = 0;
71 5 Temp <<= 1;
72 5 Send433_Bit_Cont++;
73 5 }
74 4 }
75 3 }
76 2 else//0
77 2 {
78 3 if (Send433_Time <= 4)
79 3 {
80 4 Pin_rf = 1;
81 4 }
82 3 else if (Send433_Time >= 5)
83 3 {
84 4 Pin_rf = 0;
85 4 if (Send433_Time == 16)
86 4 {
87 5 Send433_Time = 0;
88 5 Temp <<= 1;
89 5 Send433_Bit_Cont++;
90 5 }
91 4 }
92 3 }
93 2 if (Send433_Bit_Cont == 8)//发送完一字节
94 2 {
95 3 Send433_Bit_Cont = 0;
96 3
97 3 Chose_Data_En=0;//使能选择下一个字节
98 3 if(++Send433_Byte_Cont==3)
99 3 {
100 4 Send433_Byte_Cont=0;
101 4
102 4 if(flagStart == 1)
103 4 {
104 5 Send433_Status = 3; //结束脉冲
105 5 }
106 4 else
107 4 {
108 5 Send433_Status = 0; //一帧数据发送完毕
109 5 // if(WheelSliderPosition == -1)
110 5 // {
111 5 // Send433_Status = 3;
112 5 // }
113 5 }
114 4
115 4 }
C51 COMPILER V9.60.0.0 RF_SEND 03/28/2026 16:50:47 PAGE 3
116 3 }
117 2 break;
118 2
119 2 case 3:
120 2 if (++Send433_Time <= 4)
121 2 {
122 3 Pin_rf = 1;
123 3 }
124 2 else
125 2 {
126 3 Pin_rf = 0;
127 3 Send433_Time = 0;
128 3 // flagStart = 0;
129 3 Send433_Status = 0;
130 3 TR0 = 0; //定时器0禁止
131 3 }
132 2 break;
133 2 default:
134 2 break;
135 2 }
136 1 }
137
138 #endif
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 261 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 13 ----
IDATA SIZE = 2 ----
BIT SIZE = ---- ----
EDATA SIZE = ---- ----
HDATA SIZE = ---- ----
XDATA CONST SIZE = ---- ----
FAR CONST SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
+55
View File
@@ -0,0 +1,55 @@
C51 COMPILER V9.60.0.0 SYSTEM_CLOCK 03/28/2026 16:50:46 PAGE 1
C51 COMPILER V9.60.0.0, COMPILATION OF MODULE SYSTEM_CLOCK
OBJECT MODULE PLACED IN .\hex\system_clock.obj
COMPILER INVOKED BY: C:\keil5\C51\BIN\C51.EXE Library\Sources\system_clock.c OMF2 OPTIMIZE(9,SIZE) BROWSE DEBUG PRINT(.\
-lst\system_clock.lst) TABS(2) OBJECT(.\hex\system_clock.obj)
line level source
1 #ifndef _SYSTEM_CLOCK_C_
2 #define _SYSTEM_CLOCK_C_
3 /*********************************************************************************************************
-************/
4 #include "ca51f5_config.h"
5 #include "../../includes/ca51f5sfr.h"
6 #include "../../includes/ca51f5xsfr.h"
7 #include "../../includes/gpiodef_f5.h"
8
9 #include "../../includes/system.h"
10 #include "../../Library/includes/system_clock.h"
11 #include <intrins.h>
12 /*********************************************************************************************************
-************/
13 void Sys_Clk_Set_IRCH(void)
14 {
15 1 CKCON |= IHCKE;
16 1 CKCON = (CKCON&0xFE) | CKSEL_IRCH;
17 1 }
18 void Sys_Clk_Set_IRCL(void)
19 {
20 1 CKCON |= ILCKE;
21 1 CKCON = (CKCON&0xFE) | CKSEL_IRCL;
22 1 }
23 /*********************************************************************************************************
-************/
24 #endif
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 26 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
EDATA SIZE = ---- ----
HDATA SIZE = ---- ----
XDATA CONST SIZE = ---- ----
FAR CONST SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
+1933
View File
File diff suppressed because it is too large Load Diff
+176
View File
@@ -0,0 +1,176 @@
C51 COMPILER V9.60.0.0 UART 03/28/2026 16:50:46 PAGE 1
C51 COMPILER V9.60.0.0, COMPILATION OF MODULE UART
OBJECT MODULE PLACED IN .\hex\uart.obj
COMPILER INVOKED BY: C:\keil5\C51\BIN\C51.EXE Library\Sources\uart.c OMF2 OPTIMIZE(9,SIZE) BROWSE DEBUG PRINT(.\lst\uart
-.lst) TABS(2) OBJECT(.\hex\uart.obj)
line level source
1 #ifndef _UART_C_
2 #define _UART_C_
3 #include "ca51f5_config.h"
4 #include "../../includes/ca51f5sfr.h"
5 #include "../../includes/ca51f5xsfr.h"
6 #include "../../includes/gpiodef_f5.h"
7 #include "../../includes/system.h"
8
9 #include "../../Library/includes/uart.h"
10 #include <intrins.h>
11 #include <string.h>
12 #include <stdarg.h>
13 #include <stdlib.h>
14 #include <stdio.h>
15 #include <absacc.h>
16 /*********************************************************************************************************
-************/
17 /*********************************************************************************************************
-************/
18 #ifdef UART0_EN
/*********************************************************************************************************
-************
注意:以下波特率配置参数前提条件是系统时钟为16MHz,如果修改系统时钟频率,波特率配置参数须另行计算。
**********************************************************************************************************
-*************/
void Uart0_Initial(unsigned long int baudrate)
{
code unsigned long int BR_TAB[]=
{
1200,
2400,
4800,
9600,
19200,
38400,
57600,
115200,
};
code unsigned int BR_SET_TAB[][2]=
{
{416,31},
{208,31},
{104,31},
{52,31},
{26,31},
{13,31},
{10,27},
{5,27},
};
unsigned int value_temp;
unsigned char i;
uart0_send.head = 0;
uart0_send.tail = 0;
C51 COMPILER V9.60.0.0 UART 03/28/2026 16:50:46 PAGE 2
uart0_rev.head = 0;
uart0_rev.tail = 0;
uart0_tx_flag = 0;
GPIO_Init(P31F,P31_UART0_RX_SETTING);
GPIO_Init(P30F,P30_UART0_TX_SETTING);
for(i=0;i<sizeof(BR_TAB)/4;i++)
{
if(baudrate == BR_TAB[i])
{
value_temp = 0x10000 - BR_SET_TAB[i][0];
UDCKS = 0x80 | BR_SET_TAB[i][1];
break;
}
}
if(i == sizeof(BR_TAB)/4) return; //如果所设置的波特率不在表格中,可自行添加。
T2CON = 0x24;
T2CH = (unsigned char)(value_temp>>8);
T2CL = (unsigned char)(value_temp);
TH2 = (unsigned char)(value_temp>>8);
TL2 = (unsigned char)(value_temp);;
TR2 = 1;
S0CON = 0x50;
ES0 = 1;
}
void Uart0_PutChar(unsigned char bdat)
{
unsigned char free_space;
unsigned char tail_tmp;
while(1)
{
tail_tmp = uart0_send.tail;
if(uart0_send.head < tail_tmp)
{
free_space = tail_tmp - uart0_send.head;
}
else
{
free_space = UART0_TX_BUF_SIZE + tail_tmp - uart0_send.head;
}
if(free_space > 1)
{
ES0 = 0;
uart0_send.head++;
uart0_send.head %= UART0_TX_BUF_SIZE;
uart0_tx_buf[uart0_send.head] = bdat;
if(!uart0_tx_flag)
{
ES0 = 1;
uart0_send.tail++;
uart0_send.tail %= UART0_TX_BUF_SIZE;
S0BUF=uart0_tx_buf[uart0_send.tail];
uart0_tx_flag = 1;
}
else
{
ES0 = 1;
}
break;
C51 COMPILER V9.60.0.0 UART 03/28/2026 16:50:46 PAGE 3
}
}
}
void UART0_RX_ISR (void)
{
RI0 = 0;
uart0_rev.head++;
uart0_rev.head %= UART0_RX_BUF_SIZE;
uart0_rx_buf[uart0_rev.head]=S0BUF;
}
void UART0_TX_ISR (void)
{
TI0 = 0;
if(uart0_send.head!=uart0_send.tail)
{
uart0_send.tail++;
uart0_send.tail %= UART0_TX_BUF_SIZE;
S0BUF=uart0_tx_buf[uart0_send.tail];
}
else
{
uart0_tx_flag=0;
}
}
#endif
138 /*********************************************************************************************************
-************/
139 #endif
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = ---- ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
EDATA SIZE = ---- ----
HDATA SIZE = ---- ----
XDATA CONST SIZE = ---- ----
FAR CONST SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)