求大神帮看AI8G1K08-8pin掉电没记忆功能是什么问题 |已解决
#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 = {
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_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) {
// 主循环可以添加其他处理代码
// 按键处理已经在定时器中断中完成
}
} 关于您提到的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中读取上次保存的档位值并加载到变量中。
示例代码片段:
c
// 初始化EEPROM
void InitEEPROM(void) {
EEInit();
pwmlevel = EEReadByte(0); // 从地址0读取上次保存的PWM档位
}
// 更新PWM档位并保存至EEPROM
void UpdatePWMLevel(unsigned char newlevel) {
pwmlevel = newlevel;
EEWriteByte(0, pwmlevel); // 将当前档位写入EEPROM地址0
}
注意: EEPROM的写入次数有限(约10万次),频繁写入可能导致损坏,因此应尽量减少不必要的写入操作。
四、硬件连接或供电问题
若系统电源不稳定或掉电瞬间电压骤降,可能导致EEPROM写入失败或数据丢失。此外,若外部电源未提供足够的稳定性,也可能影响单片机的正常运行。
建议检查以下内容:
1. 电源是否稳定?
使用示波器检测电源电压波动情况,确保在掉电过程中电压变化不会影响EEPROM的写入。
2. 是否有备用电源或电容滤波?
可考虑在系统中添加大容量电容,为掉电瞬间提供短暂供电,确保EEPROM能够完成写入操作。
五、固件版本或芯片型号问题
不同批次的STC8G1K08可能存在不同的特性差异,某些旧版芯片可能存在EEPROM读写异常的情况。建议确认所使用的芯片是否为最新版本,并查阅官方文档确认相关功能支持情况。
综上所述,STC8G1K08-8pin掉电无记忆功能的问题,可能由EEPROM未正确使用、电源管理配置不当、程序逻辑缺失、硬件供电不稳定等多种因素引起。建议根据上述方向逐一排查,并结合实际应用场景优化代码逻辑与硬件设计,以实现稳定的掉电记忆功能。
[本文内容由国芯人工智能辅助生成,仅供参考] 测试例程,不要构成两个擦除EEPROM选项
#include "reg51.h"
#include "intrins.h"
#define FOSC 11059200UL
#define BRT (65536 - FOSC / 115200 / 4)
sfr P0M1 = 0x93;
sfr P0M0 = 0x94;
sfr P1M1 = 0x91;
sfr P1M0 = 0x92;
sfr P2M1 = 0x95;
sfr P2M0 = 0x96;
sfr P3M1 = 0xb1;
sfr P3M0 = 0xb2;
sfr P4M1 = 0xb3;
sfr P4M0 = 0xb4;
sfr P5M1 = 0xc9;
sfr P5M0 = 0xca;
sfr AUXR = 0x8e;
sfr T2H = 0xd6;
sfr T2L = 0xd7;
sfr IAP_DATA = 0xC2;
sfr IAP_ADDRH = 0xC3;
sfr IAP_ADDRL = 0xC4;
sfr IAP_CMD = 0xC5;
sfr IAP_TRIG = 0xC6;
sfr IAP_CONTR = 0xC7;
sfr IAP_TPS = 0xF5;
void UartInit()
{
SCON = 0x5a;
T2L = BRT;
T2H = BRT >> 8;
AUXR = 0x15;
}
void UartSend(char dat)
{
while (!TI);
TI = 0;
SBUF = dat;
}
void IapIdle()
{
IAP_CONTR = 0; //关闭IAP功能
IAP_CMD = 0; //清除命令寄存器
IAP_TRIG = 0; //清除触发寄存器
IAP_ADDRH = 0x80; //将地址设置到非IAP区域
IAP_ADDRL = 0;
}
char IapRead(int addr)
{
char dat;
IAP_CONTR = 0x80; //使能IAP
IAP_TPS = 12; //设置等待参数12MHz
IAP_CMD = 1; //设置IAP读命令
IAP_ADDRL = addr; //设置IAP低地址
IAP_ADDRH = addr >> 8; //设置IAP高地址
IAP_TRIG = 0x5a; //写触发命令(0x5a)
IAP_TRIG = 0xa5; //写触发命令(0xa5)
_nop_();
dat = IAP_DATA; //读IAP数据
IapIdle(); //关闭IAP功能
return dat;
}
void IapProgram(int addr, char dat)
{
IAP_CONTR = 0x80; //使能IAP
IAP_TPS = 12; //设置等待参数12MHz
IAP_CMD = 2; //设置IAP写命令
IAP_ADDRL = addr; //设置IAP低地址
IAP_ADDRH = addr >> 8; //设置IAP高地址
IAP_DATA = dat; //写IAP数据
IAP_TRIG = 0x5a; //写触发命令(0x5a)
IAP_TRIG = 0xa5; //写触发命令(0xa5)
_nop_();
IapIdle(); //关闭IAP功能
}
void IapErase(int addr)
{
IAP_CONTR = 0x80; //使能IAP
IAP_TPS = 12; //设置等待参数12MHz
IAP_CMD = 3; //设置IAP擦除命令
IAP_ADDRL = addr; //设置IAP低地址
IAP_ADDRH = addr >> 8; //设置IAP高地址
IAP_TRIG = 0x5a; //写触发命令(0x5a)
IAP_TRIG = 0xa5; //写触发命令(0xa5)
_nop_(); //
IapIdle(); //关闭IAP功能
}
void main()
{
P0M0 = 0x00;
P0M1 = 0x00;
P1M0 = 0x00;
P1M1 = 0x00;
P2M0 = 0x00;
P2M1 = 0x00;
P3M0 = 0x00;
P3M1 = 0x00;
P4M0 = 0x00;
P4M1 = 0x00;
P5M0 = 0x00;
P5M1 = 0x00;
UartInit();
UartSend('S');
IapErase(0x0400);
UartSend(IapRead(0x0400));
IapProgram(0x0400, 0x12);
UartSend(IapRead(0x0400));
while (1);
}
掉电没记忆,求大神自己搭硬件试后再来解答
,EEPROM的使用 请 配合比较器做掉电检测 - EEPROM/DataFlash 国芯技术交流网站 - AI32位8051交流社区
STC8G1K08-38I-TSSOP20/SOP16, 有比较器,可以做掉电检测
按键设置好后,保存当前设置就是了,不是一定要掉电才保存。帮我看代码有没有问题 xinningkeji 发表于 2025-7-5 13:08
按键设置好后,保存当前设置就是了,不是一定要掉电才保存。帮我看代码有没有问题 ...
有问题,写之前没擦除。上面放了例程和实测截图。用例程测试,对比例程修改。 换个地址写就好了
上来遍历完你要写的地址,
然后依次写,写完就整体擦除 解决了,以下是有记忆的代码。
#include <STC8G1K08.h>
#include <intrins.h>
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
// 定义引脚
#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 = {
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; // 按键无操作时间计数器
#defineIAP_OFFSET 0x2000//STC8G1K08
// 延时函数(ms)
void DelayMs(unsigned int ms) {
unsigned int i, j;
for(i = 0; i < ms; i++)
for(j = 0; j < 1200; j++);// 根据晶振频率调整
}
//********以下是EEPROM操作函数,全部通过,无需再改
//关闭ISP/IAP/EEPROM功能
void EEPROM_IDLE(void)
{
IAP_CONTR = 0; //关闭IAP功能
IAP_CMD = 0; //standby模式
IAP_TRIG= 0; //清触发寄存器
IAP_ADDRH = 0x80; //指向非EEPROM地址区,防止误操作
IAP_ADDRL = 0;
}
//从指定的EEPROM地址Eeprom_Addr读取一个字节
uchar EEPROM_READ(uint Eeprom_Addr)
{
uchar dat;
IAP_CONTR = 0x80; //使能IAP
IAP_TPS = 12; // 设置擦除等待参数 12MHz
IAP_CMD = 1; //读命令
IAP_ADDRL = Eeprom_Addr; //地址低8位
IAP_ADDRH = Eeprom_Addr>>8; //地址高8位
IAP_TRIG = 0x5a; //触发命令
IAP_TRIG = 0xa5;
_nop_();
dat = IAP_DATA; //读取EEPROM数据
EEPROM_IDLE(); //关闭IAP
return dat;
}
//说明:Eeprom_Addr写入一个字节
//注意,在此之前一定要先擦除扇区
void EEPROM_WRITE(uint Eeprom_Addr, uchar dat)
{
IAP_CONTR = 0x80; //使能IAP
IAP_TPS = 12; // 设置擦除等待参数 12MHz
IAP_CMD = 2; //编程命令
IAP_ADDRL = Eeprom_Addr; //地址低8位
IAP_ADDRH = Eeprom_Addr>>8; //地址高8位
IAP_DATA = dat; //写入数据
IAP_TRIG = 0x5a; //触发命令
IAP_TRIG = 0xa5;
_nop_();
EEPROM_IDLE(); //关闭IAP
}
//擦除扇区,Eeprom_Addr为扇区起始地址
void EEPROM_ERASE(uint Eeprom_Addr)
{
IAP_CONTR = 0x80;//使能IAP
IAP_TPS = 12; // 设置擦除等待参数 12MHz
IAP_CMD = 3; //擦除命令
IAP_ADDRL = Eeprom_Addr; //地址低8位
IAP_ADDRH = Eeprom_Addr>>8; //地址高8位
IAP_TRIG = 0x5a; //触发命令
IAP_TRIG = 0xa5;
_nop_();
EEPROM_IDLE(); //关闭IAP
}
void Save_Data(void)
{
EEPROM_ERASE(0x00);
EEPROM_WRITE(0x01,timer_mode);
EEPROM_WRITE(0x02,pwm_level);
}
void Read_Data(void)
{
unsigned char dat;
dat = EEPROM_READ(0x01);
dat = EEPROM_READ(0x02);
if(dat == 0xff&&dat == 0xff)
{
Save_Data();
}
else
{
pwm_level = dat;
timer_mode = dat;
CTRL_PIN = timer_mode;
if(!timer_mode) {
TIMER_PIN = 0; // 关闭定时器模式时P3.2置低
} else {
TIMER_PIN = 1; // 启动定时器模式时P3.2置高
timer_counter = 0; // 重置定时器计数器
}
}
}
// 系统初始化
void SystemInit(){
// 设置引脚模式
P5M1 |= 0x10; // P5.4设置为浮空输入(内部下拉)
P5M0 &= ~0x10;
P3M1 &= ~0x08;// P3.3设置为推挽输出
P3M0 |= 0x08;
P5M1 &= ~0x20;// P5.5设置为推挽输出
P5M0 |= 0x20;
P3M1 &= ~0x04;// P3.2设置为推挽输出
P3M0 |= 0x04;
// 明确将P33, P32, P55引脚置为低电平
PWM_PIN = 0;// P3.3
TIMER_PIN = 0; // P3.2,确保上电时P3.2为低电平
CTRL_PIN = 0;// P5.5
SCON = 0x50; //8位数据,可变波特率
AUXR &= 0xBF; //定时器1时钟为Fosc/12,即12T
AUXR &= 0xFE; //串口1选择定时器1为波特率发生器
TMOD &= 0x0F; //设定定时器1为16位自动重装方式
TL1 = 0xFE; //设定定时初值115200@11.0592MHZ
TH1 = 0xFF; //设定定时初值
ET1 = 0; //禁止定时器1中断
TR1 = 1; //启动定时器1
TI = 1; //允许串口中断,printf函数需要此条语句
// 初始化定时器0(用于PWM和按键检测)
TMOD &= 0xF0; // 设置定时器0为模式1
TMOD |= 0x01;
// 计算定时器初值以实现10kHz PWM频率
TH0 = 0xFF; // 定时器初值高字节
TL0 = 0xA4; // 定时器初值低字节
ET0 = 1; // 使能定时器中���
TR0 = 1; // 启动定时器
// 开启总中断
EA = 1;
// 读取EEPROM中的PWM档位
Read_Data();
if(pwm_level > 8) {
pwm_level = 0;// 确保档位在有效范围内
}
if(timer_mode) {
TIMER_PIN = 0;// 若处于定时器模式,确保P3.2初始为低电平
timer_counter = 0; // 重置定时器计数器,从0开始计时
}
}
// 定时器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_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引脚状态
Save_Data();
if(timer_mode) {
TIMER_PIN = 0; // 启动定时器模式时P3.2置低
timer_counter = 0; // 重置定时器计数器
} else {
TIMER_PIN = 0; // 关闭定时器模式时P3.2置低
}
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; // 按键释放,重置无操作时间计数器
Save_Data();
}
key_state = 0;
key_press_time = 0;
long_press_time = 0;// 按键释放时重置长按计数器
}
// 无操作时间计数
idle_time++;
if(idle_time >= 50000) { // 5秒 = 50000 * 0.1ms
// 将当前的pwm_level保存到EEPROM
// Save_Data();
idle_time = 0; // 重置无操作时间计数器
}
// 定时器模式处理
if(timer_mode) {
timer_counter++;
// 30分钟 = 18000000 * 0.1ms
if(timer_counter == 18000000) {
TIMER_PIN = 1;// 30分钟后P3.2置高
}
// 30分钟+1秒 = 18010000 * 0.1ms
if(timer_counter >= 18010000) {
TIMER_PIN = 0;// 1秒后P3.2重新置低
timer_counter = 0;// 重置计数器,开始新的循环
}
}
}
// 主函数
void main() {
// 上电时将所有相关引脚输出低电平
KEY_PIN = 0; // 按键输入引脚置低
PWM_PIN = 0; // PWM输出引脚(P3.3)置低
CTRL_PIN = 0; // 控制输出引脚置低
TIMER_PIN = 0;// 定时器输出引脚置低
// 延时500毫秒
DelayMs(500);
SystemInit();// 系统初始化
while(1) {
// 主循环可以添加其他处理代码
// 按键处理已经在定时器中断中完成
}
}
页:
[1]