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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

萬年歷數碼管顯示代碼

[復制鏈接]
跳轉到指定樓層
樓主
ID:418957 發表于 2018-12-9 15:43 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
#include"main.h"
#include"delay.h"
#include"ds1302.h"

sbit ADD_KEY=P3^1;
sbit SUB_KEY=P3^3;
#define DATA P0   //數碼管顯示口
#define SHOW P2   //數碼管選擇端口

//共陰極數碼管段碼表
uchar code DIS_CODE[]={0x3F,0x06,0x5B,0x4F,
        0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00};

        uchar g_save_time;      //需要保存時間標志
        uchar g_has_set;       //修改時間標志
        uchar g_set_flag;      //設定時間標志
       
/******************************
*函數:指定數碼管顯示數據
*參數:_show指定的數碼管
       _data要顯示的數據
****************************/
void display_num(uchar _show,uchar _data)
{
        SHOW=_show;             //數碼管位選
        DATA=DIS_CODE[_data];   //數碼管段選
        delay_ms(1);
}

/*函數:顯示年、月、日、時、分、秒、星期
*參數: str_time 要顯示的時間*/
void show_time(SYSTEM_TIME str_time)
{
        uchar tmp=0;
        static uchar FLASH=10;  //用靜態變量實現閃爍的效果
       
        display_num(0,2);       //年(高2位)
        display_num(1,0);
       
        tmp=str_time.year;
        if(g_set_flag!=1||FLASH==0)
        {
    display_num(2,(tmp/10));
    display_num(3,(tmp%10));               
        }
       
        tmp=str_time.month;
        if(g_set_flag!=2||FLASH==0)
        {
         if(tmp>9)
         {
          display_num(4,(tmp/10));  //月
         }
         display_num(5,(tmp%10));
        }
       
        tmp=str_time.date;
        if(g_set_flag!=3||FLASH==0)
        {
         if(tmp>9)
         {
           display_num(6,(tmp/10));  //日
         }
         display_num(7,(tmp%10));
        }
       
        tmp=str_time.hour;
        if(g_set_flag!=4||FLASH==0)
        {
         if(tmp>9)
         {
           display_num(8,(tmp/10));  //時
         }
         display_num(9,(tmp%10));
        }
       
        tmp=str_time.min;
        if(g_set_flag!=5||FLASH==0)
        {
         if(tmp>9)
         {
          display_num(10,(tmp/10));  //分
         }
         display_num(11,(tmp%10));
        }
       
        tmp=str_time.sec;
        if(g_set_flag!=6||FLASH==0)
        {
         if(tmp>9)
         {
          display_num(12,(tmp/10));  //秒
         }
         display_num(13,(tmp%10));
        }
       
        tmp=str_time.day;
        if(g_set_flag!=7||FLASH==0)
        {
          display_num(14,tmp);    //星期
        }
       
        if(FLASH--==0)
        {
            FLASH=10;
        }
}

/**************************
*函數;掃描鍵盤,修改時間值
*參數:str_time原來的時間
*返回值:str_time修改后的時間
****************************/
SYSTEM_TIME scan_key(SYSTEM_TIME str_time)
{
if(ADD_KEY==0)
{
  g_has_set=1;
         switch(g_set_flag)
         {
                 case 1:
                         str_time.year++;
                 break;
                 case 2:
                         str_time.month++;
                 break;
                 case 3:
                         str_time.date++;
                 break;                 
                 case 4:
                         str_time.hour++;
                 break;                 
                 case 5:
                         str_time.min++;
                 break;                 
                 case 6:
                         str_time.sec++;
                 break;                 
                 case 7:
                         str_time.day++;
                 break;
     default:
                         break;
         }
}

if(SUB_KEY==0)
{
   g_has_set=1;
         switch(g_set_flag)
         {
                 case 1:
                         str_time.year--;
                 break;
                 case 2:
                         str_time.month--;
                 break;
                 case 3:
                         str_time.date--;
                 break;
                 case 4:
                         str_time.hour--;
                 break;
                 case 5:
                         str_time.min--;
                 break;
                 case 6:
                         str_time.sec--;
                 break;
                 case 7:
                         str_time.day--;
                 break;
                 default:
                         break;
         }
}

if(str_time.year>99)
         str_time.year=0;
if(str_time.month>12)
         str_time.month=1;
if(str_time.date>31)
         str_time.date=1;
if(str_time.hour>23)
         str_time.hour=0;
if(str_time.min>59)
         str_time.min=0;
if(str_time.sec>59)
         str_time.sec=0;
if(str_time.day>7)
         str_time.day=1;

return (str_time);
}

