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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 11544|回復(fù): 12
收起左側(cè)

DS1302實(shí)時(shí)時(shí)鐘的問題,如何用4個(gè)按鍵調(diào)時(shí)呢?

[復(fù)制鏈接]
ID:309880 發(fā)表于 2018-5-29 11:27 | 顯示全部樓層 |閱讀模式
不好意思,我又來了,我用4個(gè)按鍵調(diào)節(jié)時(shí)鐘(考慮手上沒有與門器件沒用中斷,時(shí)間不夠了),代碼如下,可是LCD不顯示,請(qǐng)各位幫俺看看如何修改,問題應(yīng)該出在主函數(shù)和主函數(shù)上面的子函數(shù)上了,請(qǐng)各位幫幫忙
#include <reg52.h>
#include <string.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit SDA=P1^0;        // DS1302數(shù)據(jù)線
sbit CLK=P1^1;        //DS1302時(shí)鐘線
sbit RST=P1^2;  //DS1302復(fù)位線
sbit RS=P2^0;
sbit RW=P2^1;
sbit EN=P2^2;
sbit K1=P3^4; // 選擇
sbit K2=P3^5; // 加
sbit K3=P3^6; // 減
sbit K4=P3^7; // 確定

uchar tCount=0;
//一年中每個(gè)月的天數(shù),2月的天數(shù)由年份決定
uchar MonthsDays[]={31,31,30,31,30,31,31,30,31,30,31};
uchar *WEEK[]={"SAT","SUN","MON","TUS","WEN","THU","FRI"};
uchar LCD_DSY_BUFFER1[]={"Date 00-00-00   "}; //LCD顯示緩沖
uchar LCD_DSY_BUFFER2[]={"Time 00:00:00   "};
uchar DateTime[7]; //所讀取的日期時(shí)間
char Adjust_Index=-1;
uchar Change_Flag[]="-MHDM-Y"; //當(dāng)前調(diào)節(jié)的標(biāo)志:分鐘,小時(shí),天,月,年

void DelayMS(uint x)
{
  uchar i;
  while(x--) for(i=0;i<120;i++);
}

void DS1302_Write_Byte(uchar x)         //發(fā)送一個(gè)字節(jié)到DS1302通信線上
{
          uchar i;
          
          for(i=0;i<8;i++) //低位在前,移位輸出
          {
                  SDA=x&1;  //輸出該位數(shù)據(jù)
                CLK=1;          //拉高時(shí)鐘
                CLK=0;          //拉低時(shí)鐘,完成一個(gè)位的操作
                x>>=1;
          }
}

uchar DS1302_Read_Byte()
{
uchar i,b,t;
for(i=0;i<8;i++)
{
        b>>=1;
        t=SDA;
        b|=t<<7;
        CLK=1;
        CLK=0;
}
return b/16*10+b%16;
}

uchar Read_Data(uchar addr)
{
        uchar dat;
        RST=0;
        CLK=0;
        RST=1;
        DS1302_Write_Byte(addr);
        dat=DS1302_Read_Byte();
        CLK=1;
        RST=0;
        _nop_();    //以下為DS1302復(fù)位的穩(wěn)定時(shí)間,必須的。
    CLK = 1;
    _nop_();
    SDA = 0;
    _nop_();
    SDA = 1;
    _nop_();
        return dat;       
}

void Write_DS1302(uchar addr,uchar dat)
{
        CLK=0;
        RST=1;
        DS1302_Write_Byte(addr);
        DS1302_Write_Byte(dat);
        CLK=0;
        RST=0;       
}

void SET_DS1302()
{
uchar i;
Write_DS1302(0x8e,0x00);
for(i=0;i<7;i++)
{
        Write_DS1302(0x80+2*i,(DateTime[i]/10<<4|(DateTime[i]%10)));
}
Write_DS1302(0x8e,0x80);
}

void GetTime()
{       
        uchar i;
        for(i=0;i<7;i++)
        {
                DateTime[i]=Read_Data(0x81+2*i);
        }
}


uchar Read_LCD_State()
{
        uchar state;
        RS=0;                   //命令
        RW=1;                   //讀
        EN=1;                   //讀為高電平
        DelayMS(1);
        state=P0;
        EN=0;
        DelayMS(1);
        return state;  //要輸出
}

