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

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

QQ登錄

只需一步,快速開(kāi)始

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

DS1302 8位數(shù)碼管時(shí)鐘,調(diào)時(shí)可以連加連減

  [復(fù)制鏈接]
ID:140489 發(fā)表于 2017-4-25 14:59 | 顯示全部樓層 |閱讀模式
附件里有完整源碼和仿真圖
QQ截圖20170425151550.png
/*********************************************************************************
描述: 8位共陰數(shù)碼管時(shí)鐘,顯示88-88-88樣式,正常走時(shí)的時(shí)候,兩個(gè)“-”0.5秒閃爍一次;
       調(diào)時(shí):按KEY1按鍵第1次分鐘位閃爍,再按KEY2一次分鐘加1,按KEY3一次分鐘減1,長(zhǎng)按連加連減;
                         按KEY1按鍵第2次小時(shí)位閃爍,再按KEY2一次小時(shí)加1,按KEY3一次小時(shí)減1,長(zhǎng)按連加連減;
                         按KEY1按鍵第3次,秒從零開(kāi)始累加,時(shí)鐘回到正常走時(shí);
                         對(duì)時(shí)的時(shí)候先調(diào)好時(shí)、分,分鐘要比參考時(shí)間的分鐘加1分,
                         再看參考時(shí)間的秒數(shù)到了59再按KEY1按鍵的第3次,這樣對(duì)時(shí)可以很準(zhǔn)的
仿真 實(shí)物都通過(guò).  11.0592MHz晶振,STC89C52RC,兩個(gè)74HC573鎖存器做位選、段選
**********************************************************************************/
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int

sbit sclk = P1^0;                                                                //1302時(shí)鐘端口
sbit dio = P1^1;                                                                //1302數(shù)據(jù)端口
sbit ce = P1^2;                                                                        //1302使能
sbit wela = P2^7;                                                                //位選
sbit dula = P2^6;                                                                //段選

sbit KEY1=P3^0;                                                                        //按鍵 設(shè)置/確認(rèn)
sbit KEY2=P3^1;                                                                        //按鍵 加
sbit KEY3=P3^2;                                                                        //按鍵 減

uchar snum,fnum;

char shi,fen,miao;

uchar ss;

char FunctionKeyNum=0;                                //功能鍵鍵值
char FuncTempNum=0;                                        //功能鍵臨時(shí)鍵值
typedef enum KeyState{StateInit,StateAffirm,StateSingle,StateRepeat};        //鍵值狀態(tài)值


/***********寫(xiě)時(shí)分秒地址************/
#define write_shi  0x84
#define write_fen  0x82
#define write_miao 0x80

/***********讀時(shí)分秒地址************/
#define read_shi  0x85
#define read_fen  0x83
#define read_miao 0x81

                  // 0     1    2    3    4     5    6    7    8   9
uchar d[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //共陰不帶小數(shù)點(diǎn)
//uchar dd[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};  //        共陰帶小數(shù)點(diǎn)


void delay(uint z)
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=120;y>0;y--);
}


void t0_init()  //定時(shí)50ms一個(gè)中斷
{

  TMOD |= 0X01;
  TH0 = (65536-46080)/256;
  TL0 = (65536-46080)%256;
  EA = 1;
  ET0 = 1;
  TR0 = 1;

}

void t1_init()
{
        TMOD |= 0x10;
        TH1 = 0xDC;
        TL1 = 0x00;
        TR1 = 1;        
}

void temer0() interrupt 1
{
  TH0=(65536-46080)/256;
  TL0=(65536-46080)%256;
  ss++;
  if(ss==20)
  ss=0;

}         





