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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

DS1302 8位數碼管時鐘,調時可以連加連減

  [復制鏈接]
跳轉到指定樓層
樓主
附件里有完整源碼和仿真圖

/*********************************************************************************
描述: 8位共陰數碼管時鐘,顯示88-88-88樣式,正常走時的時候,兩個“-”0.5秒閃爍一次;
       調時:按KEY1按鍵第1次分鐘位閃爍,再按KEY2一次分鐘加1,按KEY3一次分鐘減1,長按連加連減;
                         按KEY1按鍵第2次小時位閃爍,再按KEY2一次小時加1,按KEY3一次小時減1,長按連加連減;
                         按KEY1按鍵第3次,秒從零開始累加,時鐘回到正常走時;
                         對時的時候先調好時、分,分鐘要比參考時間的分鐘加1分,
                         再看參考時間的秒數到了59再按KEY1按鍵的第3次,這樣對時可以很準的
仿真 實物都通過.  11.0592MHz晶振,STC89C52RC,兩個74HC573鎖存器做位選、段選
**********************************************************************************/
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int

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

sbit KEY1=P3^0;                                                                        //按鍵 設置/確認
sbit KEY2=P3^1;                                                                        //按鍵 加
sbit KEY3=P3^2;                                                                        //按鍵 減

uchar snum,fnum;

char shi,fen,miao;

uchar ss;

char FunctionKeyNum=0;                                //功能鍵鍵值
char FuncTempNum=0;                                        //功能鍵臨時鍵值
typedef enum KeyState{StateInit,StateAffirm,StateSingle,StateRepeat};        //鍵值狀態值


/***********寫時分秒地址************/
#define write_shi  0x84
#define write_fen  0x82
#define write_miao 0x80

/***********讀時分秒地址************/
#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}; //共陰不帶小數點
//uchar dd[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};  //        共陰帶小數點


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


void t0_init()  //定時50ms一個中斷
{

  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)                          //顯示函數
{
        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)         //如果小時十位小于1,
                {
                wela=1;
                P0=0xfe;                //第1位
                wela=0;

                dula = 1;
                P0=0xff;           // 小時十位就不顯示
                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];                        //時的個位,P0=d[shi%10]時的個位小數點閃爍
                        dula=0;                                        // 時的個位,P0=dd[shi%10]時的個位小數點不閃爍
                        P0=0xff;
                        delay(2);
        
        
                if(snum==60)
                        snum=0;
        }               


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

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

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

                dula=1;
                P0=0;          //第三位數碼管不顯示
                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)閃爍頻率可調
                {
                wela=1;
                P0=0xdf;          //第6位
                wela=0;
                dula=1;
                P0=0x40;          //第六位數碼管顯示“— ”
                dula=0;
                P0=0xff;

                delay(2);
                }

                else
                {
                wela=1;
                P0=0xdf;   //第6位
                wela=0;
                dula=1;
                P0=0;          //第六位數碼管不顯示
                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];                         //秒個位
                dula=0;
                P0=0xff;
                delay(2);               
                                   
               
        
        
}  



