找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 999|回复: 1
打印 上一主题 下一主题
收起左侧

求一个stc8G1K08a单片机跑马灯开暗到亮慢到快,关亮到暗快到灭,可切换亮灯模式

[复制链接]
跳转到指定楼层
楼主
ID:1002664 发表于 2022-1-27 23:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
50黑币
本帖最后由 菜鸟一个622 于 2022-1-28 15:58 编辑

现大佬教51以有,用在8g1k08a上有更好的吗

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1002664 发表于 2022-1-28 15:57 | 只看该作者
#include <STC8G.h>

typedef unsigned char u8;  //0 to 255
typedef unsigned int u16;  //0 to 65535
typedef unsigned long u32;  //0 to 4294967295
sbit key1 = P5 ^ 4;
u16 TMR_XX_ACC;
u16 TMR_XX_PRE = 500;
u8 PWM = 1;
u8 index = 0;
u8 MODE = 1;
bit Power_On = 1;
unsigned char dat1[4] = {0xfe, 0xfd, 0xfb, 0xf7};
unsigned char dat2[4] = {0xfc, 0xf9, 0xf3, 0xf6};
unsigned char dat3[4] = {0xf1, 0xf2, 0xf4, 0xf8};

void key_Proc()
{
    static u16 Delay_XD = 0;    //消抖计数
    static u16 Min_T = 25;
    static u16 Max_T = 2500;

    if(!key1)
    {
        if(Delay_XD < 0xFFFF)Delay_XD++;
       //else Delay_XD = 0;       //連按功能
        if(Delay_XD == Max_T)      //长按
        {
//            MODE = ++MODE % 3;
                                        ++MODE;
                                        if(MODE>3)
                                                MODE=1;
        }
    }
    else            //按键抬起
    {
        if(Delay_XD > Min_T && Delay_XD < Max_T)      //短按
        {
            Power_On ^= 1;
        }
        Delay_XD = 0;    //Delay_XD清0
    }
}
void delayus(u8 x)
{
    while(x--);
}
void main()
{
    while (1)
    {   
        if(PWM > 0) {
            switch (MODE)
            {
            case 0:
                P3 = 0xff;
                break;
            case 1:
                P3 = dat1[index];
                break;
            case 2:
                P3 = dat2[index];
                break;
                                                case 3:
                P3 = dat3[index];
                break;
            }
            delayus(PWM);
        }
        P3 = 0xFF;
        delayus(100 - PWM);
        key_Proc();
        if(++TMR_XX_ACC >= TMR_XX_PRE)
        {   TMR_XX_ACC = 0;
            if(Power_On)
            {
                if(PWM < 99) PWM++;
            } else {
                if(PWM > 0) PWM--;
            }
            index = ++index % 4;
            if(index == 0)
                if(Power_On)
                {
                    if(TMR_XX_PRE > 50) //固定到快
                    {
                        TMR_XX_PRE -= 50;
                    }
                } else {
                    if(TMR_XX_PRE < 500) //固定到快
                    {
                        TMR_XX_PRE += 50;
                    }
                }
        }
    }
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表