void display(uchar shi,uchar fen,uchar miao)                          //顯示函數(shù)
{
        if(FunctionKeyNum==0)
        {
                snum=30;
                fnum=30;
        }
        
        if(FunctionKeyNum==1)
        {
                fnum++;
                snum=30;
        }
        
        if(FunctionKeyNum==2)
        {
                snum++;
                fnum=30;
        }
        
        
        if(snum>=30)
        {        
                if((shi/10)<1)         //如果小時(shí)十位小于1,
                {
                wela=1;
                P0=0xfe;                //第1位
                wela=0;

                dula = 1;
                P0=0xff;           // 小時(shí)十位就不顯示
                dula = 0;
                }
               
                else
                {
                wela=1;
                P0=0xfe;          //第1位
                wela=0;

                dula=1;
                P0=d[shi/10];
                dula=0;
                P0=0xff;
                delay(2);
                }
           
                        wela=1;
                        P0=0xfd;           //第2位
                        wela=0;

                        dula=1;
                        P0=d[shi%10];                        //時(shí)的個(gè)位,P0=d[shi%10]時(shí)的個(gè)位小數(shù)點(diǎn)閃爍
                        dula=0;                                        // 時(shí)的個(gè)位,P0=dd[shi%10]時(shí)的個(gè)位小數(shù)點(diǎn)不閃爍
                        P0=0xff;
                        delay(2);
        
        
                if(snum==60)
                        snum=0;
        }               


        //        if(miao%2==0)         //if(miao%2==0) 1秒閃爍1次
                if(ss>=10)                 //        這里寫(xiě)為ss>=10,閃爍頻率可調(diào)
                {                                 
            wela=1;
                P0=0xfb;                //第3位
                wela=0;

                dula=1;
                P0=0x40;          //第三位數(shù)碼管顯示“— ”
               
                dula=0;
                P0=0xff;
                delay(2);
        
                }

                else
                {
                wela=1;
                P0=0xfb;   //第3位
                wela=0;

                dula=1;
                P0=0;          //第三位數(shù)碼管不顯示
                dula=0;
                P0=0xff;
                delay(2);        
                }
        
        
        if(fnum>=30)
        {
                wela=1;
                P0=0xf7;         //第4位
                wela=0;

                dula=1;
                P0=d[fen/10];
                dula=0;
                P0=0xff;
                delay(2);
               
               
                wela=1;
                P0=0xef;         //第5位
                wela=0;

                dula=1;
                P0=d[fen%10];
                dula=0;
                P0=0xff;
                delay(2);
        
               
                if(fnum==60)
                        fnum=0;
        }
               
        //        if(miao%2==0)         //if(miao%2==0) 1秒閃爍1次
                if(ss>=10)                 //if(ss>=10)閃爍頻率可調(diào)
                {
                wela=1;
                P0=0xdf;          //第6位
                wela=0;
                dula=1;
                P0=0x40;          //第六位數(shù)碼管顯示“— ”
                dula=0;
                P0=0xff;

                delay(2);
                }

                else
                {
                wela=1;
                P0=0xdf;   //第6位
                wela=0;
                dula=1;
                P0=0;          //第六位數(shù)碼管不顯示
                dula=0;
                P0=0xff;

                delay(2);
                }
               
               
                wela=1;
                P0=0xbf;                //第7位
                wela=0;

            dula=1;
                P0=d[miao/10];                           //秒十位
                dula=0;
                P0=0xff;
                delay(2);
        

                wela=1;
                P0=0x7f;                          //第8位
                wela=0;

                dula=1;
                P0=d[miao%10];                         //秒個(gè)位
                dula=0;
                P0=0xff;
                delay(2);               
                                   
               
        
        
}  



void write_1302(uchar add,dat)                 //寫(xiě)1302函數(shù)  
{
        uchar i,temp;
        temp=add;
        ce=0;
        _nop_();
        sclk=0;
        _nop_();
        ce=1;
        _nop_();
        for(i=0;i<8;i++)
        {
                sclk=0;
                _nop_();
                if((temp&0x01)==0x01)
                        dio=1;
                        else
                        dio=0;
                temp>>=1;
                sclk=1;
                _nop_();
        }
        temp=dat;
        for(i=0;i<8;i++)
        {
                sclk=0;
                _nop_();
                if((temp&0x01)==0x01)
                        dio=1;
                        else
                        dio=0;
                temp>>=1;
                sclk=1;
                _nop_();
        }
        ce=0;
        sclk=0;
}
uchar read_1302(uchar add)                                   //讀1302函數(shù)               
{
        uchar dat,dat1,i,temp;
        temp=add;
        ce=0;
        _nop_();
        sclk=0;
        _nop_();
        ce=1;
        for(i=0;i<8;i++)
        {
                sclk=0;
                _nop_();
                if((temp&0x01)==0x01)
                        dio=1;
                        else
                        dio=0;
                temp>>=1;
                sclk=1;
                _nop_();
        }
        for(i=0;i<8;i++)
        {
                sclk=0;
                _nop_();
                if(dio)
                    dat|=0x80;
                if(i<7)
                        dat>>=1;
                sclk=1;
        }
        dat1=dat/16;
        dat=dat%16;
        dat=dat1*10+dat;  
        ce=0;
        sclk=0;
        return dat;
}                        



void init_1302()                                                        //初始化函數(shù) 設(shè)置時(shí)間
{        
        write_1302(0x8e,0x00);                                        //保護(hù)取消,可以進(jìn)行寫(xiě)操作
        write_1302(write_miao,0x57);        
        write_1302(write_fen,0x55);
        write_1302(write_shi,0x15);
        write_1302(0x8e,0x80);                                        //保護(hù)啟動(dòng),不能進(jìn)行寫(xiě)操作
}         

void read_sf()
{
        shi=read_1302(read_shi);
        fen=read_1302(read_fen);
        miao=read_1302(read_miao);
        display(shi,fen,miao);

}

