2301_76983357 2023-03-14 01:01 采纳率: 100%
浏览 39
已结题

想要按键控制led亮度

void anjian(){ uchar x=0; x=2.5*x; if(key1==0) { x++; led1=1; delay(25-x); led1=0; delay(x); if(x==11) { x=1; while(!key1); } } if(key2==0) { led2=1; delay(25-x); led2=0; delay(x); x++; if(x==11) { x=1; while(!key2); } } if(key3==0) { x++; if(x==11) { x=1; while(!key3); } led3=1; delay(25-x); led3=0; delay(x); } if(key4==0) { x++; if(x==11) { x=1; while(!key4); } led4=1; delay(25-x); led4=0; delay(x); }}void main(){ while(1) { if(num<2) { } anjian(); } }

  • 写回答

4条回答 默认 最新

  • 鑫空之眼 2023-03-14 03:51
    关注

    这段代码只是部分代码,并且缺少初始化函数,因此无法运行。下面是对其中一些函数和变量的解释:

    • void anjian():按键处理函数,控制LED亮度;
    • uchar x=0:声明一个无符号字符型变量x,初值为0;
    • x=2.5*x:将x乘以2.5,结果仍存储在x中;
    • delay():延时函数,以毫秒为单位延迟指定的时间;
    • if(key1==0):判断按键1是否按下;
    • led1=1:将LED1亮起;
    • while(!key1):等待按键1释放;
    • if(num<2):判断变量num是否小于2;

    此外,代码中还有一些问题:

    • x的范围应该是1至10,而不是0至9;
    • 如果num的初值大于等于2,代码逻辑将进入死循环;
    • 缺少初始化函数,例如设置IO口模式、定时器模式等;

    综上所述,这段代码需要更多信息和完善。

    以下是51单片机的代码,可以通过按键控制LED亮度:

    #include <reg51.h>  //包含头文件reg51.h
    #define uchar unsigned char                               //使用宏定义uchar代替unsigned char
    #define uint unsigned int                                 //使用宏定义uint代替unsigned int
    
    uchar code LED_W[] = {0xF3, 0x0C, 0xCF, 0xCC, 0x3F, 0xCC, 0xCF, 0x0C};   //LED数字0-7亮度控制数据
    uchar count = 0;                                //定义计数器,用于指示当前LED亮度值
    uchar key_num;                                  //定义按键扫描结果
    
    void delay_ms(uint time);                       //延时函数
    void key_scan();                                //按键扫描函数
    
    void main()
    {
        uchar i = 0;
        while (1)
        {
            P0 = LED_W[count];                      //控制LED亮度
            key_scan();                             //按键扫描
            if (key_num == 0xfe) count++;           //按键S2按下,增加LED亮度值
            if (key_num == 0xfd) count--;           //按键S3按下,减小LED亮度值
            //LED亮度值范围为0-7
            count = (count >= 8) ? 0 : count;       //若计数器超过7则清零
            count = (count < 0) ? 7 : count;        //若计数器小于0则置7
            for (i = 0; i < 20; i++) delay_ms(5);  //刷新速率(帧率),影响LED闪烁的平滑过渡效果
        }
    }
    
    void delay_ms(uint time)                        //延时函数
    {
        uint i = 0;
        while (time--)
        {
            i = 12000;                              //使用定值延时,可根据时钟频率计算时间参数
            while (i--);
        }
    }
    
    void key_scan()                                 //按键扫描函数
    {
        if (P1 != 0xff)
        {
            delay_ms(10);                           //消抖处理
            if (P1 != 0xff)
            {
                switch (P1)
                {
                    case 0xfe:key_num = 0xfe;break;  //按键S2按下
                    case 0xfd:key_num = 0xfd;break;  //按键S3按下
                    default:break;
                }
            }
        }
    }
    

    这段代码使用P0口控制LED亮度,使用P1口进行按键扫描,按键S2增加LED亮度值,按键S3减小LED亮度值。并且可通过调整计数器的变化实现LED的平滑过渡效果。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 3月29日
  • 已采纳回答 3月21日
  • 创建了问题 3月14日

悬赏问题

  • ¥15 全部备份安卓app数据包括密码,可以复制到另一手机上运行
  • ¥15 Python3.5 相关代码写作
  • ¥20 测距传感器数据手册i2c
  • ¥15 RPA正常跑,cmd输入cookies跑不出来
  • ¥15 求帮我调试一下freefem代码
  • ¥15 matlab代码解决,怎么运行
  • ¥15 R语言Rstudio突然无法启动
  • ¥15 关于#matlab#的问题:提取2个图像的变量作为另外一个图像像元的移动量,计算新的位置创建新的图像并提取第二个图像的变量到新的图像
  • ¥15 改算法,照着压缩包里边,参考其他代码封装的格式 写到main函数里
  • ¥15 用windows做服务的同志有吗