void LCD_Busy_Wait()   //LCD1602響應(yīng)速度相對(duì)于單片機(jī)來說是偏慢的
{
        while((Read_LCD_State()&0x08)==0x80);
        DelayMS(5);
}

void Write_LCD_Data(uchar dat) //寫數(shù)據(jù)
{
        LCD_Busy_Wait();   //忙檢測(cè)
        RS=1;                           //數(shù)據(jù)
        RW=0;                           //寫為低電平
        EN=0;                           //寫操作時(shí)為低電平
        P0=dat;
        EN=1;
        DelayMS(1);
        EN=0;
}

void Write_LCD_Command(uchar cmd)//寫命令
{
        LCD_Busy_Wait();
        RS=0;           //命令
        RW=0;           //寫為低電平
        EN=0;           //寫操作時(shí)為低電平
        P0=cmd;
        EN=1;
        DelayMS(1);
        EN=0;
}

void Init_LCD()        //LCD初始化
{
        Write_LCD_Command(0x38); DelayMS(1);
        Write_LCD_Command(0x01); DelayMS(1);
        Write_LCD_Command(0x06); DelayMS(1);
        Write_LCD_Command(0x0C); DelayMS(1);       
}

void Set_LCD_POS(uchar p)
{
        Write_LCD_Command(p+0x80);
}

void Display_LCD_String(uchar p,uchar *s)
{
        uchar i;
        Set_LCD_POS(p);
        for(i=0;i<16;i++)
        {
                Write_LCD_Data(s[i]);
                DelayMS(1);
        }
}

void Format_DateTime(uchar d,uchar *a)
{
        a[0]=d/10+'0';a[1]=d%10+'0';
}

uchar isLeapYear(uint y)
{
return (y%4==0&&y%100!=0)||(y%400==0);
}

void DateTime_Adjust(char x)
{
switch (Adjust_Index)
{
        case 6:          //年
                if(x== 1&&DateTime[6]<99) DateTime[6]++;
                if(x==-1&&DateTime[6]>0)  DateTime[6]--;
                MonthsDays[2]=isLeapYear(2000+DateTime[6])? 29:28;
                if(DateTime[3]>MonthsDays[DateTime[4]])
                   DateTime[3]=MonthsDays[DateTime[4]];
                //RefreshWeekDay();
                break;

        case 4:         //月
                if(x== 1&&DateTime[4]<12) DateTime[4]++;
                if(x==-1&&DateTime[4]>1)  DateTime[4]--;
                MonthsDays[2]=isLeapYear(2000+DateTime[6])? 29:28;
                if(DateTime[3]>MonthsDays[DateTime[4]])
                DateTime[3]=MonthsDays[DateTime[4]];
                //RefreshWeekDay();
                break;
   case 3:                //日
                MonthsDays[2]=isLeapYear(2000+DateTime[6])? 29:28;
                if(x== 1&&DateTime[3]<MonthsDays[DateTime[4]]) DateTime[3]++;
                if(x==-1&&DateTime[3]>0) DateTime[3]--;
                //RefreshWeekDay();
                break;
   case 2:          //時(shí)
                if(x== 1&&DateTime[2]<23) DateTime[2]++;
                if(x==-1&&DateTime[2]>0)  DateTime[2]--;
                break;

   case 1:           //秒
                if(x== 1&&DateTime[1]<59) DateTime[1]++;
                if(x==-1&&DateTime[1]>0)  DateTime[1]--;
                break;         
}
}

