找回密码
 立即注册
查看: 36|回复: 6

求大神帮看AI8G1K08-8pin掉电没记忆功能是什么问题

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2025-07-05 09:20:36
已绑定手机

2

主题

1

回帖

12

积分

新手上路

积分
12
发表于 4 小时前 来自手机 | 显示全部楼层 |阅读模式
#include <STC8G1K08.h>
#include <intrins.h>

// 定义引脚
#define KEY_PIN     P54     // 按键输入引脚(P5.4)
#define PWM_PIN     P33     // PWM输出引脚(P3.3)
#define CTRL_PIN    P55     // 控制输出引脚P5.5
#define TIMER_PIN   P32     // 定时器输出引脚P3.2

// 定义PWM参数
#define PWM_FREQ    10000   // 目标PWM频率(Hz)
#define PWM_RES     100     // PWM分辨率(0-100)

// 自定义每个档位的占空比值(0-100)
const unsigned char duty_cycle_table[9] = {
    0,      // 档位0: 0%占空比(完全关闭)
    1,      // 档位1: 1%占空比(微调)
    3,      // 档位2: 3%占空比
    6,      // 档位3: 6%占空比
    10,     // 档位4: 10%占空比
    20,     // 档位5: 20%占空比
    35,     // 档位6: 35%占空比
    55,     // 档位7: 55%占空比
    90      // 档位8: 90%占空比
};

// 全局变量
unsigned char pwm_level = 0;      // 当前PWM档位(0-8)
unsigned int pwm_count = 0;       // PWM计数器
unsigned char key_state = 0;      // 按键状态
unsigned int key_press_time = 0;  // 按键按下时间
unsigned int long_press_time = 0; // 长按时间计数器
bit timer_mode = 0;               // 定时器模式标志
unsigned long timer_counter = 0;  // 定时器计数器(32位)
bit long_press_handled = 0;       // 长按事件已处理标志
unsigned int idle_time = 0;       // 按键无操作时间计数器

// 延时函数(ms)
void DelayMs(unsigned int ms) {
    unsigned int i, j;
    for(i = 0; i < ms; i++)
        for(j = 0; j < 1200; j++);  // 根据晶振频率调整
}

// 向EEPROM写入一个字节数据
void EEPROM_WriteByte(unsigned char addr, unsigned char dat) {
    IAP_CONTR = 0x83; // 开启IAP功能
    IAP_DATA = dat;
    IAP_ADDRH = (unsigned char)(addr >> 8);
    IAP_ADDRL = (unsigned char)addr;
    IAP_CMD = 2;
    IAP_TRIG = 0x5A;
    IAP_TRIG = 0xA5;
    _nop_();
    IAP_CONTR = 0; // 关闭IAP功能
}

// 从EEPROM读取一个字节数据
unsigned char EEPROM_ReadByte(unsigned char addr) {
    IAP_CONTR = 0x83; // 开启IAP功能
    IAP_ADDRH = (unsigned char)(addr >> 8);
    IAP_ADDRL = (unsigned char)addr;
    IAP_CMD = 1;
    IAP_TRIG = 0x5A;
    IAP_TRIG = 0xA5;
    _nop_();
    IAP_CONTR = 0; // 关闭IAP功能
    return IAP_DATA;
}

// 系统初始化
void SystemInit() {
    // 开启IAP功能
    IAP_CONTR = 0x83;

    // 读取EEPROM中的PWM档位
    pwm_level = EEPROM_ReadByte(0x00);
    if(pwm_level > 8) {
        pwm_level = 0;  // 确保档位在有效范围内
    }

    // 关闭IAP功能
    IAP_CONTR = 0;

    // 设置引脚模式
    P5M1 |= 0x10;   // P5.4设置为浮空输入(内部下拉)
    P5M0 &= ~0x10;

    P3M1 &= ~0x08;  // P3.3设置为推挽输出
    P3M0 |= 0x08;

    P5M1 &= ~0x20;  // P5.5设置为推挽输出
    P5M0 |= 0x20;

    P3M1 &= ~0x04;  // P3.2设置为推挽输出
    P3M0 |= 0x04;

    // 初始化定时器0(用于PWM和按键检测)
    TMOD &= 0xF0;   // 设置定时器0为模式1
    TMOD |= 0x01;

    // 计算定时器初值以实现10kHz PWM频率
    TH0 = 0xFF;     // 定时器初值高字节
    TL0 = 0xA4;     // 定时器初值低字节

    ET0 = 1;        // 使能定时器中断
    TR0 = 1;        // 启动定时器

    // 开启总中断
    EA = 1;
}

