<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          低功耗MEGA8電子表

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

          12位分3頁設(shè)置依次是:

          時2位:分2位;

          UP

          LEFT_ SET_ RIGHT

          DOWN

          月2位:日2位;

          鬧鐘的時2位:分2位

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

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


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

          鍵位設(shè)置

          上電后,按RIGHT鍵可以實現(xiàn)(時:分)顯示到(分:秒)顯示模式的切換。按SET鍵可以進(jìn)入設(shè)置模式,一共有12位要設(shè)置,分為3頁(因為是4個數(shù)碼管),此時數(shù)碼管顯示第一位,按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; //先關(guān)再操作
          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


          關(guān)鍵詞: 低功耗MEGA8電子

          評論


          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();