/**********************
*函數:外部0中斷,設定鍵中斷響應
*參數:空
***********************/
void int0_inter() interrupt 0
{
        if(g_has_set==0)     //ADD、SUB鍵未按過
        {
         g_set_flag++;       //設定時間標志加1
                if(g_set_flag>7)
                {
                  g_set_flag=1;
                }
        }else
        {
         g_save_time=1;     //ADD、SUB鍵已按過,要保存數據
        }
}

/***************************************
*函數:主函數,從DS1302讀取數據顯示,可修改數據,并將修改后的
*      數據保存到DS1302
*參數:空
****************************************/
void main(void)
{
uchar key_val=0;
        SYSTEM_TIME str_time;
       
        g_save_time=0;    //全局變量初始化
        g_has_set=0;
        g_set_flag=0;
        ds1302_init();    //DS1302端口初始化
       
        IT0=1;            //下降沿觸發
        EX0=1;            //外部中斷打開
  EA=1;             //全局中斷打開
       
        key_val=P3;       //讀取按鍵狀態
        while(1)
        {
          if(g_set_flag==0)
                {
                 str_time=read_time();   //讀取時間
                }
               
                if((g_set_flag!=0)&&(key_val!=P3))  //判斷是否有按鍵按下
                {
                 key_val=P3;     //讀取按鍵狀態
                 str_time=scan_key(str_time);
                }
               
                show_time(str_time);   //顯示時間
               
                if(g_save_time!=0)
                {
                 set_time(str_time);   //修改DS1302的時間
                 g_save_time=0;        //修改標志量
                 g_has_set=0;
                 g_set_flag=0;
                }
        }
}

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

使用道具 舉報

沙發
ID:1 發表于 2018-12-9 23:04 | 只看該作者
補全原理圖或者詳細說明一下電路連接即可獲得100+黑幣
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产福利视频在线观看 | 国产美女自拍视频 | 一区二区三区视频 | 伦理二区 | 国产成人综合在线 | 国产一区二区免费电影 | 欧洲一区视频 | 超碰成人在线观看 | 精品国产乱码久久久久久88av | 一级片aaa | 欧美综合精品 | 亚洲一级淫片 | 国产精品高潮呻吟久久久久 | 一级毛片视频在线 | 中文字幕av一区二区三区 | h视频在线免费观看 | 精品国产乱码久久久久久中文 | 精品久久香蕉国产线看观看亚洲 | 久久国产亚洲 | 精品一区视频 | 欧美成人免费在线视频 | 国产九九精品 | 女同videos另类| 精品久久久久久中文字幕 | 国产精品久久久久久久午夜片 | 一级aaaaaa毛片免费同男同女 | 99久久精品国产毛片 | 日韩精品 电影一区 亚洲 | 99精品一区| 国产精品海角社区在线观看 | 久久亚洲国产精品 | 精品一区二区三区在线观看国产 | 美女黄色在线观看 | 黄色一级大片在线免费看产 | 综合精品| 欧美一区在线看 | 亚洲精品在线视频 | 特级特黄特色的免费大片 | 国产精品不卡一区 | 日韩精品av| 国产一区二区三区四区 |