// 定时器0中断服务函数(0.1ms)
void Timer0_ISR() interrupt 1 {
    // 重新加载初值
    TH0 = 0xFF;
    TL0 = 0xA4;

    // PWM计数器递增
    pwm_count++;
    if(pwm_count >= PWM_RES) {
        pwm_count = 0;
        // 只有非0档位才输出高电平
        if(pwm_level > 0) {
            PWM_PIN = 1;
        } else {
            PWM_PIN = 0;
        }
    }

    // 根据当前档位从查表获取占空比值
    if(pwm_level > 0 && pwm_count >= duty_cycle_table[pwm_level]) {
        PWM_PIN = 0;  // 达到占空比时输出低电平
    }

    // 按键扫描(防抖处理)
    if(KEY_PIN) {
        if(key_press_time == 0) {
            long_press_handled = 0;  // 新的按键按下,重置长按处理标志
            idle_time = 0;           // 按键按下,重置无操作时间计数器
        }

        key_press_time++;
        if(key_press_time > 200) {  // 防抖时间(20ms)
            key_state = 1;  // 确认按键按下
            long_press_time++;  // 长按时间计数

            // 检测长按3秒
            if(long_press_time >= 30000 && !long_press_handled) {  // 3秒 = 30000 * 0.1ms
                timer_mode = !timer_mode;   // 切换定时器模式
                CTRL_PIN = timer_mode;      // 设置P5.5引脚状态

                if(!timer_mode) {
                    TIMER_PIN = 0;          // 关闭定时器模式时P3.2置低
                } else {
                    TIMER_PIN = 1;          // 启动定时器模式时P3.2置高
                    timer_counter = 0;      // 重置定时器计数器
                }

                long_press_time = 0;        // 重置长按计数器
                long_press_handled = 1;     // 标记长按事件已处理
            }
        }
    } else {
        if(key_state && key_press_time > 200 && !long_press_handled) {
            // 按键释放,处理短按事件(仅当长按事件未触发时)
            pwm_level++;
            if(pwm_level > 8) pwm_level = 0;  // 0-8档循环
            idle_time = 0;                    // 按键释放,重置无操作时间计数器
            EEPROM_WriteByte(0x00, pwm_level); // 保存当前的pwm_level到EEPROM
        }
        key_state = 0;
        key_press_time = 0;
        long_press_time = 0;  // 按键释放时重置长按计数器
    }

    // 无操作时间计数
    idle_time++;
    if(idle_time >= 50000) { // 5秒 = 50000 * 0.1ms
        // 将当前的pwm_level保存到EEPROM
        EEPROM_WriteByte(0x00, pwm_level);
        idle_time = 0; // 重置无操作时间计数器
    }

    // 定时器模式处理
    if(timer_mode) {
        timer_counter++;

        // 30分钟 = 18000000 * 0.1ms
        if(timer_counter >= 18000000) {
            TIMER_PIN = 0;  // 30分钟后P3.2置低
        }

        // 30分钟+1秒 = 18010000 * 0.1ms
        if(timer_counter >= 18010000) {
            TIMER_PIN = 1;  // 1秒后P3.2重新置高
            timer_counter = 0;  // 重置计数器,开始新的循环
        }
    }
}

// 主函数
void main() {
    SystemInit();  // 系统初始化

    // 初始状态
    CTRL_PIN = 0;
    TIMER_PIN = 0;

    while(1) {
        // 主循环可以添加其他处理代码
        // 按键处理已经在定时器中断中完成
    }
}
回复

使用道具 举报 送花

3

主题

473

回帖

-343

积分

等待验证会员

积分
-343
发表于 4 小时前 | 显示全部楼层
关于您提到的STC8G1K08-8pin在掉电后没有记忆功能的问题,首先需要明确的是,STC8G系列单片机本身具备EEPROM存储功能,可以用于保存用户数据。然而,在实际应用中,若出现“掉电没记忆”现象,可能涉及以下几个方面的原因:

一、EEPROM未正确使用

STC8G1K08内置了128字节的EEPROM,用于存储非易失性数据。如果程序中未对EEPROM进行读写操作,或读写逻辑存在错误,可能导致系统无法在掉电后恢复之前的状态。

建议检查以下内容:

1. 是否在初始化阶段调用EEInit()函数?  
   STC8系列单片机在使用EEPROM前需先调用初始化函数,否则可能无法正常访问。

