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

很简单啊    自己研究下就出来了
页: 1 [2] 3
查看完整版本: 弄到一半不会弄了.有什么黑科技可以自动完成吗