找回密码
 立即注册
查看: 179|回复: 10

stc8a4k32s2a12单片机库函数 | STC8A8K64D4 无 STC8A8K64S4A12

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2026-06-04 16:55:28

1

主题

4

回帖

21

积分

新手上路

积分
21
发表于 2026-5-29 22:36:48 | 显示全部楼层 |阅读模式
新人第一帖,急求库函数。。。。官网下的8a8k64d4,库函数,增强pwm没法用,有没有大佬能提供一下库函数,
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:866
  • 最近打卡:2026-07-22 00:28:47
已绑定手机

19

主题

3461

回帖

7738

积分

论坛元老

积分
7738
发表于 2026-5-29 23:03:50 | 显示全部楼层
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2026-06-04 16:55:28

1

主题

4

回帖

21

积分

新手上路

积分
21
发表于 2026-5-30 12:06:49 | 显示全部楼层
so*** 发表于 2026-5-29 23:03
逐飞科技STC8A8K64S4开源库这个可以看下

谢谢!还有个问题 我想直接在8a8kd4库基础上直接改不知道方不方便,不想再移植了,怕还有其他两个库对不上的地方
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:467
  • 最近打卡:2026-07-21 09:31:46

851

主题

1万

回帖

2万

积分

管理员

积分
24394
发表于 2026-5-30 16:22:02 | 显示全部楼层
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:956
  • 最近打卡:2026-07-21 08:27:41

14

主题

1400

回帖

7694

积分

论坛元老

积分
7694
发表于 2026-5-30 18:25:46 | 显示全部楼层
米*** 发表于 2026-5-30 12:06
谢谢!还有个问题 我想直接在8a8kd4库基础上直接改不知道方不方便,不想再移植了,怕还有其他两个库对不 ...

15 位增强型 PWM
STC8A8K64D4 系列的增强型 PWM 相关 SFR 地址与 STC8A8K64S4A12 系列不兼容。