void main()
{
  Init_LCD();
  while(1)
  {         
        GetTime();
        if(K1==0)
        {  
           DelayMS(10);        //按鍵消抖
           while(K1==0);
           if(Adjust_Index==-1||Adjust_Index==1) {Adjust_Index=7;}//uchar Change_Flag[]="-MHDM-Y";
           Adjust_Index--;
           if(Adjust_Index==5) Adjust_Index=4;
           LCD_DSY_BUFFER2[13]='[';
           LCD_DSY_BUFFER2[14]=Change_Flag[Adjust_Index];
           LCD_DSY_BUFFER2[15]=']';
          if(K2==0)   //  加
          {
                 DelayMS(10);        //按鍵消抖
             while (K2==0); DateTime_Adjust(1);
          }
        else if(K3==0)  //  減
          {
                DelayMS(10);        //按鍵消抖
                while (K3==0); DateTime_Adjust(-1);
      }
        else if(K4==0)  // 確定
          {
                DelayMS(10);        //按鍵消抖
                while(K4==0);
                SET_DS1302();        //調(diào)整后的時(shí)間寫入DS1302
                LCD_DSY_BUFFER2[13]=' ';
                LCD_DSY_BUFFER2[14]=' ';
                LCD_DSY_BUFFER2[15]=' ';
                Adjust_Index=-1;
          }
    }
  }
    Format_DateTime(DateTime[6],LCD_DSY_BUFFER1+5);           //年
        Format_DateTime(DateTime[4],LCD_DSY_BUFFER1+8);           //月
        Format_DateTime(DateTime[3],LCD_DSY_BUFFER1+11);   //日
        strcpy(LCD_DSY_BUFFER1+13,WEEK[DateTime[5]]);           //week

        Format_DateTime(DateTime[2],LCD_DSY_BUFFER2+5);           //時(shí)
        Format_DateTime(DateTime[1],LCD_DSY_BUFFER2+8);           //分
        Format_DateTime(DateTime[0],LCD_DSY_BUFFER2+11);   //秒

        Display_LCD_String(0x00,LCD_DSY_BUFFER1);
        Display_LCD_String(0x40,LCD_DSY_BUFFER2);
}

回復(fù)

使用道具 舉報(bào)

ID:111634 發(fā)表于 2018-5-29 22:31 | 顯示全部樓層
本帖最后由 zl2168 于 2018-5-29 22:33 編輯

下功夫閱讀別人成功有效的程序,認(rèn)真體會(huì)理解,仔細(xì)對(duì)照查錯(cuò)。而不是發(fā)出大段無里頭程序,讓別人幫你查錯(cuò)。

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:340985 發(fā)表于 2018-5-29 22:37 | 顯示全部樓層
仔細(xì)看,可以的
回復(fù)

使用道具 舉報(bào)

ID:118735 發(fā)表于 2018-5-29 22:46 | 顯示全部樓層
肯定是需要中斷的,畢竟單片機(jī)是怎么都跑步過來
回復(fù)

使用道具 舉報(bào)

ID:118735 發(fā)表于 2018-5-29 22:49 | 顯示全部樓層
你這樣處理,按鍵調(diào)節(jié)分開。按鍵處理的時(shí)候。停止時(shí)間顯示,然后按鍵處理完了再回去處理顯示
回復(fù)

使用道具 舉報(bào)

ID:340390 發(fā)表于 2018-5-29 22:57 | 顯示全部樓層
你把LCD的函數(shù)寫在死循環(huán)外面當(dāng)然LCD不顯示啦,在編寫程序時(shí)要有個(gè)程序流程的概念,樓上說得對(duì),要自己仔細(xì)查,不然永遠(yuǎn)都是發(fā)帖問
回復(fù)

使用道具 舉報(bào)

ID:309880 發(fā)表于 2018-5-29 23:39 | 顯示全部樓層
zl2168 發(fā)表于 2018-5-29 22:31
下功夫閱讀別人成功有效的程序,認(rèn)真體會(huì)理解,仔細(xì)對(duì)照查錯(cuò)。而不是發(fā)出大段無里頭程序,讓別人幫你查錯(cuò)。

苦口良藥,感謝指點(diǎn)
回復(fù)

使用道具 舉報(bào)

ID:309880 發(fā)表于 2018-5-29 23:40 | 顯示全部樓層
王企鵝 發(fā)表于 2018-5-29 22:46
肯定是需要中斷的,畢竟單片機(jī)是怎么都跑步過來

明白,已經(jīng)解決
回復(fù)

使用道具 舉報(bào)

ID:309880 發(fā)表于 2018-5-29 23:41 | 顯示全部樓層
benng1996 發(fā)表于 2018-5-29 22:57
你把LCD的函數(shù)寫在死循環(huán)外面當(dāng)然LCD不顯示啦,在編寫程序時(shí)要有個(gè)程序流程的概念,樓上說得對(duì),要自己仔細(xì) ...

以后會(huì)注意,感謝提醒
回復(fù)

使用道具 舉報(bào)

ID:111634 發(fā)表于 2018-5-30 06:20 | 顯示全部樓層
本帖最后由 zl2168 于 2018-5-30 06:22 編輯