void write_1302(uchar add,dat)                 //寫1302函數  
{
        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函數               
{
        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()                                                        //初始化函數 設置時間
{        
        write_1302(0x8e,0x00);                                        //保護取消,可以進行寫操作
        write_1302(write_miao,0x57);        
        write_1302(write_fen,0x55);
        write_1302(write_shi,0x15);
        write_1302(0x8e,0x80);                                        //保護啟動,不能進行寫操作
}         

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;                  //按鍵狀態臨時存儲值1
        static uchar KeyStateTemp2 = 0;                  //按鍵狀態臨時存儲值2
        static uchar KeyStateTemp3 = 0;                  //按鍵狀態臨時存儲值3
        static uchar KeyTime = 0;                          //按鍵延時時間
        bit KeyPressTemp1;                                          //按鍵是否按下存儲值1
        bit KeyPressTemp2;                                          //按鍵是否按下存儲值2
        bit KeyPressTemp3;                                          //按鍵是否按下存儲值3

        KeyPressTemp1 = KEY1;                                  //讀取IO口的鍵值
        switch(KeyStateTemp1)
        {
                case StateInit:
                        if(!KeyPressTemp1)                                        //KEY1按下
                                KeyStateTemp1 = StateAffirm;        //按鍵狀態切換到確認態
                break;
                case StateAffirm:                                                //確認狀態
                        if(!KeyPressTemp1)                                        //按鍵還在按下
                        {
                                KeyTime = 0;
                                KeyStateTemp1 = StateSingle;        //按鍵狀態切換到單擊狀態
                        }
                        else KeyStateTemp1 = StateInit;                //否則按鍵抬起,回到初始態
                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:                                                 //連發
                        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:                                                //按鍵初始狀態
                                if(!KeyPressTemp2)                                //當按鍵按下,狀態切換到確認態
                                        KeyStateTemp2 = StateAffirm;
                                break;
                        case StateAffirm:                                        //按鍵確認態
                                if(!KeyPressTemp2)
                                {
                                        KeyTime = 0;
                                        KeyStateTemp2 = StateSingle;//切換到單次觸發態        
                                }
                                else KeyStateTemp2 = StateInit; //按鍵已抬起,切換到初始態
                                break;
                        case StateSingle:                                        //按鍵單發態
                                if(KeyPressTemp2)                                //按下時間小于1s
                                {
                                        KeyStateTemp2 = StateInit;  //按鍵釋放,則回到初始態
                                        if(FunctionKeyNum == 1)                //若功能鍵第一次按下
                                        {
                                        fen++;
                                        fen=fen/10*16+fen%10;                //轉為16進制
                                        if(fen==0x60)
                                            fen=0x00;
                                           write_1302(write_fen,fen);        //寫入1302
                                        read_sf();                                        //讀出時間,然后顯示
                                        }
                                        if(FunctionKeyNum == 2)                //若功能鍵第二次按下
                                        {
                                                shi++;
                                                shi=shi/10*16+shi%10;                //轉為16進制
                                                if(shi==0x24)
                                                        shi=0x00;
                                                write_1302(write_shi,shi);
                                                read_sf();

                                        }
                                        }
                                        else if(++KeyTime > 100)        //按下時間大于1s(100*10ms)
                                        {
                                                KeyStateTemp2 = StateRepeat;//狀態切換到連發態
                                                KeyTime = 0;        
                                        }
                                break;
                        case StateRepeat:                                        //按鍵連發態               
                                if(KeyPressTemp2)
                                        KeyStateTemp2 = StateInit;        //按鍵釋放,則進初始態
                                else                                                        //按鍵未釋放
                                {
                                        if(++KeyTime > 10)                        //按鍵計時值大于100ms(10*10ms)
                                        {
                                                KeyTime = 0;        
                                                if(FunctionKeyNum == 1)        //若功能鍵第一次按下
                                                {
                                        fen++;
                                        fen=fen/10*16+fen%10;                //轉為16進制
                                        if(fen==0x60)
                                            fen=0x00;
                                           write_1302(write_fen,fen);        //寫入1302
                                        read_sf();                                        //讀出時間,然后顯示
                                                }
                                                
                                                if(FunctionKeyNum == 2)        //若功能鍵第二次按下
                                                {
                                                shi++;
                                                shi=shi/10*16+shi%10;                //轉為16進制
                                                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:                                                        //按鍵初始狀態
                                if(!KeyPressTemp3)                                        //當按鍵按下,狀態切換到確認態
                                        KeyStateTemp3 = StateAffirm;
                                break;
                        case StateAffirm:                                                //按鍵確認態
                                if(!KeyPressTemp3)
                                {
                                        KeyTime = 0;
                                        KeyStateTemp3 = StateSingle;        //切換到單次觸發態        
                                }
                                else KeyStateTemp3 = StateInit;         //按鍵已抬起,切換到初始態
                                break;
                        case StateSingle:                                                //按鍵單發態
                                if(KeyPressTemp3)                                        //按下時間小于1s
                                {
                                        KeyStateTemp3 = StateInit;          //按鍵釋放,則回到初始態
                                        if(FunctionKeyNum == 1)                        //若功能鍵第一次按下
                                        {
                                                fen--;
                                                fen=fen/10*16+fen%10;                //轉為16進制
                                                if(fen==-1)
                                                fen=0x59;
                                                write_1302(write_fen,fen);
                                                read_sf();
                                        }
                                        if(FunctionKeyNum == 2)                        //若功能鍵第二次按下
                                        {
                                                shi--;
                                                shi=shi/10*16+shi%10;                //轉為16進制
                                                if(shi==-1)
                                                shi=0x23;
                                                write_1302(write_shi,shi);
                                                read_sf();
                                        }
                                }
                                else if(++KeyTime > 100)                        //按下時間大于1s(100*10ms)
                                {
                                        KeyStateTemp3 = StateRepeat;        //狀態切換到連發態
                                        KeyTime = 0;        
                                }
                                break;
                        case StateRepeat:                                                //按鍵連發態               
                                if(KeyPressTemp3)
                                        KeyStateTemp3 = StateInit;                //按鍵釋放,則進初始態
                                else                                                                //按鍵未釋放
                                {
                                        if(++KeyTime > 10)                                //按鍵計時值大于100ms(10*10ms)
                                        {
                                                KeyTime = 0;        
                                                if(FunctionKeyNum == 1)                //若功能鍵第一次按下
                                                {
                                                        fen--;
                                                        fen=fen/10*16+fen%10;                //轉為16進制
                                                        if(fen==-1)
                                                        fen=0x59;
                                                        write_1302(write_fen,fen);
                                                        read_sf();
                                                }
                                                if(FunctionKeyNum == 2)                //若功能鍵第二次按下
                                                {
                                                        shi--;
                                                        shi=shi/10*16+shi%10;                //轉為16進制
                                                        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();
        }

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



評分

參與人數 1黑幣 +100 收起 理由
admin + 100 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏7 分享淘帖 頂1 踩
回復

使用道具 舉報

沙發
ID:161033 發表于 2017-7-8 22:25 | 只看該作者
感謝分享
回復

使用道具 舉報

板凳
ID:140489 發表于 2018-1-30 16:26 | 只看該作者
  1. /*********************************************************************************
  2. 8位數碼管顯示實時時鐘
  3. 仿真 實物都通過.  11.0592MHz晶振,兩片74HC573做段選、位選
  4. 調時的時候,key2鍵短按加1,長按連加;key3鍵短按減一,長按連減;按鍵消抖不用delay
  5. **********************************************************************************/
  6. #include<reg52.h>
  7. #include<intrins.h>
  8. #define uchar unsigned char
  9. #define uint unsigned int

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

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

  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}; //共陰不帶小數點
  33. uchar code dd[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};//        共陰帶小數點

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

  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()  //定時50ms一個中斷
  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)                          //顯示函數
  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)         //如果小時十位小于1,
  80.                 {
  81.                         wela=1;
  82.                         P0=0xfe;                //第1位
  83.                         wela=0;
  84.        
  85.                         dula = 1;
  86.                         P0=0xff;           // 小時十位就不顯示
  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];                        //時的個位,P0=d[shi%10]時的個位小數點閃爍
  107.                 dula=0;                                        // 時的個位,P0=dd[shi%10]時的個位小數點不閃爍
  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)                 //        這里寫為ss>=10,閃爍頻率可調
  116.                 {                                  
  117.                     wela=1;
  118.                         P0=0xfb;                //第3位
  119.                         wela=0;
  120.        
  121.                         dula=1;
  122.                         P0=0x40;          //第三位數碼管顯示“— ”
  123.                        
  124.                 //        P0=0x09;          //第三位數碼管顯示“= ”
  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;          //第三位數碼管不顯示
  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)閃爍頻率可調
  171.                 {
  172.                         wela=1;
  173.                         P0=0xdf;          //第6位
  174.                         wela=0;
  175.                         dula=1;
  176.                         P0=0x40;          //第六位數碼管顯示“— ”
  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;          //第六位數碼管不顯示
  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];                         //秒個位
  210.                 dula=0;
  211.                 P0=0xff;
  212.                 delay(2);               
  213. }  



  214. void write_1302(uchar add,dat)                 //寫函數  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)                                   //讀函數                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)                                                //讀函數
  292. {
  293.         uchar i,date;
  294.         RST=0;                                                                                 //禁止讀寫數據
  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;                  //進制轉換 16轉10進制
  315.         IO=0;                                                          //數據讀完后,IO口必須為0,不然小時一直顯示85
  316.         return date;
  317. }
  318. void write_1302(uchar add,uchar dat)                //寫函數
  319. {
  320.         uchar i;
  321.         RST=0;                                                                        //禁止讀寫數據
  322.         SCLK=0;                         
  323.         for(i=0;i<8;i++)                                                 //寫地址
  324.         {
  325.                 RST=1;                                                                 //允許讀寫數據
  326.                 SCLK=0;
  327.                 IO=add&0x01;        
  328.                 add>>=1;
  329.                 SCLK=1;
  330.         }
  331.         for(i=0;i<8;i++)                                                 //寫數據
  332.         {
  333.                 RST=1;                                                                //允許讀寫數據
  334.                 SCLK=0;       
  335.                 IO=dat&0x01;
  336.                 dat>>=1;
  337.                 SCLK=1;
  338.         }
  339.         RST=0;
  340. }         */


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

  349. void read_sf()                           //讀時分秒并顯示
  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()                        //按鍵掃描函數
  357. {       
  358.         static uchar count;          //這里要定義為靜態變量
  359.         if(key1==0)                          //按鍵按下
  360.         {
  361.                 count++;                          //消抖,也是連加一次的間隔時間
  362.                 if(key1==0 && count>10)//按鍵按下,計數變量加到12,
  363.                 {

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


  384.         if(knum==1)                                                                //分鐘調節
  385.         {
  386.                 if(key2==0)                                                        //加
  387.                 {
  388.                         count++;
  389.                         if(key2==0 && count>12)//短按加1,長按連加
  390.                         {
  391.                                 count=0;
  392.                                 fen++;
  393.                                 fen=fen/10*16+fen%10;                //轉為16進制
  394.                                 if(fen==0x60)
  395.                                         fen=0x00;
  396.                                 write_1302(write_fen,fen);        //寫入1302
  397.                         }
  398.                 }
  399.                
  400.                 if(key3==0)                                                   //減
  401.                 {
  402.                         count++;
  403.                         if(key3==0 && count>12)//短按減1,長按連減
  404.                         {
  405.                                 count=0;
  406.                                 fen--;
  407.                                 fen=fen/10*16+fen%10;                //轉為16進制
  408.                                 if(fen==-1)
  409.                                         fen=0x59;
  410.                                 write_1302(write_fen,fen);
  411.                         }
  412.                 }
  413.         }
  414.        
  415.        
  416.         if(knum==2)                                                          //小時調節
  417.         {
  418.                 if(key2==0)
  419.                 {
  420.                         count++;
  421.                         if(key2==0 && count>12 )//短按加1,長按連加
  422.                         {
  423.                                 count=0;
  424.                                 shi++;
  425.                                 shi=shi/10*16+shi%10;                //轉為16進制
  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,長按連減
  437.                         {       
  438.                                 count=0;
  439.                                 shi--;
  440.                                 shi=shi/10*16+shi%10;                //轉為16進制
  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. //}



復制代碼
回復

使用道具 舉報

地板
ID:111376 發表于 2018-1-31 10:43 | 只看該作者
不錯不錯,感謝分享!
回復

使用道具 舉報

5#
ID:231936 發表于 2018-4-21 09:22 | 只看該作者
很好,可是掉電后就變了。
回復

使用道具 舉報

6#
ID:74370 發表于 2018-4-30 14:25 | 只看該作者
感謝分享
回復

使用道具 舉報

7#
ID:404878 發表于 2018-11-17 15:30 | 只看該作者
挺好的,正需要這樣的程序,謝謝樓主
回復

使用道具 舉報

8#
ID:404878 發表于 2018-11-17 15:45 | 只看該作者
很可以想學習一下
回復

使用道具 舉報

9#
ID:127977 發表于 2018-11-17 16:47 | 只看該作者
學習了 啊 啊
回復

使用道具 舉報

10#
ID:658790 發表于 2019-12-8 14:25 | 只看該作者
仿真為啥打不開。。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日本又色又爽又黄又高潮 | 午夜理伦三级理论三级在线观看 | 91网站在线观看视频 | 国产精品日韩欧美一区二区三区 | 一区在线播放 | 日日夜夜精品免费视频 | 午夜久久久久久久久久一区二区 | 97起碰| 99精品一级欧美片免费播放 | 亚洲高清在线 | 日本一本在线 | 亚洲国产成人精品女人久久久野战 | 久热伊人 | 99精品99 | 91视视频在线观看入口直接观看 | 日韩欧美在线观看视频网站 | www.国产视频 | 国产自产c区 | 国产精品久久久久不卡 | 中文字幕 亚洲一区 | 日韩一二区在线 | 日韩成人在线播放 | 欧美片网站免费 | 99精品久久久久久久 | 欧美精品一区二区三区蜜臀 | 日本久久网| 中文字幕第一页在线 | 韩国精品一区 | 欧美一区2区三区3区公司 | 颜色网站在线观看 | 一级黄色片在线免费观看 | 99国产精品99久久久久久粉嫩 | 99在线免费视频 | 日韩精品成人网 | 免费精品 | 国产69久久精品成人看动漫 | yeyeav| 欧美成人精品二区三区99精品 | 视频一区在线 | 国产高清av免费观看 | 精品国产一区二区三区性色av |