vb2002
发表于 2024-6-29 21:21:44
lzl1okOK 发表于 2024-6-29 20:21
这个功能挺简单的
用了各种ai写代码,都写不出来
各种各样的问题.
劳您动动手?
vb2002
发表于 2024-6-29 22:15:13
soma 发表于 2024-6-29 19:03
也可以,阿里,百度都有,vscode插架可以自己生成代码。
按道理我这段代码,可以实现开机后,3秒内按下按键,换档
3秒后按下,关闭led
但是实际上,怎么都不行,一直是循环切换档位
0 123 0
vb2002
发表于 2024-6-29 22:15:33
soma 发表于 2024-6-29 19:03
也可以,阿里,百度都有,vscode插架可以自己生成代码。
代码在这
#include <STC8G.H>
#include "intrins.h"
sbit LED1=P3^3;
sbit KEY1=P3^2;
#define MAIN_Fosc 11059200UL
#define ON 0
#define OFF 1
typedef unsigned char u8;
typedef unsigned int u16;
u8 ld=0;
u8 gear = 0;
u16 noShiftTime = 0; // 自上次换挡以来的时间
void pwm_init(void);
void delayms(u16 ms);
void timer0_init();
void Timer0_Init(void) //1毫秒@11.0592MHz
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0xCD; //设置定时初始值
TH0 = 0xD4; //设置定时初始值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
}
void Timer0_ISR() interrupt 1 {
TL0 = 0xCD; //设置定时初始值
TH0 = 0xD4; //设置定时初始值
noShiftTime++;
if (noShiftTime >= 3000 / 1) {
noShiftTime = 0;
}
}
void main()
{
P0M0 = 0x00; P0M1 = 0x00; P1M0 = 0x00;P1M1 = 0x00;P2M0 = 0x00;P2M1 = 0x00; P4M0 = 0x00; P4M1 = 0x00; P5M0 = 0x00; P5M1 = 0x00;
P3M0 = 0x00; P3M1 = 0x00;
while(1)
{
timer0_init();
pwm_init();
if (KEY1 == 0) {
delayms(10);
if (KEY1 == 0) {
if (noShiftTime >= 3000 ) {
ld = 0; // 关闭LED
}
gear = (gear + 1) % 4; // 切换档位,循环回到0
while (!KEY1); // 等待按钮释放
noShiftTime = 0;
}
}
// 检查是否长时间未换挡
if (noShiftTime >= 3000) { // 如果2秒(或2000毫秒)未换挡
gear = 0; // 将档位重置为0或其他默认档位
ld = 0; // 关闭LED
noShiftTime = 0; // 重置计时器
}
switch (gear) {
case 0:
ld=0;
break;
case 1:
ld=15;
break;
case 2:
ld=135;
break;
case 3:
ld=255;
break;
}
delayms(10);
}
}
void pwm_init(void)
{
CCON = 0x00;
CMOD = 0x08;
CL = 0x00;
CH = 0x00;
CCAPM1 = 0x42;
PCA_PWM1 = 0x00;
CCAP1L = ld;
CCAP1H = ld;
CR=1;
// while(1);
}
void delayms(u16 ms)
{
u16 i;
do{
i = MAIN_Fosc /10000;
while(--i);
}while(--ms);
}
jkernet
发表于 2024-6-30 20:23:05
需求还是不太明确,根据你的描述来说,单击开机 长按增加亮度 长按减少亮度 单击关机,这些操作是固定的顺序吗?在我看来有点费解(体验很糟糕),单击和长按并不冲突啊?
vb2002
发表于 2024-6-30 20:49:46
jkernet 发表于 2024-6-30 20:23
需求还是不太明确,根据你的描述来说,单击开机 长按增加亮度 长按减少亮度 单击关机,这些操作是固定的顺序吗 ...
有款手电就是这个逻辑
蛮多手电都是这个操作逻辑,无级变档
jkernet
发表于 2024-6-30 20:59:30
vb2002 发表于 2024-6-30 20:49
有款手电就是这个逻辑
蛮多手电都是这个操作逻辑,无级变档
重点是它们都是固定操作顺序?比如关机不能随时关机?一定是在长按减少亮度之后?
vb2002
发表于 2024-6-30 21:12:00
jkernet 发表于 2024-6-30 20:59
重点是它们都是固定操作顺序?比如关机不能随时关机?一定是在长按减少亮度之后? ...
很随意的
比如我现在单击就开机了,开机状态就是上次关机时的亮度
单击开机,长按增加亮度还是降低亮度,看上次用的哪个,随时调整的,比如我现在从 1%亮度加到5%亮度,松开,再按,就是从5%亮度往下降. 降到一定的亮度比如1%最低,就闪一下,然后停止,再按着不动,就是网上慢慢增加,增加到100%,闪一下.
随时单击就关机了.
vb2002
发表于 2024-6-30 21:15:30
jkernet 发表于 2024-6-30 20:59
重点是它们都是固定操作顺序?比如关机不能随时关机?一定是在长按减少亮度之后? ...
其实还有很多功能,可以用,比如双击极亮,三击爆闪,四击检测电量,6击换模式 另一个模式就是1234档, 1档 1%亮度 2档10%亮度,3档50% ,4档100%
8击锁定手电,锁定以后打不开手电.必须再按8下才能解锁
还有更复杂的安德鲁系统..
jkernet
发表于 2024-6-30 22:11:18
vb2002 发表于 2024-6-30 21:15
其实还有很多功能,可以用,比如双击极亮,三击爆闪,四击检测电量,6击换模式 另一个模式就是1234档, 1档 1%亮 ...
这么多状态的话,那就得写个状态机了,不然代码比较凌乱.
lzzasd
发表于 2024-7-2 22:21:12
很简单啊 自己研究下就出来了