⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cbase.c

📁 AVR 门锁的程序 包含与模块通讯 密码按键
💻 C
字号:
#include "Include.h"

//进入睡眠
//有开关闭合则耗电约24uA(6.5V)
//没有任何其它耗电约2uA(6.5V)
void EnterSleep(void)
{
	//关闭外设
	LockStop();
	LedOff();
        BellOff();

	//关闭ADC

	//IO设置
        DDRA=0xEF;
        //DDRB=0xFC;
        //DDRC=0xFF;

	//打开中断
	GICR|=0xC0;
	sei();

	//进入睡眠
	set_sleep_mode(SLEEP_MODE_PWR_DOWN);
	sleep_mode();
}

void TimerOut(void)
{
        LedRedAction2();
}

void Succeed(void)
{
        //unsigned char i=0;

        LedGreenALLOn();
        BellOn();
        //for(i=0;i<7;i++)
        //{
        //        DelayNmS(BELL_LONG_TIME);
        //}
        //LedOff();
        //BellOff();
}

void Fail(void)
{
        LedRedAction1();
}

//硬件连接
//PD5 PD6
void CloseDoorModule(void)
{
        ShowKey(NowKey);
	LockPositive();//电机关门
	Timer=DELAY_DOOR;

        while(bit_is_clear(PIND,PD5))
        {
                if(0==Timer)
                {
                        LockStop();
                        TimerOut();
                        return;
                }
        }

        DelayNmS(20);

        if(0==bit_is_clear(PIND,PD5))
        {
                //的确按下键
                LockStop();
                return;
        }
}

void OpenDoorModule(void)
{
	LockNegative();//电机关门
	Timer=DELAY_DOOR;

        while(bit_is_clear(PIND,PD6))
        {
                if(Timer<(DELAY_DOOR-1))
                {
                        BellOff();
                        LedOff();
                }

                if(0==Timer)
                {
                        BellOff();
                        LedOff();
                        LockStop();
                        TimerOut();
                        return;
                }
        }

        //关灯
        BellOff();
        LedOff();

        DelayNmS(20);

        if(0==bit_is_clear(PIND,PD6))
        {
                //的确按下键
                LockStop();
                return;
        }
}

//设置密码
void SetPassWordModule(void)
{
        unsigned char i=7;
        unsigned char PassWordNum=0;//输入的密码位数
        unsigned char GetPassWord[8]={0,0,0,0,0,0,0,0};//现在输入的密码

        //判断是否弱电
        LowVolageShow();

        //蜂鸣器短叫一声,LED蓝灯组亮
        BellOn();
        LedGreenALLOn();
        DelayNmS(BELL_SHORT_TIME);
        BellOff();
        LedOff();

        while(1)
        {
                if(0==GetKey())
                {
                        TimerOut();
                        return;//超时返回
                }

                switch (NowKey)
                {
                        case KEY_0:
                        case KEY_1:
                        case KEY_2:
                        case KEY_3:
                        case KEY_4:
                        case KEY_5:
                        case KEY_6:
                        case KEY_7:
                        case KEY_8:
                        case KEY_9:
                                //数字键
                                if(PassWordNum<8)
                                {
                                        //在8位之内
                                        PassWordNum++;
                                        ShowKey(NowKey);
                                        for(i=7;i>0;i--)
                                        {
                                                GetPassWord[i]=GetPassWord[i-1];
                                        }
                                        GetPassWord[0]=NowKey;//记下输入
                                }
                                break;
                        case KEY_A:
                                //确定键
                                if(PassWordNum>1)
                                {
                                        //密码>2位
                                        ShowKey(NowKey);
                                        for(i=0;i<8;i++)
                                        {
                                                PassWord[i]=GetPassWord[i];
                                        }
                                        SavePassWord();//保存密码
                                        Succeed();
                                        return;
                                }
                                break;
                        default:
                                break;
                }
        }
}

//密码开门
/*
void PassWordOpenModule(void)
{
        unsigned char i=7;
        unsigned char isOK=1;
        unsigned char PassWordNum=0;//输入的密码位数
        unsigned char GetPassWord[8]={0,0,0,0,0,0,0,0};//现在输入的密码

        PassWordNum++;
        ShowKey(NowKey);
        for(i=7;i>0;i--)
        {
                GetPassWord[i]=GetPassWord[i-1];
        }
        GetPassWord[0]=NowKey;//记下输入

        LoadPassWord();//读取密码

        while(1)
        {
                if(0==GetKey())
                {
                        TimerOut();
                        return;//超时返回
                }

                switch (NowKey)
                {
                        case KEY_0:
                        case KEY_1:
                        case KEY_2:
                        case KEY_3:
                        case KEY_4:
                        case KEY_5:
                        case KEY_6:
                        case KEY_7:
                        case KEY_8:
                        case KEY_9:
                                //数字键
                                if(PassWordNum<8)
                                {
                                        //在8位之内
                                        PassWordNum++;
                                        ShowKey(NowKey);
                                        for(i=7;i>0;i--)
                                        {
                                                GetPassWord[i]=GetPassWord[i-1];
                                        }
                                        GetPassWord[0]=NowKey;//记下输入
                                }
                                break;
                        case KEY_A:
                                if(PassWordNum>1)
                                {
                                        for(i=0;i<8;i++)
                                        {
                                                if(GetPassWord[i]!=PassWord[i])
                                                {
                                                        isOK=0;
                                                }
                                        }
                                        if(isOK)
                                        {
                                                Succeed();
                                                OpenDoorModule();
                                        }
                                        else
                                        {
                                                Fail();
                                        }
                                        return;
                                }
                                break;
                        default:
                                break;
                }
        }
}
*/

//按1 2 3 开门
void PassWordOpenModule(void)
{
        unsigned char i=7;
        unsigned char isOK=1;
        unsigned char PassWordNum=0;//输入的密码位数
        unsigned char GetPassWord[8]={0,0,0,0,0,0,0,0};//现在输入的密码

        PassWordNum++;
        ShowKey(NowKey);
        for(i=7;i>0;i--)
        {
                GetPassWord[i]=GetPassWord[i-1];
        }
        GetPassWord[0]=NowKey;//记下输入

        //LoadPassWord();//读取密码
        for(i=0;i<8;i++)
        {
                PassWord[i]=0;
        }
        PassWord[0]=3;
        PassWord[1]=2;
        PassWord[2]=1;

        while(1)
        {
                if(0==GetKey())
                {
                        TimerOut();
                        return;//超时返回
                }

                switch (NowKey)
                {
                        case KEY_0:
                        case KEY_1:
                        case KEY_2:
                        case KEY_3:
                        case KEY_4:
                        case KEY_5:
                        case KEY_6:
                        case KEY_7:
                        case KEY_8:
                        case KEY_9:
                                //数字键
                                if(PassWordNum<8)
                                {
                                        //在8位之内
                                        PassWordNum++;
                                        ShowKey(NowKey);
                                        for(i=7;i>0;i--)
                                        {
                                                GetPassWord[i]=GetPassWord[i-1];
                                        }
                                        GetPassWord[0]=NowKey;//记下输入
                                }
                                break;
                        case KEY_A:
                                if(PassWordNum>1)
                                {
                                        for(i=0;i<8;i++)
                                        {
                                                if(GetPassWord[i]!=PassWord[i])
                                                {
                                                        isOK=0;
                                                }
                                        }
                                        if(isOK)
                                        {
                                                Succeed();
                                                OpenDoorModule();
                                        }
                                        else
                                        {
                                                Fail();
                                        }
                                        return;
                                }
                                break;
                        default:
                                break;
                }
        }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -