找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1463|回复: 2
收起左侧

单片机万年历,希望能在我写的程序的基础上修改 //STC89C52 LED1602

[复制链接]
ID:709387 发表于 2020-3-21 18:26 | 显示全部楼层 |阅读模式
10黑币
能显示星期,显示在右上角,并且能修改它;现在情况是用按键修改闹钟后,时间到了,却不会响;很烦这个;还有就是希望能间歇响蜂鸣器,现在是长响;话不多说,各位大佬请看程序:


# include <reg52.h>

#define  uchar unsigned char
#define  uint  unsigned int                //宏定义
/********************************
        脚位定义
********************************/
sbit rs = P3^5;               //写命令/数据端
sbit en = P3^4;               //使能
sbit rw = P3^6;               //led1602读命令/数据端
sbit we = P2^7;               //数码管位选
sbit du = P2^7;               //数码管段选
sbit S2 = P3^0;            
sbit S3 = P3^1;
sbit S4 = P3^2;
sbit S5 = P3^3;               //独立键盘四个按键脚位
sbit fm = P2^3;               //蜂鸣器脚位

uchar count, S2num;    //定时器,修改按键次数,
uchar hour = 7,        //时
       min = 59,       //分
       sec = 55;           //秒         时间
uint nian = 2020,      //年
       yue = 3,        //月
        ri = 19;       //日                日期
uchar clock,
     hour1 = 8,        //时
      min1 = 0;               //分         闹钟
//                  星期一↓ 二↓ 三↓ 四↓ 五↓ 六↓ 日↓
uchar X[] = {"MON,TUE,MED,THU,FRI,SAT,SUN"};//星期循环
uchar code table[] =  "2020-03-19";                    //注意:修改这里必须先修改↑ uchar ↑,↓↓↓↓
uchar code table1[] = "07:59:55  C08:00";   //       否则,时间不会跟着这里走
/********************************************
                        延时函数         
********************************************/
void delay(uint z)//长延时函数                  
{
        uint x, y;
        for(x = z; x > 0;x --)
        for (y = 110; y > 0; y --);
}
/********************************************
                        写命令函数         
********************************************/
void write_com(uchar com)     
{
        rs = 0;
        P0 = com;
        delay(5);
        en = 1;
        delay(5);
        en = 0;
}
/********************************************
                     写数据函数                  
********************************************/
void write_dat(uchar dat)   
{
        rs = 1;
        P0 = dat;
        delay(5);
        en = 1;
        delay(5);
        en = 0;
}
/********************************************
                         初始化函数         
********************************************/
void init()                                       
{
        uchar num;
        rw =0;
        en = 0;
        write_com(0x38);
        write_com(0x0c);
        write_com(0x06);
        write_com(0x01);
        for(num = 0; num < 10; num ++)        
        write_dat(table[num]);
        write_com(0x80 + 0x40);
        for(num = 0; num < 16; num ++)        
        write_dat(table1[num]);
        TMOD = 0x01;
        TH0 = (65536 - 50000) / 256;     //装定时器初值
        TL0 = (65536 - 50000) % 256;
        EA = 1;
        ET0 = 1;
        TR0 = 1;
}
/********************************************
                          定时器函数         
********************************************/
void timer0() interrupt 1                        
{
        TH0 = (65536 - 50000) / 256;//再次装定时器初值
        TL0 = (65536 - 50000) % 256;
        count ++;
}
/********************************************
                          时分秒 + 闹钟函数
********************************************/
void write_sfm(uchar add, uchar date)         
{
        uchar shi, ge;
        shi = date / 10;
        ge = date % 10;
        write_com(0x80 + 0x40 + add);  //时间 / 闹钟显示的位置
        write_dat(0x30 + shi);
        write_dat(0x30 + ge);
}
/********************************************
                           年月日函数
********************************************/
void write_nyr(uint add, uint date)
{                                           //这里不能用uchar,uchar数字最多只有255,显示不全年份
        uint qian, bai, shi, ge;
        qian = date / 1000;
        bai = date % 1000 / 100;
        shi = date % 100 / 10;
        ge = date % 10;        
        write_com(0x80 + add);                  
        if (add == 0)                                    //年显示的位置
        {
                write_dat(0x30 + qian);
                write_dat(0x30 + bai);      
                write_dat(0x30 + shi);
                write_dat(0x30 + ge);
         }
        if(add == 5)                                        //月显示的位置
        {                        
                write_dat(0x30 + shi);
                write_dat(0x30 + ge);
        }
        if(add == 8)                                    //日显示的位置
        {        
                write_dat(0x30 + shi);                        
                write_dat(0x30 + ge);
        }
}
/********************************************
                          星期函数
********************************************/
void write_xq(uchar add, uchar date)         
{
        uchar ge;
        ge = date % 10;
        write_com(0x80 + add);                  //星期显示的位置                        
        write_dat(0x30 + ge);
}
/************************************************************
                日期时间自加函数 + 插入的闹钟函数
*************************************************************/
void write_shijian()
{
        if(count == 20)                    //定时1秒
        {
                count = 0;
                sec ++;
                if(sec == 60)
                {
                        sec = 0;                                          
                        min ++;                                
                        if(min == 60)
                        {
                                min = 0;
                                hour ++;
/*******↓*****↓*****插入闹钟*****↓*****↓*******/
                                if(hour == hour1 & min == min1)         //当时间‘时’‘分’==闹钟‘时’‘分’时,蜂鸣器打开
                                {
                                        fm = 0;                                                 //fm = 0时,蜂鸣器打开,fm = 1时,蜂鸣器关闭
                                }
/**********↑***↑***↑***↑***↑***↑***↑***********/
                                if(hour == 24)
                                {
                                        hour = 0;
                                        ri ++;
                                        if(ri == 31)
                                        {
                                                ri = 1;
                                                yue ++;
                                                if(yue == 13)
                                                {
                                                        yue = 1;
                                                        nian ++;
                                                        if(nian == 2100)
                                                        {
                                                                nian = 0;
                                                                yue = 0;
                                                                ri = 0;
                                                                hour = 0;
                                                                min = 0;
                                                                sec = 0;
                                                        }
                                                        write_nyr(0, nian);//年份送回LED屏幕显示
                                                }
                                                write_nyr(5, yue);         //月份送回LED屏幕显示
                                        }
                                        write_nyr(8, ri);     //天数送回LED屏幕显示
                                }
                                write_sfm(0, hour);           //小时送回LED屏幕显示
                        }
                        write_sfm(3, min);                //分钟送回LED屏幕显示
                 }
                write_sfm(6, sec);                  //秒送回LED屏幕显示                                   
        }
}
/*****************函数声明********************/
void Key();
/********************************************
                           主函数
********************************************/
void main()               
{
        init();               
        while(1)
        {                        
        Key();                         //插入按键函数               
        write_shijian();
        }        
}


