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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3819|回復: 0
收起左側

STC15單片機DS1302+12864電子鐘并且可調整 源程序

[復制鏈接]
ID:370644 發表于 2019-12-16 16:56 | 顯示全部樓層 |閱讀模式
/*********************************/
/*采用STC15F204EA  此單片機注意版本,
有A版與B版本之分,它引腳定義不一樣的,
請大家注意!
在12864上顯示萬年歷:可以精確顯示
年月日星期時間,然后可以進行時間任
意調整!長按S1功能鍵后,進行入調整
模式,此時顯示屏上光標在閃動,再按
功能鍵可以跳到另一個需要調整的位置,
S2可以任意加值,按S3可以任意減值,
按8次功能鍵S1,可以回到走時狀態*/
以下是實物圖片展示!
AAA.jpg BB.jpg

單片機源程序如下:
/*********************************/
#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 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 女同videos另类| 中文在线视频观看 | 久久偷人| 狠狠操电影| 国产精品区二区三区日本 | 99re在线视频观看 | 国产一区二区毛片 | 国产精品一二区 | 五月精品视频 | 欧美成人a| 久久精品美女 | 欧美一级特黄aaa大片在线观看 | 亚洲日本一区二区 | 成人一区二区三区在线观看 | 在线a视频网站 | 亚洲三区在线观看 | 成人久久久 | 成人国产精品久久久 | 伊人久久在线观看 | 国产极品粉嫩美女呻吟在线看人 | 日韩欧美视频网站 | 69av在线视频| 精品欧美一区二区三区免费观看 | 日日摸日日碰夜夜爽亚洲精品蜜乳 | 欧美黄色网 | 亚洲一区精品在线 | 一区二区影院 | 国产精品区二区三区日本 | 天天操操 | 午夜天堂精品久久久久 | 日韩电影中文字幕在线观看 | 国产人成精品一区二区三 | 九色在线观看 | 日本精品视频一区二区 | 在线观看视频91 | 中文字幕一区二区三区乱码在线 | 欧美日韩在线国产 | 国产视频一区在线 | 国产视频二区 | 在线小视频 | 国久久 |