找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3168|回复: 0
打印 上一主题 下一主题
收起左侧

STC15单片机DS1302+12864电子钟并且可调整 源程序

[复制链接]
跳转到指定楼层
楼主
/*********************************/
/*采用STC15F204EA  此单片机注意版本,
有A版与B版本之分,它引脚定义不一样的,
请大家注意!
在12864上显示万年历:可以精确显示
年月日星期时间,然后可以进行时间任
意调整!长按S1功能键后,进行入调整
模式,此时显示屏上光标在闪动,再按
功能键可以跳到另一个需要调整的位置,
S2可以任意加值,按S3可以任意减值,
按8次功能键S1,可以回到走时状态*/
以下是实物图片展示!


单片机源程序如下:
/*********************************/
#include <reg52.h>//头文件
#define uchar unsigned char//宏定义        
#define uint unsigned int//宏定义
sfr P0M0        =   0x94;
sfr P0M1        =   0x93;
sfr P1M0        =   0x92;
sfr P1M1        =   0x91;
sfr P2M0        =   0x96;
sfr P2M1        =   0x95;
sfr P3M0        =   0xb2;
sfr P3M1        =   0xb1;
sfr P4M0        =   0xb4;
sfr P4M1        =   0xb3;
sfr P5M0        =   0xca;
sfr P5M1        =   0xc9;
sfr P6M0        =   0xcc;
sfr P6M1        =   0xcb;
sfr P7M0        =   0xe2;
sfr P7M1        =   0xe1;
sfr P5=0xC8;//xxxx,1111 端口5
sbit SCLK=P0^1;//时钟信号线
sbit DATA=P3^1;//数据线
sbit RST=P3^0;//复位端
sbit rs=P2^0;//液晶1602控制端
sbit rw=P2^1;//液晶1602控制端
sbit e=P2^2; //液晶1602使能端
sbit s1=P3^2;//功能键
sbit s2=P2^7;//-键
sbit s3=P2^6;//+键
/******************************************************/
/*变量分别为:miao秒,fen分,shi时,ri日,yue月,nian年,
xin星期,dii定计数变量,num5按键计数,readvalue转换后数*/
/*******************************************************/
uchar miao,fen,shi,ri,yue,nian,xin,dii,num5, readvalue;
/******************************************************/
/*变量分别为:flash秒--年调整标志位,flag显示标志位,
flag1进入功能模式标志位,flag2星期调整标志位*/
/*******************************************************/
bit flash,flag,flag1,flag2;
uchar code table[]={"0123456789"};//液晶1602数据表
/**********************************/
//延时函数1//
//入口参数:z
/*********************************/
void delaya(uchar z)//延时1
{
        uchar x;
        for(x=z;x>0;x--);                        
}
/**********************************/
//延时函数2//
//入口参数:z
/*********************************/
void delayb(uchar z)
{
        uchar x,y;
        for(y=z;y>0;y--)
        for(x=100;x>0;x--);                        
}

/**********************************/
//向1302写一个字节数据//
//入口参数:dat
/*********************************/
void write1302xei(uchar dat)
{
        uchar x;
        
        delaya(2);//等待一会儿
        for(x=0;x<8;x++)//循环8次将一个字数发送完毕
        {
                DATA=dat&0x01;//取出最低位,从而实现一位位传送
                delaya(2);//等待一会儿
                SCLK=1;//置高形成上升沿
                delaya(2);//延时
                SCLK=0;//置低
                dat>>=1;//等待传送第二个字节
        }
}

