找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1575|回复: 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 单片机教程网

快速回复 返回顶部 返回列表