/** * @file stc8h.h * @brief STC8H 系列单片机寄存器定义 (SDCC 风格) * 适配 STC8H1K08 系列。 * 寄存器地址来源:STC8H 系列技术参考手册 9.1/9.9 节 SFR 映射图 * * 使用方法: * #include "stc8h.h" * P3 = 0x01; // 直接 SFR 访问 * P3 |= 0x02; * __critical { ... } // 关键段 */ #ifndef __STC8H_H #define __STC8H_H /* ─────────────── 8051 基础 SFR ─────────────── */ __sfr __at (0x80) P0; __sfr __at (0x90) P1; __sfr __at (0xA0) P2; __sfr __at (0xB0) P3; __sfr __at (0xC0) P4; __sfr __at (0xC8) P5; __sfr __at (0x81) SP; __sfr __at (0x82) DPL; __sfr __at (0x83) DPH; __sfr __at (0x87) PCON; __sfr __at (0xE0) ACC; __sfr __at (0xF0) B; __sfr __at (0xD0) PSW; /* ─────────────── 端口模式配置 ─────────────── */ __sfr __at (0x93) P0M1; __sfr __at (0x94) P0M0; __sfr __at (0x91) P1M1; __sfr __at (0x92) P1M0; __sfr __at (0x95) P2M1; __sfr __at (0x96) P2M0; __sfr __at (0xB1) P3M1; __sfr __at (0xB2) P3M0; __sfr __at (0xB3) P4M1; __sfr __at (0xB4) P4M0; __sfr __at (0xC9) P5M1; __sfr __at (0xCA) P5M0; /* 端口上拉 / 速度 / 数字输入使能寄存器 (XFR) */ __sfr __at (0xBA) P_SW2; /* bit7 = 1 使能 XFR 访问 */ #define P0PU_XDATA 0xFE10 #define P1PU_XDATA 0xFE11 #define P2PU_XDATA 0xFE12 #define P3PU_XDATA 0xFE13 #define P5PU_XDATA 0xFE15 #define P0SR_XDATA 0xFE20 #define P1SR_XDATA 0xFE21 #define P2SR_XDATA 0xFE22 #define P3SR_XDATA 0xFE23 #define P5SR_XDATA 0xFE25 #define P0DR_XDATA 0xFE28 #define P1DR_XDATA 0xFE29 #define P2DR_XDATA 0xFE2A #define P3DR_XDATA 0xFE2B #define P5DR_XDATA 0xFE2D #define P0IE_XDATA 0xFE30 #define P1IE_XDATA 0xFE31 /* ─────────────── 定时器 0/1 ─────────────── */ __sfr __at (0x88) TCON; __sfr __at (0x89) TMOD; __sfr __at (0x8A) TL0; __sfr __at (0x8B) TL1; __sfr __at (0x8C) TH0; __sfr __at (0x8D) TH1; __sfr __at (0x8E) AUXR; __sfr __at (0x8F) INTCLKO; /* 定时器 2/3/4 */ __sfr __at (0xD6) T2H; __sfr __at (0xD7) T2L; __sfr __at (0xD4) T3H; __sfr __at (0xD5) T3L; __sfr __at (0xD2) T4H; __sfr __at (0xD3) T4L; __sfr __at (0xD1) T4T3M; __sfr __at (0xFEA1) TM2PS_X; __sfr __at (0xFEA2) TM3PS_X; __sfr __at (0xFEA3) TM4PS_X; /* TCON 位 (SDCC 风格) - 位地址 = 字节地址 + 位号 */ __sbit __at (0x8D) TF0; /* TCON.5 = 0x88 + 5 = 0x8D */ __sbit __at (0x8C) TR0; /* TCON.4 = 0x88 + 4 = 0x8C */ __sbit __at (0x89) IE0; /* TCON.1 */ __sbit __at (0x88) IT0; /* TCON.0 */ __sbit __at (0x8F) TF1; /* TCON.7 */ __sbit __at (0x8E) TR1; /* TCON.6 */ /* AUXR 位 */ #define S1ST2 0x10 /* UART1 波特率发生器选择: 0=T1, 1=T2 */ #define T2R 0x10 /* AUXR.4: T2 运行控制 */ #define T2_CT 0x04 #define T2x12 0x04 /* T2 时钟 1T 模式 */ #define S1SMOD 0x02 /* UART1 波特率加倍 */ /* ─────────────── UART1 ─────────────── */ __sfr __at (0x98) SCON; __sfr __at (0x99) SBUF; __sfr __at (0x9A) S2CON; __sfr __at (0x9B) S2BUF; __sfr __at (0xA9) SADDR; __sfr __at (0xB9) SADEN; __sfr __at (0xA2) P_SW1; /* UART1/SPI 端口切换 */ __sfr __at (0x9C) BRT; /* 独立波特率发生器 */ /* SCON 位 */ __sbit __at (0x99) TI; /* SCON.1 = 0x98 + 1 = 0x99 */ __sbit __at (0x98) RI; /* SCON.0 = 0x98 */ __sbit __at (0x9C) REN; /* SCON.4 = 0x98 + 4 = 0x9C */ /* IE / 中断 */ __sfr __at (0xA8) IE; __sfr __at (0xAF) IE2; __sfr __at (0xB8) IP; __sfr __at (0xB6) IP2; __sfr __at (0xB7) IP2H; __sbit __at (0xAF) EA; /* IE.7 = 0xA8 + 7 = 0xAF */ __sbit __at (0xAC) ES; /* IE.4 */ __sbit __at (0xA9) ET0; /* IE.1 */ __sbit __at (0xAB) ET1; /* IE.3 */ __sbit __at (0xAD) EADC; /* IE.5 = 0xA8 + 5 = 0xAD */ /* ─────────────── SPI ─────────────── */ __sfr __at (0xCD) SPSTAT; __sfr __at (0xCE) SPCTL; __sfr __at (0xCF) SPDAT; #define SPEN 0x40 #define MSTR 0x10 #define CPOL 0x08 #define CPHA 0x04 #define SPR1 0x01 #define SPR0 0x00 #define SSIG 0x80 #define SPIF 0x80 #define WCOL 0x40 /* ─────────────── ADC ─────────────── */ __sfr __at (0xBC) ADC_CONTR; __sfr __at (0xBD) ADC_RES; __sfr __at (0xBE) ADC_RESL; __sfr __at (0xDE) ADCCFG; __sfr __at (0xFEA8) ADCTIM_X; /* ADC_CONTR 位 */ #define ADC_POWER 0x80 #define ADC_START 0x40 #define ADC_FLAG 0x20 #define ADC_CHS_MASK 0x0F /* ─────────────── PCA ─────────────── */ __sfr __at (0xD8) CCON; __sfr __at (0xD9) CMOD; __sfr __at (0xDA) CCAPM0; __sfr __at (0xDB) CCAPM1; __sfr __at (0xDC) CCAPM2; __sfr __at (0xDD) CCAPM3; __sfr __at (0xEA) CCAP0L; __sfr __at (0xEB) CCAP1L; __sfr __at (0xEC) CCAP2L; __sfr __at (0xED) CCAP3L; __sfr __at (0xF2) PCA_PWM0; __sfr __at (0xF3) PCA_PWM1; __sfr __at (0xF4) PCA_PWM2; __sfr __at (0xF5) PCA_PWM3; /* ─────────────── IAP (用于模拟 EEPROM) ─────────────── */ __sfr __at (0xC1) WDT_CONTR; __sfr __at (0xC2) IAP_DATA; __sfr __at (0xC3) IAP_ADDRH; __sfr __at (0xC4) IAP_ADDRL; __sfr __at (0xC5) IAP_CMD; __sfr __at (0xC6) IAP_TRIG; __sfr __at (0xC7) IAP_CONTR; __sfr __at (0xF7) IAP_TPS; #define IAP_CMD_IDLE 0 #define IAP_CMD_READ 1 #define IAP_CMD_WRITE 2 #define IAP_CMD_ERASE 3 /* ─────────────── 时钟配置 XFR ─────────────── */ #define CLKSEL_X 0xFE00 #define CLKDIV_X 0xFE01 #define HIRCCR_X 0xFE02 #define IRC32KCR_X 0xFE04 #define IRCBAND 0x9D __sfr __at (0x9D) IRCBAND_REG; /* ─────────────── 比较器 / 其他 ─────────────── */ __sfr __at (0xAE) TA; /* 写 0xAA,0x55 解锁特殊寄存器 */ __sfr __at (0xE6) CMPCR1; __sfr __at (0xE7) CMPCR2; /* ─────────────── 中断向量号 (SDCC 用地址) ─────────────── * SDCC for 8051: __interrupt (addr) 直接写中断向量地址 */ #define INT_ADDR_EXT0 0x0003 #define INT_ADDR_T0 0x000B #define INT_ADDR_EXT1 0x0013 #define INT_ADDR_T1 0x001B #define INT_ADDR_UART1 0x0023 #define INT_ADDR_ADC 0x002B #define INT_ADDR_PCA 0x0033 #define INT_ADDR_UART2 0x003B #define INT_ADDR_SPI 0x0043 #define INT_ADDR_EXT2 0x004B #define INT_ADDR_EXT3 0x0053 #define INT_ADDR_T2 0x005B #define INT_ADDR_CAN 0x0063 #define INT_ADDR_PWM 0x006B /* PWMA 中断 */ #define INT_ADDR_EXT4 0x0073 #define INT_ADDR_UART3 0x007B #define INT_ADDR_UART4 0x0083 #define INT_ADDR_T3 0x008B #define INT_ADDR_T4 0x0093 #define INT_ADDR_CMP 0x009B #define INT_ADDR_I2C 0x00A3 #define INT_ADDR_USB 0x00AB /* ─────────────── 8051 类型别名 ─────────────── */ typedef unsigned char uint8_t; typedef signed char int8_t; typedef unsigned short uint16_t; typedef signed short int16_t; typedef unsigned long uint32_t; typedef signed long int32_t; typedef __bit bool_t; /* 内存区域 */ #define DATA_SEG __data #define XDATA_SEG __xdata #define IDATA_SEG __idata #define PDATA_SEG __pdata #define CODE_SEG __code /* 常用宏 */ #define NOP() __asm__("nop") #define DISABLE_INT() EA = 0 #define ENABLE_INT() EA = 1 #define CRITICAL(x) { EA = 0; x; EA = 1; } /* XFR 访问宏: P_SW2 |= 0x80 后访问 0xFE00+ 地址 */ #define XFR_ADDR(addr) ((volatile uint8_t __xdata *)(addr)) #endif /* __STC8H_H */