/********************************************
                                  按键函数
********************************************/
void Key()                       
{
/***************插入停止闹钟按键设置************/
        if(fm == 0)                        //闹钟是捡来的,到处插入^_^
        {
                if(S5 == 0)
                {
                        delay(5);
                        if(S5 == 0)
                        fm = 1;
                }
        }
/***********修改日期 + 时间 + 闹钟按键设置************/
        if(S2 == 0)                                                //按下修改按键
        {
                delay(25);                                         //软件消抖
                if(S2 == 0)                                        //确认按下
                 {
                         S2num ++;                                //按键次数增加                                            
                        while(!S2);                                //松开按键
                        TR0 = 0;                                //关闭定时器
                        write_com(0x0f);                //打开光标且闪烁
                        if(S2num == 1)               
                                write_com(0x80 + 0x40 + 7);        //修改时间秒针数
                        if(S2num == 2)        
                                write_com(0x80 + 0x40 + 4);        //修改时间分钟数
                        if(S2num == 3)        
                                write_com(0x80 + 0x40 + 1);        //修改时间小时数
                        if(S2num == 4)        
                                write_com(0x80 + 0X40 + 12);//修改闹钟小时数
                        if(S2num == 5)        
                                write_com(0x80 + 0X40 + 15);//修改闹钟分钟份
                        if(S2num == 6)        
                                write_com(0x80 + 3);                //修改日期年份
                        if(S2num == 7)        
                                write_com(0x80 + 6);                //修改日期月份
                        if(S2num == 8)        
                                write_com(0x80 + 9);                //修改日期天数
                        if(S2num == 9)
                        {        
                                S2num = 0;                            //修改按键次数清零
                                write_com(0x0c);            //关闭光标且停止闪烁
                                TR0 = 1;                            //打开定时器
                        }   
                }
        }
/*************增加日期 + 时间 + 闹钟按键设置**************/
        if(S2num != 0)                                        //按下修改按键,取消修改、增加和减少按键才有效
        {
                if(S5 == 0)                                        //取消修改按键(仅在S2按下有效)
                {                                         
                        delay(25);
                        if(S5 == 0)
                        S2num = 0;                                //修改按键次数清零
                           write_com(0x0c);                //关闭光标且停止闪烁
                        TR0 = 1;                                //打开定时器
                }               
                if(S3 == 0)                                        //增加键按下
                {
                        delay(25);                                  //软件消抖
                        if(S3 == 0)                 
                        {
                                while(!S3);                        //确定按键按下
/********************时间*************************/
                                if(S2num == 1)
                                {
                                        sec ++;
                                        if(sec == 60)
                                        sec = 0;
                                        write_sfm(6, sec);
                                        write_com(0x80 + 0x40 + 7);           //秒
                                }
                                if(S2num == 2)
                                {
                                        min ++;
                                        if(min == 60)
                                        min = 0;
                                        write_sfm(3, min);
                                        write_com(0x80 + 0x40 + 4);            //分
                                }
                                if(S2num == 3)
                                {
                                        hour ++;
                                        if(hour == 24)
                                        hour = 0;
                                        write_sfm(0, hour);
                                        write_com(0x80 + 0x40 + 1);                 //时
                             }
/********************闹钟*************************/
                                if(S2num == 4)
                                {
                                        hour1 ++;
                                        if(hour1 == 24)
                                        hour1 = 0;
                                        write_sfm(11, hour1);
                                        write_com(0x80 + 0x40 + 12);         //时
                             }
                                if(S2num == 5)
                                {
                                        min1 ++;
                                        if(min1 == 60)
                                        min1 = 0;
                                        write_sfm(14, min1);
                                        write_com(0x80 + 0x40 + 15);         //分
                             }
/********************日期*************************/
                                if(S2num == 6)
                                {
                                        nian ++;
                                        if(nian == 2101)
                                        nian = 1999;
                                        write_nyr(0, nian);
                                        write_com(0x80 + 3);                      //年
                             }
                                if(S2num == 7)
                                {
                                        yue ++;
                                        if(yue == 13)
                                           yue = 1;
                                        write_nyr(5, yue);
                                        write_com(0x80 + 6);                      //月
                             }
                                if(S2num == 8)
                                {
                                        ri ++;
                                        if(ri == 31)
                                        ri = 1;
                                        write_nyr(8, ri);
                                        write_com(0x80 + 9);                       //日
                             }
                     }
            }
/***********减少日期 + 时间 + 闹钟按键设置******************/
                 if(S4 == 0)                                               //减少键按下
                 {
                        delay(25);
                        if(S4 == 0)
                        {
                                while(!S4);                                        //确定按键按下
/********************时间*************************/
                                if(S2num == 1)
                                {
                                        sec --;
                                        if(sec == -1)
                                        sec = 59;
                                        write_sfm(6, sec);
                                        write_com(0x80 + 0x40 + 7);           //秒
                                }
                                if(S2num == 2)
                                {
                                        min --;
                                        if(min == -1)
                                        min = 59;
                                        write_sfm(3, min);
                                        write_com(0x80 + 0x40 + 4);            //分
                                }
                                if(S2num == 3)
                                {
                                        hour --;
                                        if(hour == -1)
                                        hour = 23;
                                        write_sfm(0, hour);
                                        write_com(0x80 + 0x40 + 1);                 //时
                            }
/********************闹钟*************************/
                                if(S2num == 4)
                                {
                                        hour1 --;
                                        if(hour1 == -1)
                                        hour1 = 23;
                                        write_sfm(11, hour1);
                                        write_com(0x80 + 0x40 + 12);    //时
                                }
                                if(S2num == 5)
                                {
                                        min1 --;
                                        if(min1 == -1)
                                        min1 = 59;
                                        write_sfm(14, min1);
                                        write_com(0x80 + 0x40 + 15);          //分
                                }
/********************日期*************************/
                                if(S2num == 6)
                                {
                                        nian --;
                                        if(nian == 1998)
                                        nian = 2100;
                                        write_nyr(0, nian);
                                        write_com(0x80 + 3);              //年        
                             }
                                if(S2num == 7)
                                {
                                        yue --;
                                        if(yue == 0)
                                        yue = 12;
                                        write_nyr(5, yue);
                                        write_com(0x80 + 6);                     //月        
                             }
                                if(S2num == 8)
                                {
                                        ri --;
                                        if(ri == 0)
                                        ri = 30;
                                        write_nyr(8, ri);
                                        write_com(0x80 + 9);                       //日
                             }
                    }
               }
          }
}

回复

使用道具 举报

ID:709387 发表于 2020-3-21 20:49 | 显示全部楼层
呃,抱歉,没说清楚,是现在不能显示星期,想显示星期,希望能有大神帮忙,
回复

使用道具 举报

ID:709387 发表于 2020-4-28 09:00 | 显示全部楼层
可能是我写得代码不容易看懂吧
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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