只改这个 STC8A_PWM15bit.c 应该可以
  1. //15 位增强型 PWM
  2. //STC8A8K64D4 系列的增强型 PWM 相关 SFR 地址与 STC8A8K64S4A12 系列不兼容。
  3. #include        "STC8A_PWM15bit.h"
  4. u16 code PWMxCR[8] = {
  5.         0xff04,                /* PWM0CR */
  6.         0xff14,                /* PWM1CR */
  7.         0xff24,                /* PWM2CR */
  8.         0xff34,                /* PWM3CR */
  9.         0xff44,                /* PWM4CR */
  10.         0xff54,                /* PWM5CR */
  11.         0xff64,                /* PWM6CR */
  12.         0xff74,                /* PWM7CR */
  13. };
  14. u16 code PWMxT1[8] = {
  15.         0xff00,                /* PWM0T1 */
  16.         0xff10,                /* PWM1T1 */
  17.         0xff20,                /* PWM2T1 */
  18.         0xff30,                /* PWM3T1 */
  19.         0xff40,                /* PWM4T1 */
  20.         0xff50,                /* PWM5T1 */
  21.         0xff60,                /* PWM6T1 */
  22.         0xff70,                /* PWM7T1 */
  23. };
  24. u16 code PWMxT2[8] = {
  25.         0xff02,                /* PWM0T2 */
  26.         0xff12,                /* PWM1T2 */
  27.         0xff22,                /* PWM2T2 */
  28.         0xff32,                /* PWM3T2 */
  29.         0xff42,                /* PWM4T2 */
  30.         0xff52,                /* PWM5T2 */
  31.         0xff62,                /* PWM6T2 */
  32.         0xff72,                /* PWM7T2 */
  33. };
  34. u16 code PWMxHLD[8] = {
  35.         0xff05,                /* PWM0HLD */
  36.         0xff15,                /* PWM1HLD */
  37.         0xff25,                /* PWM2HLD */
  38.         0xff35,                /* PWM3HLD */
  39.         0xff45,                /* PWM4HLD */
  40.         0xff55,                /* PWM5HLD */
  41.         0xff65,                /* PWM6HLD */
  42.         0xff75,                /* PWM7HLD */
  43. };
  44. //========================================================================
  45. // 函数: u8 PWMChannelCtrl(u8 PWM_id, u8 pwm_eno, u8 pwm_ini, u8 pwm_eni, u8 pwm_ent2i, u8 pwm_ent1i)
  46. // 描述: PWM通道控制寄存器设置.
  47. // 参数: PWM_id: PWM通道序号. 取值 0~7
  48. //                         pwm_eno:   pwm输出使能, 0设为GPIO, 1设为PWM输出.
  49. //                         pwm_cns:   pwm通道选择, PWM15_SW_P2, PWM15_SW_P1, PWM15_SW_P6.
  50. //                         pwm_ini:   pwm输出端的初始电平, 0为低电平, 1为高电平.
  51. //                         pwm_eni:   pwm通道中断使能控制, 0为关闭PWM中断, 1为使能PWM中断.
  52. //                         pwm_ent2i: pwm通道第二个触发点中断使能控制, 0为关闭PWM第二个触发点中断, 1为使能PWM第二个触发点中断.
  53. //                         pwm_ent1i: pwm通道第一个触发点中断使能控制, 0为关闭PWM第一个触发点中断, 1为使能PWM第一个触发点中断.
  54. // 返回: 成功返回 SUCCESS, 错误返回 FAIL.
  55. // 版本: V1.0, 2020-09-22
  56. //========================================================================
  57. u8        PWMChannelCtrl(u8 PWM_id, u8 pwm_eno, u8 pwm_cns, u8 pwm_ini, u8 pwm_eni, u8 pwm_ent2i, u8 pwm_ent1i)
  58. {
  59.         u8        xdata *pPWMxCR;
  60.        
  61.         if(PWM_id > PWM15_7)        return FAIL;        //id错误
  62.         if(pwm_eno > 1)        return FAIL;        //输出使能错误
  63.         if(pwm_ini > 1)        return FAIL;        //输出端的初始电平错误
  64.         if(pwm_eni > 1)        return FAIL;        //中断使能控制错误
  65.         if(pwm_ent2i > 1)        return FAIL;        //第二个触发点中断使能控制错误
  66.         if(pwm_ent1i > 1)        return FAIL;        //第一个触发点中断使能控制错误
  67.        
  68.         pPWMxCR = (u8 *)PWMxCR[PWM_id];
  69.         *pPWMxCR = (pwm_eno << 7) | (pwm_ini << 6) | (pwm_cns << 3) | (pwm_eni << 2) | (pwm_ent2i << 1) | pwm_ent1i;
  70.         return SUCCESS;
  71. }
  72. //========================================================================
  73. // 函数: u8 PWM15Duty(u8 PWM_id, u16 Period, u16 dutyL, u16 dutyH)
  74. // 描述: PWM 占空比设置.
  75. // 参数: PWM_id:  PWM通道序号. 取值 0~7
  76. //                         dutyL:   pwm输出低电平位置, 取值 0~0x7fff.
  77. //                         dutyH:   pwm输出高电平位置, 取值 0~0x7fff.
  78. // 返回: 成功返回 SUCCESS, 错误返回 FAIL.
  79. // 版本: V1.0, 2020-09-22
  80. //========================================================================
  81. u8        PWM15Duty(u8 PWM_id, u16 dutyL, u16 dutyH)
  82. {
  83.         u16        xdata *pPWMxT1;
  84.         u16        xdata *pPWMxT2;
  85.        
  86.         if(PWM_id > PWM15_7)        return FAIL;        //id错误
  87.         if(dutyL > 0x7fff)        return FAIL;        //低电平时间设置错误
  88.         if(dutyH > 0x7fff)        return FAIL;        //高电平时间设置错误
  89.        
  90.         pPWMxT1 = (u16 *)PWMxT1[PWM_id];
  91.         *pPWMxT1 = dutyL & 0x7fff;
  92.         pPWMxT2 = (u16 *)PWMxT2[PWM_id];
  93.         *pPWMxT2 = dutyH & 0x7fff;
  94.         return SUCCESS;
  95. }
  96. //========================================================================
  97. // 函数: u8        PWMLevelSet(u8 PWM_id, u8 pwm_hldl, u8 pwm_hldh)
  98. // 描述: PWM通道控制寄存器设置.
  99. // 参数: PWM_id: PWM通道序号. 取值 0~7
  100. //                         pwm_hldl:   pwm强制输出低电平控制位, 0正常输出, 1强制输出低电平.
  101. //                         pwm_hldh:   pwm强制输出高电平控制位, 0正常输出, 1强制输出高电平.
  102. // 返回: 成功返回 SUCCESS, 错误返回 FAIL.
  103. // 版本: V1.0, 2020-09-22
  104. //========================================================================
  105. u8        PWMLevelSet(u8 PWM_id, u8 pwm_hldl, u8 pwm_hldh)
  106. {
  107.         u8        xdata *pPWMxHLD;
  108.        
  109.         if(PWM_id > PWM15_7)        return FAIL;        //id错误
  110.         if(pwm_hldh > 1)        return FAIL;        //输出使能错误
  111.         if(pwm_hldl > 1)        return FAIL;        //输出端的初始电平错误
  112.        
  113.         pPWMxHLD = (u8 *)PWMxHLD[PWM_id];
  114.         *pPWMxHLD = (pwm_hldh << 1) | pwm_hldl;
  115.         return SUCCESS;
  116. }
  117. //========================================================================
  118. // 函数: u8        PWM15_Init(PWM15_InitTypeDef *PWMx)
  119. // 描述: 15位增强型PWM初始化程序.
  120. // 参数: PWMx: 结构参数,请参考头文件里的定义.
  121. // 返回: 成功返回 SUCCESS, 错误返回 FAIL.
  122. // 版本: V1.0, 2020-09-22
  123. //========================================================================
  124. u8        PWM15_Init(PWM15_InitTypeDef *PWMx)
  125. {
  126.         PWM15_PWM_Set(PWMx->PWM_Enable);        //使能/关闭 PWM0(包括 PWM00~PWM07)
  127.         PWM15_PS_Set(PWMx->PWM_Clock_PS);        //系统时钟分频参数,  0~15
  128.         PWM15_Clock_Sel(PWMx->PWM_Clock_Sel);        //PWMn时钟源选择
  129.         PWMC = PWMx->PWM_Period & 0x7fff;
  130.         PWM15_CounterInt_Set(PWMx->PWM_CInt);        //PWMn计数器归零中断使能设置
  131.         PWM15_Counter_Set(PWMx->PWM_Counter);        //PWMn计数器使能设置
  132.        
  133.         return SUCCESS;
  134. }
复制代码

回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2026-06-04 16:55:28

1

主题

4

回帖

21

积分

新手上路

积分
21
发表于 2026-6-1 12:13:26 | 显示全部楼层
angm*** 发表于 2026-5-30 18:25
15 位增强型 PWM
STC8A8K64D4 系列的增强型 PWM 相关 SFR 地址与 STC8A8K64S4A12 系列不兼容。

您好,能再提供一下头文件吗,单独改这个还是不行
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:956
  • 最近打卡:2026-07-21 08:27:41

14

主题

1400

回帖

7694

积分

论坛元老

积分
7694
发表于 2026-6-1 15:38:58 | 显示全部楼层
米*** 发表于 2026-6-1 12:13
您好,能再提供一下头文件吗,单独改这个还是不行

试一下这一个。

20-15位增强型PWM模式呼吸灯程序.zip (22.65 KB, 下载次数: 8)


回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2026-06-04 16:55:28

1

主题

4

回帖

21

积分

新手上路

积分
21
发表于 2026-6-2 10:34:39 | 显示全部楼层
angm*** 发表于 2026-6-1 15:38
试一下这一个。

感谢,例程没问题,其实最开始要用S4的库,现在直接换个库也是一堆报错,要慢慢改
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:956
  • 最近打卡:2026-07-21 08:27:41

14

主题

1400

回帖

7694

积分

论坛元老

积分
7694
发表于 2026-6-2 11:52:38 | 显示全部楼层
米*** 发表于 2026-6-2 10:34
感谢,例程没问题,其实最开始要用S4的库,现在直接换个库也是一堆报错,要慢慢改 ...

很高兴能够帮得上你,

附录V STC8A8K64D4 系列单片机取代 STC8A8K64S4A12 系列的注意事项

 I/O 口
