新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 低功耗MEGA8電子表

        低功耗MEGA8電子表

        作者: 時間:2016-11-23 來源:網絡 收藏
        電子表是基于MEGA8單片機LED數碼管為主體設計的,它功能全面,可以顯示月,日,時,分,秒,還可以設定鬧鐘,設計時考慮到省電,還可以進入休眠狀態(不顯示,但時鐘仍運行),以下是該表的使用說明。

        12位分3頁設置依次是:

        時2位:分2位;

        UP

        LEFT_ SET_ RIGHT

        DOWN

        月2位:日2位;

        鬧鐘的時2位:分2位

        設置完后再按SET鍵即可回到正常的顯示模式(時:分),若要當秒表,則按RIGHT,可實現兩種顯示切換。

        正常顯示時,按DOWN鍵,可以顯示日期(月:日),過幾秒后回到正常顯示模式。按LEFT休眠,重按后蘇醒。


        本電子表使用3節5號電池供電一共5個鍵,和一個位于電路板和電池盒間的電源開關。5個鍵按空間位置分別是LEFT,RIGHT,UP,DOWN,以及中間的SET,位置和名字對應。

        鍵位設置

        上電后,按RIGHT鍵可以實現(時:分)顯示到(分:秒)顯示模式的切換。按SET鍵可以進入設置模式,一共有12位要設置,分為3頁(因為是4個數碼管),此時數碼管顯示第一位,按RIGHT依次像右移動,按UP鍵所顯示的位會加1,加到9回0。



        #include"iom8v.h"
        #include"macros.h"
        #include"key.h"

        const char Table[10]={0x3f,0x06,0x5b,0x4f,0x66,
        0x6d,0x7d,0x07,0x7f,0x6f};
        const char MONTH[12]={31,28,31,30,31,30,31,31,
        30,31,30,31};
        char Date[12]={1,1,1,1,2,2,2,2,3,3,3,3};
        char sleep="0",wei=0,wei_1=0,second,minute,hour,
        minute_s,hour_s,
        month="10",data=22,page=0;


        void Delay_nus(unsigned i)
        {
        for(;i>1;i--){;}
        }
        void Delay_1ms()
        {unsigned i;
        for(i=125;i>1;i--)
        {Delay_nus(1);
        }
        }
        void Delay_nms(unsigned i)
        {
        for(;i>1;i--)
        {Delay_1ms();}
        }
        void Display(char *p)

        {char i,sel=0x01;
        if(sleep) return;
        for(i=0;i<4;i++)
        {
        PORTB=~sel; // 0 表示選通
        PORTD="Table"[p[i]];
        Delay_nms(2);
        PORTD="0x00";
        sel="sel"<<1;
        }
        }
        void Sound(char i)
        {
        char n;
        for(n=0;n {
        PORTC&=~(1< PORTC|=(1< Delay_nms(15);
        PORTC&=~(1< Delay_nms(15);
        }
        }

        void Ring(void)
        {

        char temp="5";PORTD=0x00;
        while(temp>0)
        {
        Sound(1);
        Delay_nms(200);
        Sound(1);
        Delay_nms(200);
        Sound(1);
        Delay_nms(200);
        Sound(1);
        Delay_nms(400);
        Sound(1);

        temp--;
        }
        }
        void Io_Init(Void)
        {DDRD=0xFF;
        PORTD=0xff;
        DDRC=0x01;PORTC=0xfe;

        DDRB=0x0F;
        PORTB=0xff;

        }
        void Init_timer2(void)
        {
        TCCR2=0x00; //先關再操作
        ASSR=(1TCCR2=0x07; //1024 fen
        SREG=SREG|0x80;
        TIMSK|=(1<}
        void BIN_to_CLK(char *p)
        {
        if(page)
        { p[3]=second%10;
        p[2]=second/10;
        p[1]=minute%10;
        p[0]=minute/10;
        }
        else{

        p[3]=minute%10;
        p[2]=minute/10;
        p[1]=hour%10;
        p[0]=hour/10;
        }
        }
        void DATA_to_CLK(char *p)
        {
        p[7]=data%10;
        p[6]=data/10;
        p[5]=month%10;
        p[4]=month/10;
        }

        char Key_Value(void)
        {
        char temp,value;

        temp=PINC&0x3e;
        //
        Delay_nms(8);
        if(temp==(PINC&0x3e))//延時后鍵值未變,消抖成功

        switch(temp)
        {
        case 0x3c: value="SET"; break;
        case 0x3a: value="DEC"; break;
        case 0x36: value="ADD"; break;
        case 0x2e: value="LEFT"; break;
        case 0x1e: value="RIGHT"; break;
        default: value="ERROR";
        }
        while(temp==(PINC&0x3e));//直到鍵松開
        Delay_nms(25);
        return value;
        }
        void Display_wei(char i)
        {PORTD=Table[Date[wei_1]];PORTB=~(1<}
        void Key_Process()
        {char temp, n;

        temp=Key_Value();
        if(temp==DEC)
        {for(n=0;n<150;n++)
        {
        DATA_to_CLK(Date);
        Display(Date+4);
        }
        return;
        }
        else if(temp==LEFT)
        {
        if(sleep==0) {
        sleep="1";

        MCUCR="0x90";
        asm("SLEEP");
        }
        else sleep="0";

        return;
        }

        else if(temp==RIGHT)
        {if (page==0) page="1";
        else page="0";
        }
        if(temp!=SET)
        return;
        wei_1=0;Display_wei(wei_1);
        while(1)
        {
        temp="Key"_Value();
        switch(temp)
        {
        case SET: hour="Date"[1]+Date[0]*10;
        minute="Date"[3]+Date[2]*10;
        month="Date"[5]+Date[4]*10;
        data="Date"[7]+Date[6]*10;
        hour_s=Date[8]*10+Date[9];
        minute_s=Date[10]*10+Date[11];
        return;

        case RIGHT: if(wei_1<11) wei_1++;
        else wei_1=0;
        wei="wei"_1%4;
        break;
        case ADD: if(Date[wei_1]<9) Date[wei_1]++;
        else Date[wei_1]=0;
        break;
        default: break;
        }
        Display_wei(wei_1);

        }


        }
        void main(void)
        {
        Io_Init();
        Init_timer2();
        TIMSK =1// Sound(1);

        while(1)
        {
        BIN_to_CLK(Date);
        Display(Date) ;
        if((PINC&0x3e)!=0x3e) Key_Process();

        if(sleep) {MCUCR=0x90;asm("SLEEP");}
        }
        }
        #pragma interrupt_handler Timer2:5
        void Timer2(void)
        {TCNT2=0xe0;
        second++;
        //sleep=0;
        MCUCR=0x00;
        //Sound(1);
        if(second==60)
        {minute++;second=0;
        if(minute==minute_s&&hour==hour_s&&hour!=0&&minute!=0)
        Ring();}
        if(minute==60)
        {hour++;minute=0;

        }
        if(hour==24)
        {hour=0;data++;}
        if(data==MONTH[month])
        {data=1;month++;}

        }




        key.h
        #define SET 0x01
        #define LEFT 0x02
        #define RIGHT 0x03
        #define ADD 0x04
        #define DEC 0x05
        #define ERROR 0x06


        關鍵詞: 低功耗MEGA8電子

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 波密县| 肥西县| 伊宁市| 泌阳县| 上蔡县| 海安县| 九龙坡区| 阜阳市| 南江县| 韩城市| 托克托县| 霍邱县| 潞西市| 宁明县| 甘谷县| 裕民县| 满洲里市| 射洪县| 南安市| 三明市| 淮安市| 奉化市| 锡林郭勒盟| 瑞金市| 乌海市| 盖州市| 永登县| 濮阳县| 武义县| 吴旗县| 海阳市| 西乡县| 松溪县| 南川市| 锡林郭勒盟| 宁乡县| 邢台市| 乐清市| 德州市| 灵山县| 普安县|