2. 是否对EEPROM进行了正确的读写操作?  
   使用EEWriteByte()和EEReadByte()函数进行数据的写入与读取,确保地址范围在0x00~0x7F之间(共128字节)。

3. 是否在掉电前将状态信息写入EEPROM?  
   如果程序中没有在关机或断电前执行写入操作,EEPROM中的数据将不会被更新,导致掉电后恢复默认值。

二、电源管理配置问题

部分STC8系列芯片支持低功耗模式(如IDLE、STOP等),但若电源管理配置不当,可能导致芯片在进入低功耗模式时无法维持内部寄存器状态,从而影响EEPROM的读写行为。

建议检查以下内容:

1. 是否启用了正确的电源管理模式?  
   确保在低功耗模式下,EEPROM仍能正常工作,避免因供电不稳定导致数据丢失。

2. 是否在掉电前关闭了不必要的外设?  
   在掉电前应关闭所有非必要外设,以减少电流消耗并保证EEPROM的稳定写入。

三、程序逻辑设计问题

若您希望实现“掉电记忆”功能,通常需要在程序中加入状态保存机制。例如,在按键切换档位后,立即将当前档位值写入EEPROM;在系统启动时从EEPROM中读取上次保存的档位值并加载到变量中。

示例代码片段:
  1. c
  2. // 初始化EEPROM
  3. void InitEEPROM(void) {
  4.     EEInit();
  5.     pwmlevel = EEReadByte(0); // 从地址0读取上次保存的PWM档位
  6. }
  7. // 更新PWM档位并保存至EEPROM
  8. void UpdatePWMLevel(unsigned char newlevel) {
  9.     pwmlevel = newlevel;
  10.     EEWriteByte(0, pwmlevel); // 将当前档位写入EEPROM地址0
  11. }
复制代码

注意: EEPROM的写入次数有限(约10万次),频繁写入可能导致损坏,因此应尽量减少不必要的写入操作。

四、硬件连接或供电问题

若系统电源不稳定或掉电瞬间电压骤降,可能导致EEPROM写入失败或数据丢失。此外,若外部电源未提供足够的稳定性,也可能影响单片机的正常运行。

建议检查以下内容:

1. 电源是否稳定?  
   使用示波器检测电源电压波动情况,确保在掉电过程中电压变化不会影响EEPROM的写入。

2. 是否有备用电源或电容滤波?  
   可考虑在系统中添加大容量电容,为掉电瞬间提供短暂供电,确保EEPROM能够完成写入操作。

五、固件版本或芯片型号问题

不同批次的STC8G1K08可能存在不同的特性差异,某些旧版芯片可能存在EEPROM读写异常的情况。建议确认所使用的芯片是否为最新版本,并查阅官方文档确认相关功能支持情况。

综上所述,STC8G1K08-8pin掉电无记忆功能的问题,可能由EEPROM未正确使用、电源管理配置不当、程序逻辑缺失、硬件供电不稳定等多种因素引起。建议根据上述方向逐一排查,并结合实际应用场景优化代码逻辑与硬件设计,以实现稳定的掉电记忆功能。