STC8A8K64D4 系列单片机上电后, I/O 的模式与STC8A8K64S4A12 系列不一样。
STC8A8K64S4A12 系列单片机所有I/O 口上电后都是8051 的准双向口模式,而STC8A8K64D4 系
列单片机的I/O 中,除了ISP 下载脚P3.0/P3.1 为准双向口模式外,其余的所有I/O 口在上电后都是
高阻输入模式。
传统的8051 单片机上电后即为准双向口模式并输出高电平,经常有客户的系统中
使用I/O 驱动马达或者LED 灯,因此会出现单片机上电的瞬间马达会动一下或者LED 会闪一下。
STC8A8K64D4 系列的I/O 上电后为高阻输入模式,就可避免马达和LED 的这种误动作。
由于STC8A8K64D4 系列单片机的I/O 中,除了ISP 下载脚P3.0/P3.1 为准双向口模式外,其
余的所有I/O 口在上电后都是高阻输入模式,所以当用户需要STC8A8K64D4 系列的I/O 口向外输
出信号前,必须先使用PxM0 和PxM1 两个寄存器对I/O 的工作模式进行设置。

 复位脚
STC8A8K64D4 系列和STC8A8K64S4A12 系列的P5.4 口一般情况下是当作普通I/O 口使用的,
当用户在ISP 下载时设置了P5.4 为复位脚功能时,P5.4 口则为单片机的复位脚(RESET 脚)。对于
STC8A8K64S4A12 系列,复位脚为高电平时单片机处于复位状态,低电平时单片机解除复位状态。
而STC8A8K64D4 系列与STC8A8K64S4A12 系列的复位电平是向反的,即对于STC8A8K64D4 系
列,复位脚为低电平时,单片机处于复位状态,高电平时单片机解除复位状态。

所以当用户使能P5.4 口的复位脚功能是需要注意复位电平的问题。

 EEPROM
STC8A8K64S4A12 系列的EEPROM 擦除和编程的等待时间用寄存器IAP_CONTR 的Bit2-Bit0
设置,设置的只是一个大概的频率范围值,STC8A8K64D4 系列新增了一个寄存器IAP_TPS(SFR
地址:0F5H),专用于设置EEPROM 擦除和编程的等待时间,
且用户不需要去计算,只需要根据
当前CPU 的工作频率,直接填入IAP_TPS 即可,硬件会自动计算等待时间。(比如:当前CPU 的
工作频率为24MHz,则只需要向IAP_TPS 填入24 即可)

 ADC
STC8A8K64D4 系列的ADC 在功能上完全覆盖兼容STC8A8K64S4A12 系列。STC8A8K64D4
系列在STC8A8K64S4A12 系列ADC的基础上新增了外部触发功能以及自动多次转换取平均值等新
功能。

 比较器
STC8A8K64D4 系列的比较器正端输入为4 路可选、负端输入为两路可选,输入选择设置在寄
存器CMPEXCFG 中。STC8A8K64S4A12 系列不一致。

 SPI
STC8A8K64D4 系列的4 种SPI 时钟频率分别:SYSclk/4、SYSclk/8、SYSclk/16 和SYSclk/2
STC8A8K64S4A12 系列的4 种SPI 时钟频率分别:SYSclk/4、SYSclk/8、SYSclk/16 和SYSclk/32

 PCA/CCP/PWM
STC8A8K64D4 系列的PCA 相关SFR 中,前3 组模块的SFR 与STC8A8K64S4A12 系列是相
同的,第4 组模块(PCA3/CCP3/PWM3)的控制寄存器在XFR 区域,与STC8A8K64S4A12 系列不
兼容。(具体为CCAPM3、CCAP3L、CCAP3H 和PCA_PWM3)

 15 位增强型PWM
STC8A8K64D4 系列的增强型PWM 相关SFR 地址与STC8A8K64S4A12 系列不兼容。



回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2026-06-04 16:55:28

1

主题

4

回帖

21

积分

新手上路

积分
21
发表于 2026-6-4 16:55:28 | 显示全部楼层
angm*** 发表于 2026-6-2 11:52
很高兴能够帮得上你,

附录V STC8A8K64D4 系列单片机取代 STC8A8K64S4A12 系列的注意事项

你好,还有新问题请教,pwm可以了之后,现在库函数里面外部中断2,只有不初始化增强型pwm才有用,初始化了就进不了中断,排查很久没进展
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-7-22 10:42 , Processed in 0.078780 second(s), 88 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表