/**************************************/
//根据控制字向1302写一个字节数据//
//入口参数:控制参数kong,实际参数can
/*************************************/
void write1302(uchar kong,uchar can)
{
        SCLK=0;//置低
        RST=0;//置低
        RST=1;//高电平时送数据
        delaya(2);//延时
        write1302xei(kong);//写控制命令
        write1302xei(can);//写数据
        SCLK=1;//置高形成上升沿
        RST=0;//置低               
}
/**************************************/
//向1302读一个字节数据//
//入口参数:dat,x
/*************************************/
uchar read1302du()
{
        uchar dat,x;

        for(x=0;x<8;x++)//循环8次,读完一个字节
        {
                dat>>=1;//右位一位为下一个字节发送作好准备
                //DATA=dat;
                if(DATA==1)//如果数据端为1,则执行下面语句
                dat|=0x80;//将最高位给它
                SCLK=1;//置高
                delaya(2);//延时
                SCLK=0;//置低
                delaya(2);//延时        
        }
        return dat;//将值返回
}
/**************************************/
//根据控制字向1302读一个字节数据//
//入口参数:控制参数kong  实际参:dat
/*************************************/
uchar read1302(uchar kong)
{
        uchar dat;//定义变量
        RST=0;//先置0
        SCLK=0;//置0
        RST=1;//准备传数据
        write1302xei(kong);//写控制字
        dat=read1302du();//读数
        SCLK=1;//形成上升沿
        RST=0;//置0
        return dat;//将值返回
}
void init1302()
{
/*以下是掉电保护函数通过判断标志位是否为1来判断*/
         uchar flag;
        flag=read1302(0x81);//读秒数据
        if(flag&0x80==1)//判断最高位是否为1,若为1则说明芯片停止工作了,若为0则说明没有停止
        {
        write1302(0x8e,0x00);//去掉保护
        write1302(0x80,((12/10)<<4)|(12%10));/*显示54秒/*先将BCD码求模得到高位,然后左移四位,
        //得到了高四位,然后将BCD码求余这样就得到了低四位,然后相或就转换成了二进制代码了*/
        write1302(0x82,((59/10)<<4)|(59%10));//显示59分
        write1302(0x84,((23/10)<<4)|(23%10));//显示23点
        write1302(0x86,((7/10)<<4)|(7%10));//显示07日
        write1302(0x88,((3/10)<<4)|(3%10));//显示03月
        write1302(0x8c,((10/10)<<4)|(10%10));//显示10年
        write1302(0x8a,((7/10)<<4)|(7%10));//显示星期天
        write1302(0x90,0xa5);//打开充电方式,选择一个二极管2K电阻
        write1302(0x8e,0x80);//打开保护
        }

        /*以下是开机复位函数*/
        /*
        write1302(0x8e,0x00);//去掉保护
        write1302(0x80,((12/10)<<4)|(12%10));
        write1302(0x82,((59/10)<<4)|(59%10));//显示59分
        write1302(0x84,((23/10)<<4)|(23%10));//显示23点
        write1302(0x86,((7/10)<<4)|(7%10));//显示07日
        write1302(0x88,((3/10)<<4)|(3%10));//显示03月
        write1302(0x8c,((10/10)<<4)|(10%10));//显示10年
        write1302(0x8a,((7/10)<<4)|(7%10));//显示星期天
        write1302(0x90,0xa5);//打开充电方式,选择一个二极管2K电阻
        write1302(0x8e,0x80);//打开保护
        */
}
/**************************************/
//以下是液晶模块1602操纵
/*************************************/

/**************************************/
//写指令到液晶
//入口参数:dat
/*************************************/
/************************************************************************/
/**********************延时50微秒子程序**********************************/
/************************************************************************/
void delay50us(uint z) //延时子程序
{
        uint x,y;
        for(x=z;x>0;x--)
        for(y=19;y>0;y--);
}/***********写命令**********************/
void write1602(uchar dat)
{
        rs=0;//控制端置低
        rw=0;//控制端置低
        e=0;//使能端置低
        delay50us(50);
        P1=dat;//送数
        e=1;//使能端置1
        delay50us(50);
        e=0;//置0
        delay50us(50);
}
/*void write1602(uchar dat)
{
        write1602a(dat|0x80);//与0x80相或后得到的数
}*/
/**************************************/
//写数据(ASCII码)到液晶
//入口参数:dat
/*************************************/
void read1602(uchar dat)
{
        rs=1;//控制端置高
        rw=0;//控制端置低
        e=0;//使能端置0
        delay50us(50);
        P1=dat;//送数据
        e=1;//形成上升沿
        delay50us(50);
        e=0;//清0
        delay50us(50);
}
void delayms(uint z) //延时子程序
{
        uint x,y;
        for(x=z;x>0;x--)
        for(y=120;y>0;y--);
}
/************************************************************************/
/************************汉字指针的显示方法**********************************/
/************************************************************************/
void hanzi(uchar *ch)
{
        while(*ch!=0)
        read1602(*ch++);
        delayms(200);        
}
/**************************************/
//1602液晶初始化
/*************************************/
void init1602()
{
        write1602(0x30);//
        /************************************/
        /*打开所有显示,0x08关显示,关闭光标,关闭反白
        0x0c开显示,关闭光标,关闭反白,0x0e开显示,开光标,关闭反白,
        0x0f开显示,开光标,开反白*/
        /************************************/
        write1602(0x01);//清屏  
        write1602(0x0c);//开显示,不显示光标
        write1602(0x06);//光标右移,AC自动加1
        write1602(0x89);//在第一行第2个位置显示即相当于0x81处显示
        hanzi("【牛电子钟】");
        write1602(0x98);//在第一行第2个位置显示即相当于0x81处显示
        hanzi("SL1302IC15W204EA");
        write1602(0x80);//在第一行第2个位置显示即相当于0x81处显示
        read1602('D');//在第一行第3个位置显示D
        read1602('a');//在第一行第4个位置显示a
        read1602('t');//在第一行第5个位置显示t
        //read1602('e');//在第一行第6个位置显示e
        read1602(':');//在第一行第7个位置显示:
        read1602('2');//在第一行第8个位置显示2
        read1602('0');//在第一行第9个位置显示0
        write1602(0x84);//在第一行显示
        read1602('-'); //显示-
        read1602('-'); //显示-
        write1602(0x86);//在第一行显示
        read1602('-');//显示-
        read1602('-'); //显示-
        write1602(0x90);//在第二行第1个位置显示a
        read1602('T');//显示T
        read1602(':');//显示:
        write1602(0x92);//在第二行显示
        read1602(':');//显示:
        write1602(0x94);//在第二行显示
        read1602(':');//显示:
        write1602(0x96);//在第二行显示
        read1602('W');//显示W
        read1602(':');//显示:
}
/**************************************/
//1302数据显示程序
/*************************************/

/**************************************/
//秒显示程序
//入口参数:dat
/*************************************/
void Displaymiao(uchar dat)
{
        write1602(0x95);//秒钟显示位置
        read1602(table[(dat/10)]);//显示秒钟十位
        read1602(table[(dat%10)]);//显示秒钟个位
}
/**************************************/
//分显示程序
//入口参数:dat
/*************************************/
void Displayfen(uchar dat)
{
        write1602(0x93);//分钟显示位置
        read1602(table[(dat/10)]);//显示分钟十位
        read1602(table[(dat%10)]);//显示分钟个位
}
/**************************************/
//时显示程序
//入口参数:dat
/*************************************/
void Displayshi(uchar dat)
{
        write1602(0x91);//时钟显示位置
        read1602(table[(dat/10)]);//显示时钟十位
        read1602(table[(dat%10)]);//显示时钟个位
}
/**************************************/
//日显示程序
//入口参数:dat
/*************************************/
void Displayri(uchar dat)
{
        write1602(0x87);//日显示位置
        read1602(table[(dat/10)]);//显示日十位
        read1602(table[(dat%10)]);//显示日个位
}
/**************************************/
//月显示程序
//入口参数:dat
/*************************************/
void Displayyue(uchar dat)
{
        write1602(0x85);//月显示位置
        read1602(table[(dat/10)]);//显示月十位
        read1602(table[(dat%10)]);//显示月个位
}
/**************************************/
//年显示程序
//入口参数:dat
/*************************************/
void Displaynian(uchar dat)
{
        write1602(0x83);//年显示位置
        read1602(table[(dat/10)]);//显示年十位
        read1602(table[(dat%10)]);//显示年个位
}
/**************************************/
//星期几显示程序
//入口参数:dat
/*************************************/
void Displayxin(uchar dat)
{
        write1602(0x97);//星期显示位置
        read1602(table[(dat%10)]);//显示星期个位
}
/**************************************/
//从1302里读出数据并送往1602液晶显示
/*************************************/
void value()
{
        readvalue=read1302(0x81);//读出秒值给变量readvalue
        miao=((readvalue&0x70)>>4)*10+(readvalue&0x0f);/*先将秒数最高位与低四位去掉,
        然后右位四位*10得到高四位,然后将秒值保留低四位与高四位相加,这样将二进制码转换成了BCD码*/        
        Displaymiao(miao);//将BCB码送到液晶显示
        readvalue=read1302(0x83);//读出分值给变量readvalue
        fen=((readvalue&0x70)>>4)*10+(readvalue&0x0f);//将分二进制码转换成BCD码        
        Displayfen(fen);//将分送液晶1602显示
        readvalue=read1302(0x85);//读出时值给变量readvalue
        shi=((readvalue&0x70)>>4)*10+(readvalue&0x0f);//将时二进制码转换成BCD码        
        Displayshi(shi);//将时送液晶1602显示
        readvalue=read1302(0x87);//读出日值给变量readvalue
        ri=((readvalue&0x70)>>4)*10+(readvalue&0x0f);//将日二进制码转换成BCD码        
        Displayri(ri);//将日送液晶1602显示
        readvalue=read1302(0x89);//读出月值给变量readvalue
        yue=((readvalue&0x70)>>4)*10+(readvalue&0x0f);//将月二进制码转换成BCD码        
        Displayyue(yue);//将月送液晶1602显示
        readvalue=read1302(0x8d);//读出年值给变量readvalue
        nian=((readvalue&0xf0)>>4)*10+(readvalue&0x0f);//将月二进制码转换成BCD码        
        Displaynian(nian);//将年送液晶1602显示
        readvalue=read1302(0x8b);//读出星期值给变量readvalue
        xin=((readvalue&0x70)>>4)*10+(readvalue&0x0f);//将星期二进制码转换成BCD码        
        Displayxin(xin);//将星期送液晶1602显示
}

/**************************************/
/*************按键处理子函数**********/
/*************************************/

void sky()
{
        if(flag1==1)//如果进入功能模式标志位为1,则执行以下程序
        {
                write1302(0x8e,0x00);//让时间停下来
                write1302(0x80,0x80);
                write1302(0x8e,0x80);//让时间停下来
                flag=1;//让显示子程序停下来
                write1602(0x0f);//将液晶光标闪动打开,以便我们看清楚具体调哪个位置
                write1602(0x97);//将光标闪烁的位置选定
                flash=1;//将秒---年标志位打开
                flag2=1;//将星期调整加+与减-标志位打开
        }
        if(flag2==1)//如果星期调整加+与减-标志位为1就执行以下程序
        {        
                if(s2==0)//如果+键按下就执行以下程序
                {
                        delayb(5);//去下抖
                        if(s2==0)//再次确认是否按下了
                        {
                                while(!s2)//按键释放
                                Displayxin(xin);//调用显示星期子程序
                                xin++;//将星期+1
                                if(xin==8)//如果星期到了8就清它清1
                                xin=1;//清1
                                write1302(0x8e,0x00);//去掉保护
                                write1302(0x8a,((xin/10)<<4)|(xin%10));//显示星期天
                                write1302(0x8e,0x80);//打开保护
                                readvalue=read1302(0x8b);//读星期
                                xin=((readvalue&0xf0)>>4)*10+(readvalue&0x0f);//将星期值还原        
                                Displayxin(xin);//送显示
                                write1602(0x97);//光标停留位置
                        }
                }
                if(s3==0)//如果-按键按下了
                {
                        delayb(5);//去抖
                        if(s3==0)//如果-按下了,就执行以下程序
                        {
                                while(!s3)//按键释放
                                Displayxin(xin);//星期显示子程序
                                xin--;//减1        
                                if(xin==(1-1))//如果到了(1-1)就给它7,因为星期只1---7
                                xin=7;//将它给7
                                write1302(0x8e,0x00);//去掉保护
                                write1302(0x8a,((xin/10)<<4)|(xin%10));//显示星期天
                                write1302(0x8e,0x80);//打开保护
                                readvalue=read1302(0x8b);
                                xin=((readvalue&0xf0)>>4)*10+(readvalue&0x0f);//读星期值        
                                Displayxin(xin);//星期显示子程序
                                write1602(0x97);//光标位置
                        }
                }
        }
        if(flash==1)//如果秒---年标志位打开,执行以下程序
        {
                if(s1==0)//加+按键按下了吗?
                {
                        delayb(5);//去抖
                        if(s1==0)//再次判断是否按下
                        {
                                while(!s1);//按键释放
                                flag2=0;//将星期调整加+与减-标志位关闭,防止星期调整部分动作
                                num5++;//将按键记数器加1
                                switch(num5)//判断按键记数器
                                {
                                        case 1://如果等1调整秒
                                        flag1=0;//将进入功能模式标志位清0,即不要它动作
                                        write1602(0x95);//光标位置
                                        break;//返回
                                        case 2://调整分
                                        write1602(0x93);//光标位置
                                        break;//返回
                                        case 3://调整时
                                        write1602(0x91);//光标位置
                                        break;//返回
                                        case 4://调整日
                                        write1602(0x87);//光标位置
                                        break;//返回
                                        case 5://调整月
                                        write1602(0x85);//光标位置
                                        break;//返回
                                        case 6://调整年
                                        write1602(0x83);//光标位置
                                        break;//返回
                                        case 7://归0
                                        num5=0;//将记数器清0
                                        if(num5==0)//如果记数器为0,则执下以下程序
                                        {
                                                write1302(0x8e,0x00);//让时间停下来
                                                write1302(0x80,0x00);
                                                write1302(0x8e,0x80);//让时间停下来
                                                flag=0;//让时钟开始走
                                                flash=0;//秒--年调整标志位复位
                                                flag1=0;//星期调整加+与减-标志位复位
                                                TR0=1;//定时器打开,以准备下次调整
                                                write1602(0x0c);//关闭光标闪动        
                                                break;
                                        }
                        
                                }        
                                                                                       
                        }
                }
        }
        if(num5!=0)//如果将按键记数器不为0则执行以下程序
        {
                switch(num5)//判断它num5情况
                {
                        /**************************************/
                        /*************秒处理子函数**********/
                        /*************************************/
                        case 1://miao秒调整
                        if(s2==0)//加按键有按下吗?
                        {
                                delayb(5);
                                if(s2==0)
                                {
                                        while(!s2)//按键释放
                                        Displaymiao(miao);//调用显示
                                        miao++;//秒加1
                                        if(miao==60)//到了60?
                                        miao=0;//清0
                                        write1302(0x8e,0x00);//去掉保护
                                        write1302(0x80,((miao/10)<<4)|(miao%10));//秒数据写入
                                        write1302(0x8e,0x80);//打开保护
                                        readvalue=read1302(0x81);//调用读秒子程序
                                        miao=((readvalue&0xf0)>>4)*10+(readvalue&0x0f);//还原秒        
                                        Displaymiao(miao);//显示
                                        write1602(0x95);//光标位置
                                }
                        }
                        if(s3==0)//减按键是否有按下?
                        {
                                delayb(5);
                                if(s3==0)
                                {
                                        while(!s3)//按键释放
                                        Displaymiao(miao);//调用秒显示
                                        miao--;//减1
                                        if(miao==(0-1))//如果秒等于(0-1)
                                        miao=59;//将秒寄存器给59
                                        write1302(0x8e,0x00);//去掉保护
                                        write1302(0x80,((miao/10)<<4)|(miao%10));//秒数据写入
                                        write1302(0x8e,0x80);//打开保护
                                        readvalue=read1302(0x81);//读秒数据
                                        miao=((readvalue&0xf0)>>4)*10+(readvalue&0x0f);//转换秒数据        
                                        Displaymiao(miao);//送显示
                                        write1602(0x95);//光标位置
                                }
                        }
                        break;//返回
                        /**************************************/
                        /*************分处理子函数**********/
                        /*************************************/
                        case 2://fen分钟调整
                        if(s2==0)
                        {
                                delayb(5);
                                if(s2==0)
                                {
                                        while(!s2)
                                        Displayfen(fen);
                                        fen++;
                                        if(fen==60)
                                        fen=0;
                                        write1302(0x8e,0x00);//去掉保护
                                        write1302(0x82,((fen/10)<<4)|(fen%10));//分数据写入
                                        write1302(0x8e,0x80);//打开保护
                                        readvalue=read1302(0x83);
                                        fen=((readvalue&0xf0)>>4)*10+(readvalue&0x0f);        
                                        Displayfen(fen);
                                        write1602(0x93);
                                }
                        }
                        if(s3==0)
                        {
                                delayb(5);
                                if(s3==0)
                                {
                                        while(!s3)
                                        Displayfen(fen);
                                        fen--;
                                        if(fen==(0-1))
                                        fen=59;
                                        write1302(0x8e,0x00);//去掉保护
                                        write1302(0x82,((fen/10)<<4)|(fen%10));//分数据写入
                                        write1302(0x8e,0x80);//打开保护
                                        readvalue=read1302(0x83);
                                        fen=((readvalue&0xf0)>>4)*10+(readvalue&0x0f);        
                                        Displayfen(fen);
                                        write1602(0x93);
                                }
                        }
                        break;
                        /**************************************/
                        /*************小时处理子函数**********/
                        /*************************************/
                        case 3://shi小时调整
                        if(s2==0)
                        {
                                delayb(5);
                                if(s2==0)
                                {
                                        while(!s2)
                                        Displayshi(shi);
                                        shi++;
                                        if(shi==24)
                                        shi=0;
                                        write1302(0x8e,0x00);//去掉保护
                                        write1302(0x84,((shi/10)<<4)|(shi%10));//时数据写入
                                        write1302(0x8e,0x80);//打开保护        
                                        readvalue=read1302(0x85);
                                        shi=((readvalue&0xf0)>>4)*10+(readvalue&0x0f);        
                                        Displayshi(shi);
                                        write1602(0x91);
                                }
                        }
                        if(s3==0)
                        {
                                delayb(5);
                                if(s3==0)
                                {
                                        while(!s3)
                                        Displayshi(shi);
                                        shi--;
                                        if(shi==(0-1))
                                        shi=23;
                                        write1302(0x8e,0x00);//去掉保护
                                        write1302(0x84,((shi/10)<<4)|(shi%10));//时数据写入
                                        write1302(0x8e,0x80);//打开保护
                                        readvalue=read1302(0x85);
                                        shi=((readvalue&0xf0)>>4)*10+(readvalue&0x0f);        
                                        Displayshi(shi);
                                        write1602(0x91);
                                }
                        }
                        break;
                        /**************************************/
                        /*************日处理子函数**********/
                        /*************************************/
                        case 4://ri日调整
                        if(s2==0)
                        {
                                delayb(5);
                                if(s2==0)
                                {
                                        while(!s2)
                                        Displayri(ri);
                                        ri++;
                                        if(ri==32)
                                        ri=1;
                                        write1302(0x8e,0x00);//去掉保护
                                        write1302(0x86,((ri/10)<<4)|(ri%10));//日数据写入
                                        write1302(0x8e,0x80);//打开保护
                                        readvalue=read1302(0x87);
                                        ri=((readvalue&0xf0)>>4)*10+(readvalue&0x0f);        
                                        Displayri(ri);
                                        write1602(0x87);
                                }
                        }
                        if(s3==0)
                        {
                                delayb(5);
                                if(s3==0)
                                {
                                        while(!s3)
                                        Displayri(ri);
                                        ri--;
                                        if(ri==(1-1))
                                        ri=31;
                                        Displayri(ri);
                                        write1302(0x8e,0x00);//去掉保护
                                        write1302(0x86,((ri/10)<<4)|(ri%10));//日数据写入
                                        write1302(0x8e,0x80);//打开保护        
                                        readvalue=read1302(0x87);
                                        ri=((readvalue&0xf0)>>4)*10+(readvalue&0x0f);        
                                        Displayri(ri);
                                        write1602(0x87);
                                }
                        }
                        break;
                        /**************************************/
                        /*************月处理子函数**********/
                        /*************************************/
                        case 5://yue月调整
                        if(s2==0)
                        {
                                delayb(5);
                                if(s2==0)
                                {
                                        while(!s2)
                                        Displayyue(yue);
                                        yue++;
                                        if(yue==13)
                                        yue=1;
                                        write1302(0x8e,0x00);//去掉保护
                                        write1302(0x88,((yue/10)<<4)|(yue%10));//月数据写入
                                        write1302(0x8e,0x80);//打开保护
                                        readvalue=read1302(0x89);
                                        yue=((readvalue&0xf0)>>4)*10+(readvalue&0x0f);        
                                        Displayyue(yue);
                                        write1602(0x85);
                                }
                        }
                        if(s3==0)
                        {
                                delayb(5);
                                if(s3==0)
                                {
                                        while(!s3)
                                        Displayyue(yue);
                                        yue--;
                                        if(yue==(1-1))
                                        yue=12;
                                        write1302(0x8e,0x00);//去掉保护
                                        write1302(0x88,((yue/10)<<4)|(yue%10));//月数据写入
                                        write1302(0x8e,0x80);//打开保护
                                        readvalue=read1302(0x89);
                                        yue=((readvalue&0xf0)>>4)*10+(readvalue&0x0f);//月转换        
                                        Displayyue(yue);
                                        write1602(0x85);
                                }
                        }
                        break;
                        /**************************************/
                        /*************年处理子函数**********/
                        /*************************************/
                        case 6://nian年调整
                        if(s2==0)
                        {
                                delayb(5);
                                if(s2==0)
                                {
                                        while(!s2)
                                        Displaynian(nian);
                                        nian++;
                                        if(nian==99)
                                        nian=0;
                                        write1302(0x8e,0x00);//去掉保护
                                        write1302(0x8c,((nian/10)<<4)|(nian%10));//年数据写入
                                        write1302(0x8e,0x80);//打开保护
                                        readvalue=read1302(0x8d);
                                        nian=((readvalue&0xf0)>>4)*10+(readvalue&0x0f);//年数据转换        
                                        Displaynian(nian);
                                        write1602(0x83);
                                }
                        }
                        if(s3==0)
                        {
                                delayb(5);
                                if(s3==0)
                                {
                                        while(!s3)
                                        Displaynian(nian);
                                        nian--;
                                        if(nian==(0-1))
                                        nian=99;
                                        write1302(0x8e,0x00);//去掉保护
                                        write1302(0x8c,((nian/10)<<4)|(nian%10));//年数据写入
                                        write1302(0x8e,0x80);//打开保护
                                        readvalue=read1302(0x8d);
                                        nian=((readvalue&0xf0)>>4)*10+(readvalue&0x0f);        
                                        Displaynian(nian);
                                        write1602(0x83);
                                }
                        }
                        break;
                }
        }               
}