void KeyScan(void)
{
        static uchar KeyStateTemp1 = 0;                  //按鍵狀態(tài)臨時(shí)存儲(chǔ)值1
        static uchar KeyStateTemp2 = 0;                  //按鍵狀態(tài)臨時(shí)存儲(chǔ)值2
        static uchar KeyStateTemp3 = 0;                  //按鍵狀態(tài)臨時(shí)存儲(chǔ)值3
        static uchar KeyTime = 0;                          //按鍵延時(shí)時(shí)間
        bit KeyPressTemp1;                                          //按鍵是否按下存儲(chǔ)值1
        bit KeyPressTemp2;                                          //按鍵是否按下存儲(chǔ)值2
        bit KeyPressTemp3;                                          //按鍵是否按下存儲(chǔ)值3

        KeyPressTemp1 = KEY1;                                  //讀取IO口的鍵值
        switch(KeyStateTemp1)
        {
                case StateInit:
                        if(!KeyPressTemp1)                                        //KEY1按下
                                KeyStateTemp1 = StateAffirm;        //按鍵狀態(tài)切換到確認(rèn)態(tài)
                break;
                case StateAffirm:                                                //確認(rèn)狀態(tài)
                        if(!KeyPressTemp1)                                        //按鍵還在按下
                        {
                                KeyTime = 0;
                                KeyStateTemp1 = StateSingle;        //按鍵狀態(tài)切換到單擊狀態(tài)
                        }
                        else KeyStateTemp1 = StateInit;                //否則按鍵抬起,回到初始態(tài)
                break;
               
                case StateSingle:                                                //單擊
                         if(KeyPressTemp1)
                         {
                                KeyStateTemp1 = StateInit;                 //按鍵釋放
                                FuncTempNum++;                                         //鍵值加1
                                if(FuncTempNum>3)  FuncTempNum = 0;
                         }

                         else if(++KeyTime>100)
                         {
                                         KeyPressTemp1 = StateRepeat;
                                        KeyTime = 0;
                         }
                break;
        
                case StateRepeat:                                                 //連發(fā)
                        if(KeyPressTemp1)
                                KeyStateTemp1 = StateInit;
                        else
                        {
                                if(++KeyTime > 10)
                                {
                                        KeyTime = 0;
                                        FuncTempNum++;
                                        if(FuncTempNum>3)  FuncTempNum = 0;
                                }
                                break;
                        }
                break;
        
                default :KeyStateTemp1 = KeyStateTemp1 = StateInit; break;
                        
        }


if(FuncTempNum)                                                                //只有功能鍵被按下后,增加和減小鍵才有效
        {
                KeyPressTemp2 = KEY2;                                        //讀取I/O口的鍵值
                switch(KeyStateTemp2)
                {        
                        case StateInit:                                                //按鍵初始狀態(tài)
                                if(!KeyPressTemp2)                                //當(dāng)按鍵按下,狀態(tài)切換到確認(rèn)態(tài)
                                        KeyStateTemp2 = StateAffirm;
                                break;
                        case StateAffirm:                                        //按鍵確認(rèn)態(tài)
                                if(!KeyPressTemp2)
                                {
                                        KeyTime = 0;
                                        KeyStateTemp2 = StateSingle;//切換到單次觸發(fā)態(tài)        
                                }
                                else KeyStateTemp2 = StateInit; //按鍵已抬起,切換到初始態(tài)
                                break;
                        case StateSingle:                                        //按鍵單發(fā)態(tài)
                                if(KeyPressTemp2)                                //按下時(shí)間小于1s
                                {
                                        KeyStateTemp2 = StateInit;  //按鍵釋放,則回到初始態(tài)
                                        if(FunctionKeyNum == 1)                //若功能鍵第一次按下
                                        {
                                        fen++;
                                        fen=fen/10*16+fen%10;                //轉(zhuǎn)為16進(jìn)制
                                        if(fen==0x60)
                                            fen=0x00;
                                           write_1302(write_fen,fen);        //寫(xiě)入1302
                                        read_sf();                                        //讀出時(shí)間,然后顯示
                                        }
                                        if(FunctionKeyNum == 2)                //若功能鍵第二次按下
                                        {
                                                shi++;
                                                shi=shi/10*16+shi%10;                //轉(zhuǎn)為16進(jìn)制
                                                if(shi==0x24)
                                                        shi=0x00;
                                                write_1302(write_shi,shi);
                                                read_sf();

                                        }
                                        }
                                        else if(++KeyTime > 100)        //按下時(shí)間大于1s(100*10ms)
                                        {
                                                KeyStateTemp2 = StateRepeat;//狀態(tài)切換到連發(fā)態(tài)
                                                KeyTime = 0;        
                                        }
                                break;
                        case StateRepeat:                                        //按鍵連發(fā)態(tài)               
                                if(KeyPressTemp2)
                                        KeyStateTemp2 = StateInit;        //按鍵釋放,則進(jìn)初始態(tài)
                                else                                                        //按鍵未釋放
                                {
                                        if(++KeyTime > 10)                        //按鍵計(jì)時(shí)值大于100ms(10*10ms)
                                        {
                                                KeyTime = 0;        
                                                if(FunctionKeyNum == 1)        //若功能鍵第一次按下
                                                {
                                        fen++;
                                        fen=fen/10*16+fen%10;                //轉(zhuǎn)為16進(jìn)制
                                        if(fen==0x60)
                                            fen=0x00;
                                           write_1302(write_fen,fen);        //寫(xiě)入1302
                                        read_sf();                                        //讀出時(shí)間,然后顯示
                                                }
                                                
                                                if(FunctionKeyNum == 2)        //若功能鍵第二次按下
                                                {
                                                shi++;
                                                shi=shi/10*16+shi%10;                //轉(zhuǎn)為16進(jìn)制
                                                if(shi==0x24)
                                                        shi=0x00;
                                                write_1302(write_shi,shi);
                                                read_sf();
                                                }
                                        }
                                        break;
                                }
                                break;
                        default: KeyStateTemp2 = KeyStateTemp2 = StateInit; break;
                }


                KeyPressTemp3 = KEY3;                                                //讀取I/O口的鍵值
                switch(KeyStateTemp3)
                {        
                        case StateInit:                                                        //按鍵初始狀態(tài)
                                if(!KeyPressTemp3)                                        //當(dāng)按鍵按下,狀態(tài)切換到確認(rèn)態(tài)
                                        KeyStateTemp3 = StateAffirm;
                                break;
                        case StateAffirm:                                                //按鍵確認(rèn)態(tài)
                                if(!KeyPressTemp3)
                                {
                                        KeyTime = 0;
                                        KeyStateTemp3 = StateSingle;        //切換到單次觸發(fā)態(tài)        
                                }
                                else KeyStateTemp3 = StateInit;         //按鍵已抬起,切換到初始態(tài)
                                break;
                        case StateSingle:                                                //按鍵單發(fā)態(tài)
                                if(KeyPressTemp3)                                        //按下時(shí)間小于1s
                                {
                                        KeyStateTemp3 = StateInit;          //按鍵釋放,則回到初始態(tài)
                                        if(FunctionKeyNum == 1)                        //若功能鍵第一次按下
                                        {
                                                fen--;
                                                fen=fen/10*16+fen%10;                //轉(zhuǎn)為16進(jìn)制
                                                if(fen==-1)
                                                fen=0x59;
                                                write_1302(write_fen,fen);
                                                read_sf();
                                        }
                                        if(FunctionKeyNum == 2)                        //若功能鍵第二次按下
                                        {
                                                shi--;
                                                shi=shi/10*16+shi%10;                //轉(zhuǎn)為16進(jìn)制
                                                if(shi==-1)
                                                shi=0x23;
                                                write_1302(write_shi,shi);
                                                read_sf();
                                        }
                                }
                                else if(++KeyTime > 100)                        //按下時(shí)間大于1s(100*10ms)
                                {
                                        KeyStateTemp3 = StateRepeat;        //狀態(tài)切換到連發(fā)態(tài)
                                        KeyTime = 0;        
                                }
                                break;
                        case StateRepeat:                                                //按鍵連發(fā)態(tài)               
                                if(KeyPressTemp3)
                                        KeyStateTemp3 = StateInit;                //按鍵釋放,則進(jìn)初始態(tài)
                                else                                                                //按鍵未釋放
                                {
                                        if(++KeyTime > 10)                                //按鍵計(jì)時(shí)值大于100ms(10*10ms)
                                        {
                                                KeyTime = 0;        
                                                if(FunctionKeyNum == 1)                //若功能鍵第一次按下
                                                {
                                                        fen--;
                                                        fen=fen/10*16+fen%10;                //轉(zhuǎn)為16進(jìn)制
                                                        if(fen==-1)
                                                        fen=0x59;
                                                        write_1302(write_fen,fen);
                                                        read_sf();
                                                }
                                                if(FunctionKeyNum == 2)                //若功能鍵第二次按下
                                                {
                                                        shi--;
                                                        shi=shi/10*16+shi%10;                //轉(zhuǎn)為16進(jìn)制
                                                        if(shi==-1)
                                                        shi=0x23;
                                                        write_1302(write_shi,shi);
                                                        read_sf();
                                                }
                                        }
                                        break;
                                }
                                break;
                        default: KeyStateTemp3 = KeyStateTemp3 = StateInit; break;
                }
        }
}


