手电大家谈-手电筒爱好者之家

 找回密码
 注册成为会员,享受更多功能。

QQ登录

只需一步,快速开始

只需一步,快速开始

搜索
查看: 11747|回复: 1

开源一个手电程序(长按开关机,短按换挡)

[复制链接]
  • TA的每日心情
    开心
    2021-5-16 16:27
  • 签到天数: 254 天

    [LV.8]以坛为家I

    发表于 2022-1-23 15:26 | 显示全部楼层 |阅读模式

    马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

    您需要 登录 才可以下载或查看,没有账号?注册成为会员,享受更多功能。

    x
    #include <tiny13a.h>
    #include <delay.h>

    #define uchar unsigned char
    #define uint unsigned int

    #define key PINB.1

    //#define LED PORTB.0

    uchar key_code = 0;
    uchar time_counter = 0;

    bit change_flag = 0;

    void key_scan(void)
    {
        if(key)
        {                                                
            if((time_counter > 3) && (time_counter < 100))//短按
            {
                if(change_flag)
                {
                    key_code++;
                    if(key_code == 5) key_code = 1;
                }
            }
            time_counter = 0;
        }   
        else   
        {  
            time_counter++;
            delay_ms(10);  
            if(time_counter == 100)//长按
            {
                if (key_code != 0)        //如果状态不处于关机状态,则执行关机
                {
                    key_code = 0;
                    change_flag = 0;
                }
                else
                {
                    key_code = 1;         //如果已经在关机状态则执行开机
                    change_flag = 1;
                }
            }
            if(time_counter > 100)
                time_counter = 101;   
        }
    }

    void main(void)
    {
    // Input/Output Ports initialization
    // Port B initialization
    // Function: Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=Out
    DDRB=(0<<DDB5) | (0<<DDB4) | (0<<DDB3) | (0<<DDB2) | (0<<DDB1) | (1<<DDB0);
    // State: Bit5=T Bit4=T Bit3=T Bit2=T Bit1=P Bit0=0
    PORTB=(0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (1<<PORTB1) | (1<<PORTB0);

    TCCR0A=0x03;
    TCCR0B=0x01;

        while (1)
        {
            key_scan();

            switch (key_code)
            {
                case 0x00:              //初始关机状态
                    TCCR0A=0x03;
                    PORTB.0 = 1;
                    break;
                case 0x01:
                    TCCR0A=0x83;
                    OCR0A = 0x19;       //10%亮度
                    break;
                case 0x02:
                    OCR0A = 0x40;       //25%亮度
                    break;
                case 0x03:
                    OCR0A = 0x80;       //50%亮度
                    break;
                case 0x04:
                    OCR0A = 0xc0;       //75%亮度
                    break;;                    
                default:
                    break;
            }   
        }
    }
    回复 dsu_marcocopyright:copyright

    使用道具 举报

  • TA的每日心情
    开心
    2016-6-26 07:13
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2022-3-14 05:36 | 显示全部楼层
    好牛逼啊,不过本人看不懂。长按开关机貌似开机不好用啊,不如短按开机换挡 长按关机
    回复

    使用道具 举报

    本版积分规则

    小黑屋|手机版|Archiver|论坛自带搜索|下载论坛app|手电大家谈-手电筒爱好者之家 ( 备案序号:鲁ICP备05002565号 )

    GMT+8, 2024-3-29 19:20 , Processed in 0.183257 second(s), 26 queries , Gzip On.

    Powered by Discuz! X3.4

    © 2001-2023 Discuz! Team.

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