/**************************************/
/************主程序处理部分***********/
/*************************************/
void main()
{
        P0M0=0x00;
        P0M1=0x00;
        P1M0=0x00;
        P1M1=0x00;
        P2M0=0x00;
        P2M1=0x00;
        P3M0=0x00;
        P3M1=0x00;
        P5M0=0x00;  
        P5M1=0x00;
        P4M0=0x00;  
        P4M1=0x00;
        TMOD=0x01;//选择定时器工作方式
        TH0=(65536-20000)/256;//赋值给高位
        TL0=(65536-20000)%256;//赋值给低位
        EA=1;//开总中断
        ET0=1;//开定时器中断
        TR0=1;//开定时器
        init1302();//初始化1302子程序
        init1602();//初始化1602子程序
        while(1)
        {
                if(flag==0)//如果标志位flag等于0,则执行显示程序,即调整时间时不执行显示程序
                value();//调用显示子程序
                sky();//调用按键子程序
        }
}
/**************************************/
/*****长按功能键进行调整处理部分*****/
/*************************************/
void led() interrupt 1 //中断服务子程序
{  
        TH0=(65536-20000)/256;//赋值高位
        TL0=(65536-20000)%256;//赋值低位
        dii++;//将中断次数加1
        if(dii==120)//到了120次中断吗?
        {
                dii=0;//清0准备下一次中断                        
                if(s1==0)//功能键按下了吗?
                {
                        delayb(5);//消抖
                        if(s1==0)//再次确认
                        {
                                while(!s1);//按键释放        
                                flag1=1;//将进入功能键标置位置1
                                TR0=0;//关闭定时器,防止操纵其它功能时误动作
                        }
                }        
        }

}

下载地址:
实测视频.rar (2.31 MB, 下载次数: 40)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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