vb2002 发表于 2024-6-29 11:39:58

弄到一半不会弄了.有什么黑科技可以自动完成吗

这个是做的个手电驱动

三档调pwm占空比
只能用作循环.0    10   35   95
想加一个 打开后, 选择一个亮度 比如10 的占空比,如果三秒后没有按键,再次按键关闭手电.   最好是下次开机继续保持当前关闭的档位(好像这个要用到eeprom)
#include <STC8G.H>
#include "intrins.h"


sbit LED1=P3^3;
sbit KEY1=P3^2;



#define MAIN_Fosc 11059200UL
#define        ON        0
#define        OFF        1
//#define ld 1

typedef unsigned char u8;
typedef unsigned int u16;

u8 ld=0;
u8 gear = 0;
u8 noShiftTime = 0; // 自上次换挡以来的时间

void pwm_init(void);
void delayms(u16 ms);       

void timer0_init() {
   
    TMOD &= 0xF0;
    TMOD |= 0x01;
    TH0 = (65536 - 50000) / 256;   
    TL0 = (65536 - 50000) % 256;
    ET0 = 1; // 开启Timer0中断
    EA = 1;// 开启全局中断
    TR0 = 1; // 启动Timer0
}

void Timer0_ISR() interrupt 1 {

    TH0 = (65536 - 50000) / 256;
    TL0 = (65536 - 50000) % 256;
    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 / 1) {
                  ld = 0; // 关闭LED
                        }
                       
                gear = (gear + 1) % 4; // 切换档位,循环回到0
                while (!KEY1); // 等待按钮释放
               noShiftTime = 0;        
            }
      }
         
      switch (gear) {
            case 0:

                        ld=0;
                break;
            case 1:

                ld=15;
                break;
            case 2:

                ld=35;
                break;
            case 3:
   
                ld=95;
                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);
}



xxxevery 发表于 2024-6-29 12:12:48

你这个很容易啊,用一个8脚的单片机配合一键开关机电路,一个按键不仅可以开关机,还可以调PWM,eeprom不考虑成本可以用外部eeprom,节约就用单片机内部的eeprom

vb2002 发表于 2024-6-29 12:17:52

xxxevery 发表于 2024-6-29 12:12
你这个很容易啊,用一个8脚的单片机配合一键开关机电路,一个按键不仅可以开关机,还可以调PWM,eeprom不考 ...

代码不会写了
要不您有空看看我的代码?
帮我优化一下3秒不换挡,再按就关机? eeprom先不管,我后续再弄

xxxevery 发表于 2024-6-29 12:38:23

你这样写明显不合理嘛,难道必须开机就调亮度,中途调亮度就不行?你把key1设成长短按不就很好解决了

vb2002 发表于 2024-6-29 14:56:50

xxxevery 发表于 2024-6-29 12:38
你这样写明显不合理嘛,难道必须开机就调亮度,中途调亮度就不行?你把key1设成长短按不就很好解决了 ...

哥,帮帮忙其实我的设想是这样
单击开机,长按增加亮度,松手再长按减少亮度[无极调光]单击关机,记忆上次无极调光的亮度,,下次开机直接就是上次关机的亮度
双击极亮,关机的时候长按,进入 微亮 %0.1模式

xxxevery 发表于 2024-6-29 15:23:45

你这个功能逻辑看上去没啥毛病,你用按键状态机的方式实现应该容易些,不要用那种主循环中扫描按键的方式

soma 发表于 2024-6-29 15:41:35

用ai自动生成基础代码在修改

vb2002 发表于 2024-6-29 17:25:29

soma 发表于 2024-6-29 15:41
用ai自动生成基础代码在修改

比如说?我就懂文言一心

soma 发表于 2024-6-29 19:03:23

vb2002 发表于 2024-6-29 17:25
比如说?我就懂文言一心

也可以,阿里,百度都有,vscode插架可以自己生成代码。

lzl1okOK 发表于 2024-6-29 20:21:07

这个功能挺简单的
页: [1] 2 3
查看完整版本: 弄到一半不会弄了.有什么黑科技可以自动完成吗