void ExecuteKeyNum()
{
        if(TF1)
        {
                TF1 = 0;
                TH1 = 0xDC;
                TL1 = 0x00;
                KeyScan();
        }

以上是部分源碼,完整的代碼在附件里:
下載: 時(shí)鐘.rar (26.29 KB, 下載次數(shù): 189)



評(píng)分

參與人數(shù) 1黑幣 +100 收起 理由
admin + 100 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:161033 發(fā)表于 2017-7-8 22:25 | 顯示全部樓層
感謝分享
回復(fù)

使用道具 舉報(bào)

ID:140489 發(fā)表于 2018-1-30 16:26 | 顯示全部樓層
  1. /*********************************************************************************
  2. 8位數(shù)碼管顯示實(shí)時(shí)時(shí)鐘
  3. 仿真 實(shí)物都通過(guò).  11.0592MHz晶振,兩片74HC573做段選、位選
  4. 調(diào)時(shí)的時(shí)候,key2鍵短按加1,長(zhǎng)按連加;key3鍵短按減一,長(zhǎng)按連減;按鍵消抖不用delay
  5. **********************************************************************************/
  6. #include<reg52.h>
  7. #include<intrins.h>
  8. #define uchar unsigned char
  9. #define uint unsigned int

  10. /***********寫(xiě)時(shí)分秒地址************/
  11. #define write_shi  0x84
  12. #define write_fen  0x82
  13. #define write_miao 0x80
  14. /***********讀時(shí)分秒地址************/
  15. #define read_shi  0x85
  16. #define read_fen  0x83
  17. #define read_miao 0x81

  18. sbit sclk = P1^0;           //控制數(shù)據(jù)時(shí)鐘
  19. sbit dio = P1^1;           //數(shù)據(jù)口
  20. sbit ce = P1^2;                   //使能端、復(fù)位端
  21. sbit wela = P2^7;           //位選
  22. sbit dula = P2^6;           //段選
  23. //sbit IO=P1^1;                                                                          //數(shù)據(jù)口
  24. //sbit SCLK=P1^0;                                                                 //控制數(shù)據(jù)時(shí)鐘
  25. //sbit RST=P1^2;                                                                  //使能端、復(fù)位端

  26. sbit key1=P3^0;                                                                        //按鍵 選擇
  27. sbit key2=P3^1;                                                                        //按鍵 加
  28. sbit key3=P3^2;                                                                        //按鍵 減

  29. uchar knum=0,snum,fnum,ss;
  30. char shi,fen,miao;
  31.                   // 0     1    2    3    4     5    6    7    8   9
  32. uchar code d[]={ 0x3F,0x06,0x5B,0x4F,0x66, 0x6D,0x7D,0x07,0x7F,0x6F}; //共陰不帶小數(shù)點(diǎn)
  33. uchar code dd[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};//        共陰帶小數(shù)點(diǎn)

  34. //uchar dd[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};                //共陽(yáng)帶小數(shù)點(diǎn)
  35. //uchar d[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xd8,0x80,0x90};                //共陽(yáng)不帶小數(shù)點(diǎn)

  36. void delay(uint z)
  37. {
  38.         uint x,y;
  39.         for(x=z;x>0;x--)
  40.                 for(y=120;y>0;y--);
  41. }


  42. void t0_init()  //定時(shí)50ms一個(gè)中斷
  43. {
  44.    
  45.   TMOD=0X01;
  46.   TH0=(65536-46080)/256;
  47.   TL0=(65536-46080)%256;
  48. //  TH1=(65536-46080)/256;
  49. //  TL1=(65536-46080)%256;

  50.   EA=1;
  51.   ET0=1;
  52.   TR0=1;
  53. //  ET1=1;
  54. //  TR1=1;

  55. }


  56. void display(uchar shi,uchar fen,uchar miao)                          //顯示函數(shù)
  57. {
  58.         if(knum==0)
  59.         {
  60.                 snum=30;
  61.                 fnum=30;
  62.         }
  63.        
  64.         if(knum==1)
  65.         {
  66.                 fnum++;
  67.                 snum=30;
  68.         }
  69.        
  70.         if(knum==2)
  71.         {
  72.                 snum++;
  73.                 fnum=30;
  74.         }
  75.        
  76.        
  77.         if(snum>=30)
  78.         {       
  79.                 if((shi/10)<1)         //如果小時(shí)十位小于1,
  80.                 {
  81.                         wela=1;
  82.                         P0=0xfe;                //第1位
  83.                         wela=0;
  84.        
  85.                         dula = 1;
  86.                         P0=0xff;           // 小時(shí)十位就不顯示
  87.                         dula = 0;
  88.                 }
  89.                
  90.                 else
  91.                 {
  92.                         wela=1;
  93.                         P0=0xfe;          //第1位
  94.                         wela=0;
  95.        
  96.                         dula=1;
  97.                         P0=d[shi/10];
  98.                         dula=0;
  99.                         P0=0xff;
  100.                         delay(2);
  101.                 }

  102.                 wela=1;
  103.                 P0=0xfd;           //第2位
  104.                 wela=0;

  105.                 dula=1;
  106.                 P0=d[shi%10];                        //時(shí)的個(gè)位,P0=d[shi%10]時(shí)的個(gè)位小數(shù)點(diǎn)閃爍
  107.                 dula=0;                                        // 時(shí)的個(gè)位,P0=dd[shi%10]時(shí)的個(gè)位小數(shù)點(diǎn)不閃爍
  108.                 P0=0xff;
  109.                 delay(2);
  110.        
  111.                 if(snum==60)
  112.                         snum=0;
  113.         }               


  114.         //        if(miao%2==0)         //if(miao%2==0) 1秒閃爍1次
  115.                 if(ss>=10)                 //        這里寫(xiě)為ss>=10,閃爍頻率可調(diào)
  116.                 {                                  
  117.                     wela=1;
  118.                         P0=0xfb;                //第3位
  119.                         wela=0;
  120.        
  121.                         dula=1;
  122.                         P0=0x40;          //第三位數(shù)碼管顯示“— ”
  123.                        
  124.                 //        P0=0x09;          //第三位數(shù)碼管顯示“= ”
  125.                         dula=0;
  126.                         P0=0xff;
  127.                         delay(2);
  128.                 }

  129.                 else
  130.                 {
  131.                         wela=1;
  132.                         P0=0xfb;   //第3位
  133.                         wela=0;
  134.        
  135.                         dula=1;
  136.                         P0=0;          //第三位數(shù)碼管不顯示
  137.                         dula=0;
  138.                         P0=0xff;
  139.                         delay(2);       
  140.                 }
  141.        
  142.        
  143.         if(fnum>=30)
  144.         {
  145.                 wela=1;
  146.                 P0=0xf7;         //第4位
  147.                 wela=0;

  148.                 dula=1;
  149.                 P0=d[fen/10];
  150.                 dula=0;
  151.                 P0=0xff;
  152.                 delay(2);
  153.                
  154.                
  155.                 wela=1;
  156.                 P0=0xef;         //第5位
  157.                 wela=0;

  158.                 dula=1;
  159.                 P0=d[fen%10];
  160.                 dula=0;
  161.                 P0=0xff;
  162.                 delay(2);
  163.        
  164.                
  165.                 if(fnum==60)
  166.                         fnum=0;
  167.         }
  168.                
  169.         //        if(miao%2==0)         //if(miao%2==0) 1秒閃爍1次
  170.                 if(ss>=10)                 //if(ss>=10)閃爍頻率可調(diào)
  171.                 {
  172.                         wela=1;
  173.                         P0=0xdf;          //第6位
  174.                         wela=0;
  175.                         dula=1;
  176.                         P0=0x40;          //第六位數(shù)碼管顯示“— ”
  177.                         dula=0;
  178.                         P0=0xff;
  179.        
  180.                         delay(2);
  181.                 }

  182.                 else
  183.                 {
  184.                         wela=1;
  185.                         P0=0xdf;   //第6位
  186.                         wela=0;
  187.                         dula=1;
  188.                         P0=0;          //第六位數(shù)碼管不顯示
  189.                         dula=0;
  190.                         P0=0xff;
  191.        
  192.                         delay(2);
  193.                 }
  194.                
  195.                
  196.                 wela=1;
  197.                 P0=0xbf;                //第7位
  198.                 wela=0;

  199.             dula=1;
  200.                 P0=d[miao/10];                           //秒十位
  201.                 dula=0;
  202.                 P0=0xff;
  203.                 delay(2);
  204.        

  205.                 wela=1;
  206.                 P0=0x7f;                          //第8位
  207.                 wela=0;

  208.                 dula=1;
  209.                 P0=d[miao%10];                         //秒個(gè)位
  210.                 dula=0;
  211.                 P0=0xff;
  212.                 delay(2);               
  213. }  



  214. void write_1302(uchar add,dat)                 //寫(xiě)函數(shù)  qx
  215. {
  216.         uchar i,temp;
  217.         temp=add;
  218.         ce=0;
  219.         _nop_();
  220.         sclk=0;
  221.         _nop_();
  222.         ce=1;
  223.         _nop_();
  224.         for(i=0;i<8;i++)
  225.         {
  226.                 sclk=0;
  227.                 _nop_();
  228.                 if((temp&0x01)==0x01)
  229.                         dio=1;
  230.                         else
  231.                         dio=0;
  232.                 temp>>=1;
  233.                 sclk=1;
  234.                 _nop_();
  235.         }
  236.         temp=dat;
  237.         for(i=0;i<8;i++)
  238.         {
  239.                 sclk=0;
  240.                 _nop_();
  241.                 if((temp&0x01)==0x01)
  242.                         dio=1;
  243.                         else
  244.                         dio=0;
  245.                 temp>>=1;
  246.                 sclk=1;
  247.                 _nop_();
  248.         }
  249.         ce=0;
  250.         sclk=0;
  251. }
  252. uchar read_1302(uchar add)                                   //讀函數(shù)                qx
  253. {
  254.         uchar dat,dat1,i,temp;
  255.         temp=add;
  256.         ce=0;
  257.         _nop_();
  258.         sclk=0;
  259.         _nop_();
  260.         ce=1;
  261.         for(i=0;i<8;i++)
  262.         {
  263.                 sclk=0;
  264.                 _nop_();
  265.                 if((temp&0x01)==0x01)
  266.                         dio=1;
  267.                         else
  268.                         dio=0;
  269.                 temp>>=1;
  270.                 sclk=1;
  271.                 _nop_();
  272.         }
  273.         for(i=0;i<8;i++)
  274.         {
  275.                 sclk=0;
  276.                 _nop_();
  277.                 if(dio)
  278.                     dat|=0x80;
  279.                 if(i<7)
  280.                         dat>>=1;
  281.                 sclk=1;
  282.         }
  283.         dat1=dat/16;
  284.         dat=dat%16;
  285.         dat=dat1*10+dat;  
  286.         ce=0;
  287.         sclk=0;
  288.         return dat;
  289. }                       

  290. /*
  291. uchar read_1302(uchar add)                                                //讀函數(shù)
  292. {
  293.         uchar i,date;
  294.         RST=0;                                                                                 //禁止讀寫(xiě)數(shù)據(jù)
  295.         for(i=0;i<8;i++)
  296.         {
  297.                 RST=1;
  298.                 SCLK=0;
  299.                 IO=add&0x01;
  300.                 add>>=1;
  301.                 SCLK=1;
  302.         }
  303.         for(i=0;i<8;i++)
  304.         {
  305.                 if(IO)
  306.                         date=date|0x80;
  307.                 else
  308.                         date=date|0x00;
  309.                 SCLK=1;       
  310.                 date>>=1;
  311.                 SCLK=0;
  312.         }
  313.         RST=0;
  314.         date=date/16*10+date%16;                  //進(jìn)制轉(zhuǎn)換 16轉(zhuǎn)10進(jìn)制
  315.         IO=0;                                                          //數(shù)據(jù)讀完后,IO口必須為0,不然小時(shí)一直顯示85
  316.         return date;
  317. }
  318. void write_1302(uchar add,uchar dat)                //寫(xiě)函數(shù)
  319. {
  320.         uchar i;
  321.         RST=0;                                                                        //禁止讀寫(xiě)數(shù)據(jù)
  322.         SCLK=0;                         
  323.         for(i=0;i<8;i++)                                                 //寫(xiě)地址
  324.         {
  325.                 RST=1;                                                                 //允許讀寫(xiě)數(shù)據(jù)
  326.                 SCLK=0;
  327.                 IO=add&0x01;        
  328.                 add>>=1;
  329.                 SCLK=1;
  330.         }
  331.         for(i=0;i<8;i++)                                                 //寫(xiě)數(shù)據(jù)
  332.         {
  333.                 RST=1;                                                                //允許讀寫(xiě)數(shù)據(jù)
  334.                 SCLK=0;       
  335.                 IO=dat&0x01;
  336.                 dat>>=1;
  337.                 SCLK=1;
  338.         }
  339.         RST=0;
  340. }         */


  341. void init_1302()                                                        //初始化函數(shù) 設(shè)置第一次上電時(shí)顯示的時(shí)間值
  342. {       
  343.         write_1302(0x8e,0x00);                                        //保護(hù)取消,可以進(jìn)行寫(xiě)操作
  344.         write_1302(write_miao,0x57);                        //寫(xiě)秒57
  345.         write_1302(write_fen,0x55);                                //寫(xiě)分55
  346.         write_1302(write_shi,0x15);                                //寫(xiě)時(shí)15
  347.         write_1302(0x8e,0x80);                                        //保護(hù)啟動(dòng),不能進(jìn)行寫(xiě)操作
  348. }         

  349. void read_sf()                           //讀時(shí)分秒并顯示
  350. {
  351.         shi=read_1302(read_shi);
  352.         fen=read_1302(read_fen);
  353.         miao=read_1302(read_miao);
  354.         display(shi,fen,miao);
  355. }


  356. void keyscan()                        //按鍵掃描函數(shù)
  357. {       
  358.         static uchar count;          //這里要定義為靜態(tài)變量
  359.         if(key1==0)                          //按鍵按下
  360.         {
  361.                 count++;                          //消抖,也是連加一次的間隔時(shí)間
  362.                 if(key1==0 && count>10)//按鍵按下,計(jì)數(shù)變量加到12,
  363.                 {

  364.                         while(!key1)           //這里不需要連加,就加一句松手檢測(cè)
  365.                         display(shi,fen,miao);
  366.                         count=0;
  367.                         TR0=0;
  368.                         knum++;                          
  369.                         if(knum==1)                                                 
  370.                         {
  371.                                  write_1302(0x8e,0x00);                  //DS1302寫(xiě)保護(hù)取消
  372.                                  write_1302(write_miao,0x80); //寫(xiě)秒80,時(shí)鐘停止走時(shí);
  373.                         }
  374.                        
  375.                         if(knum==3)                                                   //調(diào)時(shí)完畢,時(shí)鐘啟動(dòng)
  376.                         {
  377.                                 TR0=1;
  378.                                 knum=0;
  379.                                 write_1302(write_miao,0x00); //寫(xiě)秒0,時(shí)鐘啟動(dòng)走時(shí)
  380.                                 write_1302(0x8e,0x80);                 //保護(hù)啟動(dòng)
  381.                         }
  382.                 }
  383.         }


  384.         if(knum==1)                                                                //分鐘調(diào)節(jié)
  385.         {
  386.                 if(key2==0)                                                        //加
  387.                 {
  388.                         count++;
  389.                         if(key2==0 && count>12)//短按加1,長(zhǎng)按連加
  390.                         {
  391.                                 count=0;
  392.                                 fen++;
  393.                                 fen=fen/10*16+fen%10;                //轉(zhuǎn)為16進(jìn)制
  394.                                 if(fen==0x60)
  395.                                         fen=0x00;
  396.                                 write_1302(write_fen,fen);        //寫(xiě)入1302
  397.                         }
  398.                 }
  399.                
  400.                 if(key3==0)                                                   //減
  401.                 {
  402.                         count++;
  403.                         if(key3==0 && count>12)//短按減1,長(zhǎng)按連減
  404.                         {
  405.                                 count=0;
  406.                                 fen--;
  407.                                 fen=fen/10*16+fen%10;                //轉(zhuǎn)為16進(jìn)制
  408.                                 if(fen==-1)
  409.                                         fen=0x59;
  410.                                 write_1302(write_fen,fen);
  411.                         }
  412.                 }
  413.         }
  414.        
  415.        
  416.         if(knum==2)                                                          //小時(shí)調(diào)節(jié)
  417.         {
  418.                 if(key2==0)
  419.                 {
  420.                         count++;
  421.                         if(key2==0 && count>12 )//短按加1,長(zhǎng)按連加
  422.                         {
  423.                                 count=0;
  424.                                 shi++;
  425.                                 shi=shi/10*16+shi%10;                //轉(zhuǎn)為16進(jìn)制
  426.                                 if(shi==0x24)
  427.                                         shi=0x00;
  428.                                 write_1302(write_shi,shi);
  429.                         }
  430.                 }
  431.                
  432.                
  433.                 if(key3==0)
  434.                 {
  435.                         count++;
  436.                         if(key3==0 && count>12 )//短按減1,長(zhǎng)按連減
  437.                         {       
  438.                                 count=0;
  439.                                 shi--;
  440.                                 shi=shi/10*16+shi%10;                //轉(zhuǎn)為16進(jìn)制
  441.                                 if(shi==-1)
  442.                                         shi=0x23;
  443.                                 write_1302(write_shi,shi);
  444.                         }
  445.                 }
  446.         }
  447. }          


  448. void main()
  449. {//        uchar i;
  450.         t0_init();
  451.         init_1302();                          
  452.         while(1)
  453.         {
  454.            //        for(i=0;i<4;i++)       
  455.         //        display(shi,fen,miao);
  456.             read_sf();
  457.             keyscan();
  458.         }
  459. }

  460. void temer1() interrupt 1
  461. {
  462.         TH0=(65536-46080)/256;
  463.         TL0=(65536-46080)%256;
  464.         ss++;
  465.         if(ss==20)
  466.                 ss=0;
  467. }        

  468. //void temer2() interrupt 3
  469. //{
  470. //        TH1=(65536-46080)/256;
  471. //        TL1=(65536-46080)%256;
  472. //        ss1++;
  473. //        if(ss1==20) //1秒
  474. //        {       
  475. //                ss1=0;
  476. ////                zs++;
  477. //                zs1--;
  478. //        }
  479. //}



復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

ID:111376 發(fā)表于 2018-1-31 10:43 | 顯示全部樓層
不錯(cuò)不錯(cuò),感謝分享!
回復(fù)

使用道具 舉報(bào)

ID:231936 發(fā)表于 2018-4-21 09:22 | 顯示全部樓層
很好,可是掉電后就變了。
回復(fù)

使用道具 舉報(bào)

ID:74370 發(fā)表于 2018-4-30 14:25 | 顯示全部樓層
感謝分享
回復(fù)

使用道具 舉報(bào)

ID:404878 發(fā)表于 2018-11-17 15:30 | 顯示全部樓層
挺好的,正需要這樣的程序,謝謝樓主
回復(fù)

使用道具 舉報(bào)

ID:404878 發(fā)表于 2018-11-17 15:45 | 顯示全部樓層
很可以想學(xué)習(xí)一下
回復(fù)

使用道具 舉報(bào)

ID:127977 發(fā)表于 2018-11-17 16:47 | 顯示全部樓層
學(xué)習(xí)了 啊 啊
回復(fù)

使用道具 舉報(bào)

ID:658790 發(fā)表于 2019-12-8 14:25 | 顯示全部樓層
仿真為啥打不開(kāi)。。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产精品欧美在线 | 日日操日日操 | 国产三级在线观看 | 日本中文在线观看 | 天天有av| 国产福利91| 日韩中文字幕视频 | 国产成人一区二区 | 精品欧美一区二区三区久久久 | 黑丝一区| 亚洲精品一二三区 | 欧美一区二区三区在线视频 | 白白色在线观看 | 天天操夜夜骑 | www.亚洲国产 | 天天网综合 | 婷婷五月在线视频 | 成人一区二区三区 | 国产视频一二三 | 成人91看片 | 精品久久久久久久久久久久久 | 狠狠五月| 天天色小说 | 成人黄色在线 | 奇米影视亚洲春色 | 日韩欧美黄色片 | 中文字幕一区二区三区四区视频 | 国产一级一片免费播放放a 免费国产视频 | 亚洲欧美在线播放 | 欧美日韩国产三级 | 国产又粗又黄又爽又硬的视频 | 嫩草在线观看 | 青草av在线| 国产二区精品 | 成人a毛片 | 放几个免费的毛片出来看 | 日韩欧美专区 | 欧美久久久久 | 亚洲精品91天天久久人人 | 成年视频在线观看 | 日韩精品视频免费播放 |