久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2873|回復: 3
打印 上一主題 下一主題
收起左側

求幫忙分析這個電子鐘程序每一部分是干嘛的,比如哪一部分是秒表,哪一部分是干嘛

[復制鏈接]
跳轉到指定樓層
樓主
ID:209612 發表于 2017-6-11 17:58 來自手機 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
#include<reg51.h>

#define uchar unsigned char

sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
sbit beep=P1^5;
unsigned char j,k,a1,a0,b1,b0,c1,c0,s,f,m,r1,r0,t1,t0,y1,y0,q,w,e,key=10,temp,qq=0,mb=5;
uchar shi20,shi10,fen20,fen10,miao20,miao10,new,ok=1,wei=1;
unsigned int pp,ppp;
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
                        0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

void delay(int i)
{
  for(j=i;j>0;j--)
    for(k=125;k>0;k--);
}
void display(uchar shi2,uchar shi1,uchar fen2,uchar fen1,uchar miao2,uchar miao1)
{
                LSA=0;LSB=0;LSC=0;
                P0=table[shi2];
                delay(5);
  
               
                LSA=1;LSB=0;LSC=0;
                P0=table[shi1]|0x80;
                delay(5);
               
                LSA=1;LSB=1;LSC=0;
                P0=table[fen2];
                delay(5);
   
                LSA=0;LSB=0;LSC=1;
                P0=table[fen1]|0x80;
                delay(5);
   LSA=0;LSB=1;LSC=1;
                P0=table[miao2];
                delay(5);
   
                LSA=1;LSB=1;LSC=1;
                P0=table[miao1];
                delay(5);
}

void keyscan0()
{
    P1=0xff;
    temp=P1;
   
    if(temp!=0xff)
    {
      delay(10);
      if(temp!=0xff)
      {
        temp=P1;
        if(temp==0xfe)
        {
                      
               ok++;   
                                                        if (ok==3)           
                                                                ok=0;
            


      }
      }
      }       
}


void keyscan()
{
  {       
                P3=0xff;
    temp=P3;
   
    if(temp!=0xff)
    {
      delay(10);
      if(temp!=0xff)
      {       
        temp=P3;
        switch(temp)
        {case 0xfb :
                                key=3;
                          wei++;
                                        if (wei==7)
                                                wei=1;
                                        break;
                                case 0xf7:
                                                key=4;
                                break;
                                case 0xfd:
                                                mb++;
                                                if(mb==8)
                                                        mb=5;
                               
                                break;
                        }  

         
         }
      
      }
    }

   
}