我這里有3個(gè)不同方式的按鍵調(diào)時(shí)案例,你可參考一下。
實(shí)例91  具有校正功能的時(shí)鐘1302LCD1602顯示)

先Proteus仿真,確認(rèn)有效。 實(shí)例91 帶校正時(shí)鐘1302(LCD1602顯示).rar (52.68 KB, 下載次數(shù): 79) 具有校正功能的時(shí)鐘1302.jpg
以上摘自張志良編著《80C51單片機(jī)仿真設(shè)計(jì)實(shí)例教程——基于Keil CProteus》清華大學(xué)出版社ISBN 978-7-302-41682-1,書中電路和程序設(shè)計(jì)有詳細(xì)說明,程序語句條條有注解。
回復(fù)

使用道具 舉報(bào)

ID:111634 發(fā)表于 2018-5-30 06:23 | 顯示全部樓層
實(shí)例93  具有校正功能的時(shí)鐘1302(LED數(shù)碼管顯示)
Proteus仿真一下,確認(rèn)有效。
實(shí)例93 帶校正時(shí)分秒的時(shí)鐘1302(6位LED數(shù)碼管顯示).rar (732.75 KB, 下載次數(shù): 55)
開機(jī)顯示PC機(jī)時(shí)分秒的時(shí)鐘(6位LED數(shù)碼管顯示).jpg
以上摘自張志良編著《80C51單片機(jī)仿真設(shè)計(jì)實(shí)例教程——基于Keil CProteus》清華大學(xué)出版社ISBN 978-7-302-41682-1內(nèi)有常用的單片機(jī)應(yīng)用100案例,用于仿真實(shí)驗(yàn)操作,電路與程序真實(shí)可靠可信可行。
回復(fù)

使用道具 舉報(bào)

ID:111634 發(fā)表于 2018-5-30 06:25 | 顯示全部樓層
本帖最后由 zl2168 于 2018-5-30 06:27 編輯

實(shí)例94  模擬電子鐘(由80C51定時(shí)器產(chǎn)生秒時(shí)基)
Proteus仿真一下,確認(rèn)有效。
實(shí)例94 模擬電子鐘(由80C51定時(shí)器產(chǎn)生秒時(shí)基).rar (43.05 KB, 下載次數(shù): 15)
模擬電子鐘.jpg
以上摘自張志良編著《80C51單片機(jī)仿真設(shè)計(jì)實(shí)例教程——基于Keil CProteus》清華大學(xué)出版社ISBN 978-7-302-41682-1內(nèi)有常用的單片機(jī)應(yīng)用100案例,用于仿真實(shí)驗(yàn)操作,電路與程序真實(shí)可靠可信可行。書中電路和程序設(shè)計(jì)有詳細(xì)說明,程序語句條條有注解。
回復(fù)

使用道具 舉報(bào)

ID:503107 發(fā)表于 2019-4-21 20:05 來自觸屏版 | 顯示全部樓層
邁特拉布 發(fā)表于 2018-5-29 23:41
以后會(huì)注意,感謝提醒

樓主可以發(fā)個(gè)聯(lián)系方式嗎,想搬運(yùn)一下程序,謝謝
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 91精品国产综合久久婷婷香蕉 | 成人亚洲视频 | 中文日本在线 | 国产综合精品 | 久久精品国产久精国产 | 中文字幕一区二区三区四区 | 欧美一区视频 | 天天操人人干 | 国产乱码精品一区二区三区五月婷 | 亚洲欧美日韩在线 | 国产精品久久久久久妇女6080 | 波多野吉衣在线播放 | 日本视频免费 | 日日夜夜91| 日韩a| 日韩欧美在线视频播放 | 91高清视频在线观看 | 日韩精品成人 | 九九精品视频在线 | 国产91久久久久久 | 精品亚洲一区二区三区 | 中文字幕亚洲区 | 男女免费在线观看视频 | 一区二区免费视频 | 麻豆av在线 | 超碰在线播| 国产一级片免费在线观看 | 91极品视频 | 五月网婷婷 | 91久久精品日日躁夜夜躁欧美 | 久久国产精品久久久久久久久久 | 精品久久久久久久久久久久 | 色婷婷一区 | 国产一区二区三区 | 色www精品视频在线观看 | 男女一区二区三区 | 日韩中字幕 | 精品一区av | 欧美一区免费 | 久久久久无码国产精品一区 | 日日夜夜视频 |