[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:227
  • 最近打卡:2025-07-05 09:24:45
已绑定手机

74

主题

2074

回帖

4620

积分

荣誉版主

无情的代码机器

积分
4620
发表于 3 小时前 | 显示全部楼层
测试例程,不要构成两个擦除EEPROM选项

截图202507051019254183.jpg
截图202507051020103246.jpg
  1. #include "reg51.h"
  2. #include "intrins.h"
  3. #define FOSC        11059200UL
  4. #define BRT         (65536 - FOSC / 115200 / 4)
  5. sfr     P0M1    =   0x93;
  6. sfr     P0M0    =   0x94;
  7. sfr     P1M1    =   0x91;
  8. sfr     P1M0    =   0x92;
  9. sfr     P2M1    =   0x95;
  10. sfr     P2M0    =   0x96;
  11. sfr     P3M1    =   0xb1;
  12. sfr     P3M0    =   0xb2;
  13. sfr     P4M1    =   0xb3;
  14. sfr     P4M0    =   0xb4;
  15. sfr     P5M1    =   0xc9;
  16. sfr     P5M0    =   0xca;
  17. sfr     AUXR    =   0x8e;
  18. sfr     T2H     =   0xd6;
  19. sfr     T2L     =   0xd7;
  20. sfr     IAP_DATA    =   0xC2;
  21. sfr     IAP_ADDRH   =   0xC3;
  22. sfr     IAP_ADDRL   =   0xC4;
  23. sfr     IAP_CMD     =   0xC5;
  24. sfr     IAP_TRIG    =   0xC6;
  25. sfr     IAP_CONTR   =   0xC7;
  26. sfr     IAP_TPS     =   0xF5;
  27. void UartInit()
  28. {
  29.     SCON = 0x5a;
  30.     T2L = BRT;
  31.     T2H = BRT >> 8;
  32.     AUXR = 0x15;
  33. }
  34. void UartSend(char dat)
  35. {
  36.     while (!TI);
  37.     TI = 0;
  38.     SBUF = dat;
  39. }
  40. void IapIdle()
  41. {
  42.     IAP_CONTR = 0;                              //关闭IAP功能
  43.     IAP_CMD = 0;                                //清除命令寄存器
  44.     IAP_TRIG = 0;                               //清除触发寄存器
  45.     IAP_ADDRH = 0x80;                           //将地址设置到非IAP区域
  46.     IAP_ADDRL = 0;
  47. }
  48. char IapRead(int addr)
  49. {
  50.     char dat;
  51.     IAP_CONTR = 0x80;                           //使能IAP
  52.     IAP_TPS = 12;                               //设置等待参数12MHz
  53.     IAP_CMD = 1;                                //设置IAP读命令
  54.     IAP_ADDRL = addr;                           //设置IAP低地址
  55.     IAP_ADDRH = addr >> 8;                      //设置IAP高地址
  56.     IAP_TRIG = 0x5a;                            //写触发命令(0x5a)
  57.     IAP_TRIG = 0xa5;                            //写触发命令(0xa5)
  58.     _nop_();
  59.     dat = IAP_DATA;                             //读IAP数据
  60.     IapIdle();                                  //关闭IAP功能
  61.     return dat;
  62. }
  63. void IapProgram(int addr, char dat)
  64. {
  65.     IAP_CONTR = 0x80;                           //使能IAP
  66.     IAP_TPS = 12;                               //设置等待参数12MHz
  67.     IAP_CMD = 2;                                //设置IAP写命令
  68.     IAP_ADDRL = addr;                           //设置IAP低地址
  69.     IAP_ADDRH = addr >> 8;                      //设置IAP高地址
  70.     IAP_DATA = dat;                             //写IAP数据
  71.     IAP_TRIG = 0x5a;                            //写触发命令(0x5a)
  72.     IAP_TRIG = 0xa5;                            //写触发命令(0xa5)
  73.     _nop_();
  74.     IapIdle();                                  //关闭IAP功能
  75. }
  76. void IapErase(int addr)
  77. {
  78.     IAP_CONTR = 0x80;                           //使能IAP
  79.     IAP_TPS = 12;                               //设置等待参数12MHz
  80.     IAP_CMD = 3;                                //设置IAP擦除命令
  81.     IAP_ADDRL = addr;                           //设置IAP低地址
  82.     IAP_ADDRH = addr >> 8;                      //设置IAP高地址
  83.     IAP_TRIG = 0x5a;                            //写触发命令(0x5a)
  84.     IAP_TRIG = 0xa5;                            //写触发命令(0xa5)
  85.     _nop_();                                    //
  86.     IapIdle();                                  //关闭IAP功能
  87. }
  88. void main()
  89. {
  90.     P0M0 = 0x00;
  91.     P0M1 = 0x00;
  92.     P1M0 = 0x00;
  93.     P1M1 = 0x00;
  94.     P2M0 = 0x00;
  95.     P2M1 = 0x00;
  96.     P3M0 = 0x00;
  97.     P3M1 = 0x00;
  98.     P4M0 = 0x00;
  99.     P4M1 = 0x00;
  100.     P5M0 = 0x00;
  101.     P5M1 = 0x00;
  102.     UartInit();
  103.                 UartSend('S');
  104.     IapErase(0x0400);
  105.     UartSend(IapRead(0x0400));
  106.     IapProgram(0x0400, 0x12);
  107.     UartSend(IapRead(0x0400));
  108.     while (1);
  109. }
复制代码


三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2025-07-05 09:20:36
已绑定手机

2

主题

1

回帖

12

积分

新手上路

积分
12
发表于 2 小时前 | 显示全部楼层

掉电没记忆,求大神自己搭硬件试后再来解答

#include <STC8G1K08.h>
#include <intrins.h>

// 定义引脚
#define KEY_PIN     P54     // 按键输入引脚(P5.4)
#define PWM_PIN     P33     // PWM输出引脚(P3.3)
#define CTRL_PIN    P55     // 控制输出引脚P5.5
#define TIMER_PIN   P32     // 定时器输出引脚P3.2

// 定义PWM参数
#define PWM_FREQ    10000   // 目标PWM频率(Hz)
#define PWM_RES     100     // PWM分辨率(0-100)

// 自定义每个档位的占空比值(0-100)
const unsigned char duty_cycle_table[9] = {
    0,      // 档位0: 0%占空比(完全关闭)
    1,      // 档位1: 1%占空比(微调)
    3,      // 档位2: 3%占空比
    6,      // 档位3: 6%占空比
    10,     // 档位4: 10%占空比
    20,     // 档位5: 20%占空比
    35,     // 档位6: 35%占空比
    55,     // 档位7: 55%占空比
    90      // 档位8: 90%占空比
};

// 全局变量
unsigned char pwm_level = 0;      // 当前PWM档位(0-8)
unsigned int pwm_count = 0;       // PWM计数器
unsigned char key_state = 0;      // 按键状态
unsigned int key_press_time = 0;  // 按键按下时间
unsigned int long_press_time = 0; // 长按时间计数器
bit timer_mode = 0;               // 定时器模式标志
unsigned long timer_counter = 0;  // 定时器计数器(32位)
bit long_press_handled = 0;       // 长按事件已处理标志
unsigned int idle_time = 0;       // 按键无操作时间计数器

// 延时函数(ms)
void DelayMs(unsigned int ms) {
    unsigned int i, j;
    for(i = 0; i < ms; i++)
        for(j = 0; j < 1200; j++);  // 根据晶振频率调整
}

// 向EEPROM写入一个字节数据
void EEPROM_WriteByte(unsigned char addr, unsigned char dat) {
    IAP_CONTR = 0x83; // 开启IAP功能
    IAP_DATA = dat;
    IAP_ADDRH = (unsigned char)(addr >> 8);
    IAP_ADDRL = (unsigned char)addr;
    IAP_CMD = 2;
    IAP_TRIG = 0x5A;
    IAP_TRIG = 0xA5;
    _nop_();
    IAP_CONTR = 0; // 关闭IAP功能
}

// 从EEPROM读取一个字节数据
unsigned char EEPROM_ReadByte(unsigned char addr) {
    IAP_CONTR = 0x83; // 开启IAP功能
    IAP_ADDRH = (unsigned char)(addr >> 8);
    IAP_ADDRL = (unsigned char)addr;
    IAP_CMD = 1;
    IAP_TRIG = 0x5A;
    IAP_TRIG = 0xA5;
    _nop_();
    IAP_CONTR = 0; // 关闭IAP功能
    return IAP_DATA;
}

// 系统初始化
void SystemInit() {
    // 开启IAP功能
    IAP_CONTR = 0x83;

    // 读取EEPROM中的PWM档位
    pwm_level = EEPROM_ReadByte(0x00);
    if(pwm_level > 8) {
        pwm_level = 0;  // 确保档位在有效范围内
    }

    // 关闭IAP功能
    IAP_CONTR = 0;

    // 设置引脚模式
    P5M1 |= 0x10;   // P5.4设置为浮空输入(内部下拉)
    P5M0 &= ~0x10;

    P3M1 &= ~0x08;  // P3.3设置为推挽输出
    P3M0 |= 0x08;

    P5M1 &= ~0x20;  // P5.5设置为推挽输出
    P5M0 |= 0x20;

    P3M1 &= ~0x04;  // P3.2设置为推挽输出
    P3M0 |= 0x04;

    // 初始化定时器0(用于PWM和按键检测)
    TMOD &= 0xF0;   // 设置定时器0为模式1
    TMOD |= 0x01;

    // 计算定时器初值以实现10kHz PWM频率
    TH0 = 0xFF;     // 定时器初值高字节
    TL0 = 0xA4;     // 定时器初值低字节

    ET0 = 1;        // 使能定时器中断
    TR0 = 1;        // 启动定时器

    // 开启总中断
    EA = 1;
}

// 定时器0中断服务函数(0.1ms)
void Timer0_ISR() interrupt 1 {
    // 重新加载初值
    TH0 = 0xFF;
    TL0 = 0xA4;

    // PWM计数器递增
    pwm_count++;
    if(pwm_count >= PWM_RES) {
        pwm_count = 0;
        // 只有非0档位才输出高电平
        if(pwm_level > 0) {
            PWM_PIN = 1;
        } else {
            PWM_PIN = 0;
        }
    }

    // 根据当前档位从查表获取占空比值
    if(pwm_level > 0 && pwm_count >= duty_cycle_table[pwm_level]) {
        PWM_PIN = 0;  // 达到占空比时输出低电平
    }

    // 按键扫描(防抖处理)
    if(KEY_PIN) {
        if(key_press_time == 0) {
            long_press_handled = 0;  // 新的按键按下,重置长按处理标志
            idle_time = 0;           // 按键按下,重置无操作时间计数器
        }

        key_press_time++;
        if(key_press_time > 200) {  // 防抖时间(20ms)
            key_state = 1;  // 确认按键按下
            long_press_time++;  // 长按时间计数

            // 检测长按3秒
            if(long_press_time >= 30000 && !long_press_handled) {  // 3秒 = 30000 * 0.1ms
                timer_mode = !timer_mode;   // 切换定时器模式
                CTRL_PIN = timer_mode;      // 设置P5.5引脚状态

                if(!timer_mode) {
                    TIMER_PIN = 0;          // 关闭定时器模式时P3.2置低
                } else {
                    TIMER_PIN = 1;          // 启动定时器模式时P3.2置高
                    timer_counter = 0;      // 重置定时器计数器
                }

                long_press_time = 0;        // 重置长按计数器
                long_press_handled = 1;     // 标记长按事件已处理
            }
        }
    } else {
        if(key_state && key_press_time > 200 && !long_press_handled) {
            // 按键释放,处理短按事件(仅当长按事件未触发时)
            pwm_level++;
            if(pwm_level > 8) pwm_level = 0;  // 0-8档循环
            idle_time = 0;                    // 按键释放,重置无操作时间计数器
            EEPROM_WriteByte(0x00, pwm_level); // 保存当前的pwm_level到EEPROM
        }
        key_state = 0;
        key_press_time = 0;
        long_press_time = 0;  // 按键释放时重置长按计数器
    }

    // 无操作时间计数
    idle_time++;
    if(idle_time >= 50000) { // 5秒 = 50000 * 0.1ms
        // 将当前的pwm_level保存到EEPROM
        EEPROM_WriteByte(0x00, pwm_level);
        idle_time = 0; // 重置无操作时间计数器
    }

    // 定时器模式处理
    if(timer_mode) {
        timer_counter++;

        // 30分钟 = 18000000 * 0.1ms
        if(timer_counter >= 18000000) {
            TIMER_PIN = 0;  // 30分钟后P3.2置低
        }

        // 30分钟+1秒 = 18010000 * 0.1ms
        if(timer_counter >= 18010000) {
            TIMER_PIN = 1;  // 1秒后P3.2重新置高
            timer_counter = 0;  // 重置计数器,开始新的循环
        }
    }
}

// 主函数
void main() {
    SystemInit();  // 系统初始化

    // 初始状态
    CTRL_PIN = 0;
    TIMER_PIN = 0;

    while(1) {
        // 主循环可以添加其他处理代码
        // 按键处理已经在定时器中断中完成
    }
}


回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:118
  • 最近打卡:2025-07-05 11:06:27

746

主题

1万

回帖

1万

积分

管理员

积分
17449
发表于 2 小时前 | 显示全部楼层
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2025-07-05 09:20:36
已绑定手机

2

主题

1

回帖

12

积分

新手上路

积分
12
发表于 22 分钟前 | 显示全部楼层
按键设置好后,保存当前设置就是了,不是一定要掉电才保存。帮我看代码有没有问题

点评

有问题,写之前没擦除。上面放了例程和实测截图。用例程测试,对比例程修改。  详情 回复 发表于 18 分钟前
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:227
  • 最近打卡:2025-07-05 09:24:45
已绑定手机

74

主题

2074

回帖

4620

积分

荣誉版主

无情的代码机器

积分
4620
发表于 18 分钟前 | 显示全部楼层
xinnin*** 发表于 2025-7-5 13:08
按键设置好后,保存当前设置就是了,不是一定要掉电才保存。帮我看代码有没有问题 ...

有问题,写之前没擦除。上面放了例程和实测截图。用例程测试,对比例程修改。
三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-7-5 13:30 , Processed in 0.120615 second(s), 91 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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