void main()
{
        TMOD=0x01;
        TH0=0xdc;
        TL0=0x00;
        ET0=1;
        EA=1;
       
        while(1)
        {        keyscan0();
                while(P1!=0xff);
                if(ok==1)
                {        TR0=1;
                       
                       
                       
               
                if(pp>=100)
                {        pp=0;
                        m++;
                        if(m==60)
                        {
                                m=0;
                                f++;
                                if(f==60)
                                {
                                        f=0;
                                        s++;
                                        if(s==24)  
                                        {
                                                s=0;
                                        }
                                }
                        }
                }

                       
               
               
               
               
       
                a0=s%10;
                a1=s/10;
                b0=f%10;
                b1=f/10;
                c0=m%10;
                c1=m/10;
               
                display(a1,a0,b1,b0,c1,c0);
        }
        else if(ok==2)
                {
                        TR0=1;
                       
                       
                        keyscan();
                        while(P3!=0xff);
                        if(mb==5)
                        {
                        q=0;
                        w=0;
                        e=0;
                        mb=6;
                       
                               
                        pp=0;
                        }
                        if(mb==6)
                        {
                                if(qq!=pp)
                        {
                                e++;
                                if(e==100)
                                {
                       
                                        e=0;
                                        w++;
                                if(w==60)
                                {
                                        w=0;
                                        q++;
                                        if(q==60)  
                                        {
                                                q=0;
                                        }
                                }
                        }
                        }
                       
                }

               
               
                r0=q%10;
                r1=q/10;
                t0=w%10;
                t1=w/10;
                y0=e%10;
                y1=e/10;
                display(r1,r0,t1,t0,y1,y0);
                if(pp>=100)
                {        pp=0;
                        m++;
                        if(m==60)
                        {
                                m=0;
                                f++;
                                if(f==60)
                                {
                                        f=0;
                                        s++;
                                        if(s==24)  
                                        {
                                                s=0;
                                        }
                                }
                        }
                }
                a0=s%10;
                a1=s/10;
                b0=f%10;
                b1=f/10;
                c0=m%10;
                c1=m/10;
        }
        else
        {        TR0=0;
                keyscan();
        while(P3!=0xff);
                if(key==3)
                {key=0;
               
                switch(wei)
                {
                        case 1:                
                        LSA=0;LSB=0;LSC=0;
                P0=table[a1];
                        break;
                        case 2:
                                        LSA=1;LSB=0;LSC=0;
                P0=table[a0]|0x80;
        break;
                        case 3:
                                        LSA=1;LSB=1;LSC=0;
                P0=table[b1];
       
                break;
                        case 4: LSA=0;LSB=0;LSC=1;
                P0=table[b0]|0x80;

                        break;
                        case 5:        
                LSA=0;LSB=1;LSC=1;
                P0=table[c1];
                break;
                        case 6:  
                LSA=1;LSB=1;LSC=1;
                P0=table[c0];
                        break;
                       
                }
               
                }

                if(key==4)
                {
                        key=0;
                        switch(wei)
                        {
                        case 1:                 //±×2
                                        a1++;
                        if(a1==3)
                                a1=0;
                        LSA=0;LSB=0;LSC=0;
                P0=table[a1];
                                       
                                        break;
                        case 2:
                                a0++;
                                if (a1==2)
                                {
                                        if(a0==4)
                                                a0=0;}
                                        else if (a0==10)
                                                a0=0;
                                                LSA=1;LSB=0;LSC=0;
                P0=table[a0]|0x80;   
                                        break;
                        case 3:                 //·×6
                                        b1++;
                                        if(b1==6)
                                                b1=0;
                                        LSA=1;LSB=1;LSC=0;
                P0=table[b1];
                                        break;
                        case 4:
                                b0++;
                        if(b0==10)
                                b0=0;
                        LSA=0;LSB=0;LSC=1;
                P0=table[b0]|0x80;
                        break;
                        case 5:                 //×6
                                        c1++;
                        if(c1==6)
                                                c1=0;                       
                                        LSA=0;LSB=1;LSC=1;
                P0=table[c1];
                                        break;
                        case 6:
                                c0++;
                        if(c0==10)
                                c0=0;
                        LSA=1;LSB=1;LSC=1;
                P0=table[c0];
                        break;
                        }
        //        while(P3!=0xff);
                }
               
                        m=c1*10+c0;
                        f=b1*10+b0;
                        s=a1*10+a0;
                       
}       
}
}
void time0() interrupt 1
{        TH0=0xdc;
        TL0=0x00;
        qq=pp;
        pp++;
       
                }
               
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:111634 發表于 2017-6-12 18:11 | 只看該作者
從哪兒來,問哪兒去。這么冗長的程序,會有人解釋嗎?
回復

使用道具 舉報

板凳
ID:111634 發表于 2017-6-12 18:12 | 只看該作者
讀別人的程序,是最煩人的事。
回復

使用道具 舉報

地板
ID:209558 發表于 2017-6-12 19:21 | 只看該作者
這是帶解釋的時鐘程序,你看行不

#include<reg51.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit LCD1602_E=P2^7;
sbit LCD1602_RS=P2^6;
sbit LCD1602_RW=P2^5;
sbit RST=P3^5;
sbit SCLK=P3^6;
sbit DSIO=P3^4;
sbit set=P1^0;         
sbit add=P1^1;         
sbit dec=P1^2;
sbit buzzer=P1^3;
bit keyflag=0;
uchar keynum,ge,shi;
uchar S1num,flag,second,minute,hour,week,day,month,year;
uchar code READ_RTC_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d};
uchar code WRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};
uchar TIME[7] = {0x00, 0x23, 0x17, 0x13, 0x05, 0x06, 0x17};
void keyScan();
void delay(uchar z);
void LcdInit();
void Ds1302Init();
void Ds1302Write(uchar addr, uchar dat);
void Ds1302ReadTime();
void LcdDisplay();
uchar Ds1302Read(uchar addr);
void LcdWriteCom(uchar com)                                       //LCD寫入命令函數
{
        LCD1602_E = 0;         //使能清零
        LCD1602_RS = 0;         //選擇寫入命令
        LCD1602_RW = 0;         //選擇寫入
  P0=com;           //由于4位的接線是接到P0口的高四位,所以傳送高四位不用改
  delay(5);       
        LCD1602_E = 1;         //寫入時序
  delay(5);
        LCD1602_E = 0;
}
void LcdWriteData(uchar dat)                                                 //LCD寫入數據函數
{
        LCD1602_E = 0;          //使能清零
        LCD1602_RS = 1;          //選擇寫入數據
        LCD1602_RW = 0;          //選擇寫入
        P0 = dat;        //由于4位的接線是接到P0口的高四位,所以傳送高四位不用改
  delay(5);
        LCD1602_E = 1;          //寫入時序
        delay(5);
        LCD1602_E = 0;
}
void main()                                                //進入主函數
{
        LcdInit();
        Ds1302Init();
        while(1)
        {       
                keyScan();
                if(keyflag==0)
                {
                        Ds1302ReadTime();
                LcdDisplay();
        }
}
}
void LcdDisplay()                                          //LCD要顯示的數據
{
        LcdWriteCom(0x80+0X40);
        LcdWriteData('0'+TIME[2]/16);                                //時
        LcdWriteData('0'+(TIME[2]&0x0f));                                 
        LcdWriteData('-');
        LcdWriteData('0'+TIME[1]/16);                                //分
        LcdWriteData('0'+(TIME[1]&0x0f));       
        LcdWriteData('-');
        LcdWriteData('0'+TIME[0]/16);                                //秒
        LcdWriteData('0'+(TIME[0]&0x0f));

        LcdWriteCom(0x80);
        LcdWriteData('2');
        LcdWriteData('0');
        LcdWriteData('0'+TIME[6]/16);                        //年
        LcdWriteData('0'+(TIME[6]&0x0f));
        LcdWriteData('-');
        LcdWriteData('0'+TIME[4]/16);                        //月
        LcdWriteData('0'+(TIME[4]&0x0f));
        LcdWriteData('-');
        LcdWriteData('0'+TIME[3]/16);                        //日
        LcdWriteData('0'+(TIME[3]&0x0f));
        LcdWriteCom(0x8D);
        LcdWriteData('0'+(TIME[5]&0x07));        //星期                         
}
void LcdInit()                                                                                  //LCD初始化子程序
{
        LcdWriteCom(0x38);  //開顯示
        LcdWriteCom(0x0c);  //開顯示不顯示光標
        LcdWriteCom(0x06);  //寫一個指針加1
        LcdWriteCom(0x01);  //清屏
        LcdWriteCom(0x80);  //設置數據指針起點
}
void Ds1302Init()                                           //DS1302初始化子程序
{
        uchar n;
        Ds1302Write(0x8E,0X00);                 //禁止寫保護,就是關閉寫保護功能
        for (n=0; n<7; n++)//寫入7個字節的時鐘信號:分秒時日月周年
        {
                Ds1302Write(WRITE_RTC_ADDR[n],TIME[n]);       
        }
        Ds1302Write(0x8E,0x80);                 //打開寫保護功能
}
void Ds1302Write(uchar addr, uchar dat)                      //DS1302被寫入數據
{
        uchar n;
        RST = 0;
        _nop_();

        SCLK = 0;//先將SCLK置低電平。
        _nop_();
        RST = 1; //然后將RST(CE)置高電平。
        _nop_();

        for (n=0; n<8; n++)//開始傳送八位地址命令
        {
                DSIO = addr & 0x01;//數據從低位開始傳送
                addr >>= 1;
                SCLK = 1;//數據在上升沿時,DS1302讀取數據
                _nop_();
                SCLK = 0;
                _nop_();
        }
        for (n=0; n<8; n++)//寫入8位數據
        {
                DSIO = dat & 0x01;
                dat >>= 1;
                SCLK = 1;//數據在上升沿時,DS1302讀取數據
                _nop_();
                SCLK = 0;
                _nop_();       
        }       
                 
        RST = 0;//傳送數據結束
        _nop_();
}
uchar Ds1302Read(uchar addr)                                  //讀出DS1302的數據
{
        uchar n,dat,dat1;
        RST = 0;
        _nop_();

        SCLK = 0;//先將SCLK置低電平。
        _nop_();
        RST = 1;//然后將RST(CE)置高電平。
        _nop_();

        for(n=0; n<8; n++)//開始傳送八位地址命令
        {
                DSIO = addr & 0x01;//數據從低位開始傳送
                addr >>= 1;
                SCLK = 1;//數據在上升沿時,DS1302讀取數據
                _nop_();
                SCLK = 0;//DS1302下降沿時,放置數據
                _nop_();
        }
        _nop_();
        for(n=0; n<8; n++)//讀取8位數據
        {
                dat1 = DSIO;//從最低位開始接收
                dat = (dat>>1) | (dat1<<7);
                SCLK = 1;
                _nop_();
                SCLK = 0;//DS1302下降沿時,放置數據
                _nop_();
        }

        RST = 0;
        _nop_();        //以下為DS1302復位的穩定時間,必須的。
        SCLK = 1;
        _nop_();
        DSIO = 0;
        _nop_();
        DSIO = 1;
        _nop_();
        return dat;       
}
void Ds1302ReadTime()                                           //DS1302發送數據
{
        uchar n;
        for (n=0; n<7; n++)//讀取7個字節的時鐘信號:分秒時日月周年
        {
                TIME[n] = Ds1302Read(READ_RTC_ADDR[n]);
        }
}       
void delay(uchar z)                                    
{
        uint x,y;
        for(x=z;x>0;x--)
        for(y=110;y>0;y--);
}
void keyScan()
{
        if(set==0)
        {
                delay(5);
                if(set==0)
                {
                        buzzer=0;
                        delay(30);
                        buzzer=1;
                        while(!set);
                        keynum++;
    switch(keynum)
{
case 1:
           keyflag=1;
     LcdWriteCom(0x80+0x40+7);
     LcdWriteCom(0x0f);
     break;
case 2:       
           Ds1302Write(0x8e,0x00);//?????
     Ds1302Write(0x82,0x80);
     LcdWriteCom(0x80+0x40+4);
     LcdWriteCom(0x0f);
     break;
case 3:
           Ds1302Write(0x8e,0x00);
     Ds1302Write(0x84,0x80);
     LcdWriteCom(0x80+0x40+1);
     LcdWriteCom(0x0f);
     break;
case 4:
           Ds1302Write(0x8e,0x00);
     Ds1302Write(0x8a,0x80);
     LcdWriteCom(0x80+13);
     LcdWriteCom(0x0f);
     break;
case 5:       
           Ds1302Write(0x8e,0x00);
     Ds1302Write(0x86,0x80);
     LcdWriteCom(0x80+9);
     LcdWriteCom(0x0f);
     break;
case 6:
           Ds1302Write(0x8e,0x00);
     Ds1302Write(0x88,0x80);
     LcdWriteCom(0x80+6);
     LcdWriteCom(0x0f);
     break;
case 7:       
           Ds1302Write(0x8e,0x00);
     Ds1302Write(0x8c,0x80);
     LcdWriteCom(0x80+3);
     LcdWriteCom(0x0f);
     break;
}       
if(keynum==8)
{
        keynum=0;
        keyflag=0;
        LcdWriteCom(0x0c);                           
                  Ds1302Write(0x80,0x00);
         Ds1302Write(0x80,(second/10)<<4|second%10);
                 Ds1302Write(0x82,(minute/10)<<4|minute%10);
                  Ds1302Write(0x84,(hour/10)<<4|hour%10);
         Ds1302Write(0x8a,(week/10)<<4|week%10);
                  Ds1302Write(0x86,(day/10)<<4|day%10);
                 Ds1302Write(0x88,(month/10)<<4|month%10);
        Ds1302Write(0x8c,(year/10)<<4|year%10);
    Ds1302Write(0x8e,0x80);
}
                }
        }
       
if(keynum!=0)
{
        if(add==0)
{
        delay(5);
        while(!add);
        switch(keynum)
        {
                case 1: second++;
                  if(second==59)second=0;
                shi=second/10;
                ge=second%10;
          TIME[0] = Ds1302Read(READ_RTC_ADDR[0]);
                LcdWriteCom(0x80+0x40+7);
                LcdWriteData(0x30+ge)        ;
                LcdWriteCom(0x80+0x40+6);
                LcdWriteData(0x30+shi);
                LcdWriteCom(0x80+0x40+7);
                break;
                case 2:
                        minute++;
                if(minute==59)minute=0;
                shi=minute/10;
                ge=minute%10;
                TIME[1] = Ds1302Read(READ_RTC_ADDR[1]);
                LcdWriteCom(0x80+0x40+4);
                LcdWriteData(0x30+ge)        ;
                LcdWriteCom(0x80+0x40+3);
                LcdWriteData(0x30+shi);
                LcdWriteCom(0x80+0x40+4);
                break;
        case 3:
                hour++;
                if(hour==24)hour=0;
                shi=hour/10;
                ge=hour%10;
          TIME[2] = Ds1302Read(READ_RTC_ADDR[2]);
                LcdWriteCom(0x80+0x40+1);
                LcdWriteData(0x30+ge)        ;
                LcdWriteCom(0x80+0x40);
                LcdWriteData(0x30+shi);
          LcdWriteCom(0x80+0x40+1);
                break;
        case 4:
          week++;
          if(week==8)week=1;
          TIME[5] = Ds1302Read(READ_RTC_ADDR[5]);
                LcdWriteCom(0x80+13);
                LcdWriteData(0x30+week);
          LcdWriteCom(0x80+13);
                break;
        case 5:
                day++;
                shi=day/10;
                ge=day%10;
          TIME[3] = Ds1302Read(READ_RTC_ADDR[3]);
                LcdWriteCom(0x80+9);
                LcdWriteData(0x30+ge);
                LcdWriteCom(0x80+8);
                LcdWriteData(0x30+shi);
          LcdWriteCom(0x80+9);
                break;
                case 6:
                month++;
                shi=month/10;
                ge=month%10;
                TIME[4] = Ds1302Read(READ_RTC_ADDR[4]);
                LcdWriteCom(0x80+6);
                LcdWriteData(0x30+ge);
                LcdWriteCom(0x80+5);
                LcdWriteData(0x30+shi);
                LcdWriteCom(0x80+6);
                break;
                case 7:
                year++;
                shi=year/10;
                ge=year%10;
          TIME[6] = Ds1302Read(READ_RTC_ADDR[6]);
                LcdWriteCom(0x80+3);
                LcdWriteData(0x30+ge)        ;
                LcdWriteCom(0x80+2);
                LcdWriteData(0x30+shi);
                LcdWriteCom(0x80+3);
                break;
               
        }
               
}       
}
if(keynum!=0)
{
        if(dec==0)
{
        delay(5);
        while(!dec);
        switch(keynum)
        {
                case 1: second--;
                  if(second==0)second=59;
                shi=second/10;
                ge=second%10;
    TIME[0] = Ds1302Read(READ_RTC_ADDR[0]);
                LcdWriteCom(0x80+0x40+7);
                LcdWriteData(0x30+ge)        ;
                LcdWriteCom(0x80+0x40+6);
                LcdWriteData(0x30+shi);
                LcdWriteCom(0x80+0x40+7);
                break;
                case 2:
                        minute--;
                if(minute==0)minute=59;
                shi=minute/10;
                ge=minute%10;
                TIME[1] = Ds1302Read(READ_RTC_ADDR[1]);
                LcdWriteCom(0x80+0x40+4);
                LcdWriteData(0x30+ge)        ;
                LcdWriteCom(0x80+0x40+3);
                LcdWriteData(0x30+shi);
                LcdWriteCom(0x80+0x40+4);
                break;
        case 3:
                hour--;
                if(hour==0)hour=23;
                shi=hour/10;
                ge=hour%10;
          TIME[2] = Ds1302Read(READ_RTC_ADDR[2]);
                LcdWriteCom(0x80+0x40+1);
                LcdWriteData(0x30+ge)        ;
                LcdWriteCom(0x80+0x40);
                LcdWriteData(0x30+shi);
          LcdWriteCom(0x80+0x40+1);
                break;
        case 4:
          week--;
          if(week==0)week=7;
          TIME[5] = Ds1302Read(READ_RTC_ADDR[5]);
                LcdWriteCom(0x80+13);
                LcdWriteData(0x30+week);
          LcdWriteCom(0x80+13);
                break;
        case 5:
                day--;
                shi=day/10;
                ge=day%10;
          TIME[3] = Ds1302Read(READ_RTC_ADDR[3]);
                LcdWriteCom(0x80+9);
                LcdWriteData(0x30+ge)        ;
                LcdWriteCom(0x80+8);
                LcdWriteData(0x30+shi);
          LcdWriteCom(0x80+9);
                break;
                case 6:
                month--;
                shi=month/10;
                ge=month%10;
                TIME[4] = Ds1302Read(READ_RTC_ADDR[4]);
                LcdWriteCom(0x80+6);
                LcdWriteData(0x30+ge)        ;
                LcdWriteCom(0x80+5);
                LcdWriteData(0x30+shi);
                LcdWriteCom(0x80+6);
                break;
                case 7:
                year--;
                shi=year/10;
                ge=year%10;
                TIME[6] = Ds1302Read(READ_RTC_ADDR[6]);
                LcdWriteCom(0x80+3);
                LcdWriteData(0x30+ge)        ;
                LcdWriteCom(0x80+2);
                LcdWriteData(0x30+shi);
                LcdWriteCom(0x80+3);
                break;
               
        }
               
}       
}
}  
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91色视频在线| 国产视频精品免费 | 国产一级影片 | 成人久久久久 | 毛片网络 | 天天操操操操操 | 国产精品96久久久久久 | 在线观看精品 | 成人在线观看中文字幕 | 国产精品视频网 | 亚洲精品一二区 | 国产精品久久 | 欧美福利在线 | 国产精品99久久久久久久vr | 久久久精品 | 午夜日韩精品 | 精品久久久久久中文字幕 | 日日干夜夜操 | 精品毛片在线观看 | 狠狠色狠狠色综合系列 | 成人av免费播放 | 久久久资源 | 美女视频.| 成人深夜福利 | 国产欧美在线一区二区 | 伊人精品在线 | 欧美中文字幕一区二区三区亚洲 | 日日干干夜夜 | 伊人艹 | 婷婷开心激情综合五月天 | 亚洲成人免费av | 亚洲精品久久久久久宅男 | 成人免费视频网站 | 亚洲一区二区三区在线观看免费 | 精品视频一区二区 | 国产精品美女久久久久 | 91精品无人区卡一卡二卡三 | 97起碰 | 麻豆久久久久久久久久 | 激情网五月天 | 激情久久网|