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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

基于51單片機的DS1302時鐘顯示設計

[復制鏈接]
跳轉到指定樓層
樓主
ID:517871 發表于 2019-5-9 19:26 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式

#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar a,miao,shi,fen,ri,yue,nian,week,flag,temp,key1n;
#define yh 0x80  //第一行的初始位置
#define er 0x80+0x40 //第二行初始位置
//sbit cs1=P3^7;
//sbit ledk=P2^5;
sbit dula=P2^6;
sbit wela=P2^7;
sbit wr=P1^1;
sbit rs=P1^0;
sbit en=P2^5;
sbit SCLK=P2^1;  // 6  P1.1
sbit IO=P2^0;    // 7  P1.0
sbit RST=P2^4;   //時鐘 5  P1.2
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;
sbit key=P3^7;
sbit key1=P3^0;
sbit key2=P3^1;
sbit key3=P3^2;
uchar code tab1[]={"2009-  -   THU"};
uchar code tab2[]={"  :  :  "};
void delay(uint xms)//延時函數
{
        uint x,y;
        for(x=xms;x>0;x--)
         for(y=110;y>0;y--);
}
/******************液晶寫入************************/
write_1602com(uchar com)//液晶寫入指令函數
{
        rs=0;//置為寫入命令
        P0=com;//送入數據
        delay(1);
        en=1;//拉高使能端
        delay(1);
        en=0;//完成高脈沖
}
write_1602dat(uchar dat)
{
        rs=1;//置為寫入數據
        P0=dat;//送入數據
        delay(1);
        en=1;
        delay(1);
        en=0;
}
/*********************over***********************/
/********************ds1302****************************/
void write_byte(uchar dat)
{
        ACC=dat;
        RST=1;
        for(a=8;a>0;a--)
        {
                IO=ACC0;
                SCLK=0;
                SCLK=1;
                ACC=ACC>>1;
        }
}
uchar read_byte()
{
        RST=1;
        for(a=8;a>0;a--)
        {
                ACC7=IO;
                SCLK=1;
                SCLK=0;
                ACC=ACC>>1;

        }
        return (ACC);
}
void write_1302(uchar add,uchar dat)
{

        RST=0;
        SCLK=0;
        RST=1;
        write_byte(add);
        write_byte(dat);
        SCLK=1;
        RST=0;
}
uchar read_1302(uchar add)
{
        uchar temp;
        RST=0;
        SCLK=0;
        RST=1;
        write_byte(add);
        temp=read_byte();
        SCLK=1;
        RST=0;
        return(temp);
}
uchar BCD_Decimal(uchar bcd)
{
uchar Decimal;
Decimal=bcd>>4;
return(Decimal=Decimal*10+(bcd&=0x0F));
}
void ds1302_init()
{
RST=0;
SCLK=0;
write_1302(0x80,miao|0x00);//允許寫
}


       

void write_sfm(uchar add,uchar dat)//寫時分秒
{
        uchar gw,sw;
        gw=dat%10;
        sw=dat/10;
        write_1602com(er+add);
        write_1602dat(0x30+sw);
        write_1602dat(0x30+gw);
                               

}
void write_nyr(uchar add,uchar dat)
{
        uchar gw,sw;
        gw=dat%10;
        sw=dat/10;
        write_1602com(yh+add);
        write_1602dat(0x30+sw);
        write_1602dat(0x30+gw);
       

}
void write_week(uchar week)//寫星期函數
{
        write_1602com(yh+0x0d);
        switch(week)
        {
                case 1:write_1602dat('M');//delay(5);
                           write_1602dat('O');//delay(5);
                           write_1602dat('N');
                           break;
          
                case 2:write_1602dat('T');//delay(5);
                           write_1602dat('U');//delay(5);
                           write_1602dat('E');
                           break;
               
                case 3:write_1602dat('W');//delay(5);
                           write_1602dat('E');//delay(5);
                           write_1602dat('D');
                           break;
               
                case 4:write_1602dat('T');//delay(5);
                           write_1602dat('H');//delay(5);
                           write_1602dat('U');
                           break;
               
                case 5:write_1602dat('F');//delay(5);
                           write_1602dat('R');//delay(5);
                           write_1602dat('I');
                           break;
               
                case 6:write_1602dat('S');//delay(5);
                           write_1602dat('T');//delay(5);
                           write_1602dat('A');
                           break;
               
                case 7:write_1602dat('S');//delay(5);
                           write_1602dat('U');//delay(5);
                           write_1602dat('N');
                           break;


}



}
lcd_init()//液晶初始化函數
{       wr=0;
        write_1602com(0x38);//設置液晶工作模式
        write_1602com(0x0c);//開顯示不顯示光標
        write_1602com(0x06);//整屏不移動,指針加一
        write_1602com(0x01);
        write_1602com(yh+2);//字符寫入的位置
        for(a=0;a<14;a++)
        {
        write_1602dat(tab1[a]);
        //delay(3);
        }
        write_1602com(er+4);
        for(a=0;a<8;a++)
        {
        write_1602dat(tab2[a]);
        //delay(3);
        }

}
void keyscan()
{
   key=0;
        if(key1==0)//key1為功能鍵
        {
        delay(5);
        if(key1==0)
        {
        while(!key1);
        key1n++;
        if(key1n==9)
                key1n=1;
        switch(key1n)
        {
       
        case 1: TR0=0;//關閉定時器
                        //TR1=0;
                        write_1602com(er+0x0b);//寫入光標位置
                           write_1602com(0x0f);//設置光標為閃爍
                           temp=(miao)/10*16+(miao)%10;
                           write_1302(0x8e,0x00);
                           write_1302(0x80,0x80|temp);//miao
                           write_1302(0x8e,0x80);
                           break;
        case 2:  write_1602com(er+8);//fen
                       
                     //write_1602com(0x0f);
                        break;
        case 3: write_1602com(er+5);//shi
                     //write_1602com(0x0f);
                        break;
        case 4: write_1602com(yh+0x0f);//week
                     //write_1602com(0x0f);
                        break;
        case 5: write_1602com(yh+0x0b);//ri
                     //write_1602com(0x0f);
                        break;
        case 6: write_1602com(yh+0x08);//yue
                     //write_1602com(0x0f);
                        break;
        case 7: write_1602com(yh+0x05);//nian
                     //write_1602com(0x0f);
                        break;
        case 8:
                        write_1602com(0x0c);//設置光標不閃爍
                        TR0=1;//打開定時器
                        temp=(miao)/10*16+(miao)%10;
                           write_1302(0x8e,0x00);
                           write_1302(0x80,0x00|temp);//miao
                           write_1302(0x8e,0x80);
            break;
                               

                                                                                                       
                       
        }
       
       

        }

        }
        if(key1n!=0)//當key1按下以下。再按以下鍵才有效
        {
       
        if(key2==0)  //上調鍵
        {
        delay(5);
        if(key2==0)
        {
        while(!key2);
        switch(key1n)
        {
        case 1:miao++;
                        if(miao==60)
                                miao=0;
                        write_sfm(0x0a,miao);//寫入新的秒數
                        temp=(miao)/10*16+(miao)%10;
                           write_1302(0x8e,0x00);
                           write_1302(0x80,0x80|temp);
                           write_1302(0x8e,0x80);
                        write_1602com(er+0x0b);//因為設置液晶的模式是寫入數據后,指針自動加一,在這里是寫回原來的位置
                        //write_1602com(0x0b);
                        break;
        case 2:fen++;
                        if(fen==60)
                                fen=0;
                        write_sfm(0x07,fen);
                        temp=(fen)/10*16+(fen)%10;
                           write_1302(0x8e,0x00);
                           write_1302(0x82,temp);
                           write_1302(0x8e,0x80);
                        write_1602com(er+8);
                        break;
        case 3:shi++;
                        if(shi==24)
                                shi=0;
                        write_sfm(4,shi);
                        temp=(shi)/10*16+(shi)%10;
                           write_1302(0x8e,0x00);
                           write_1302(0x84,temp);
                           write_1302(0x8e,0x80);
                        write_1602com(er+5);
                        break;
        case 4:week++;
                        if(week==8)
                                week=0;
                                write_week(week);
                       
                        write_1602com(yh+0x0f);
                        break;
        case 5:ri++;
                        if(ri==31)
                                ri=0;
                        write_nyr(10,ri);
                        temp=(ri)/10*16+(ri)%10;
                           write_1302(0x8e,0x00);
                           write_1302(0x86,temp);
                           write_1302(0x8e,0x80);
                        write_1602com(yh+11);
                        break;
        case 6:yue++;
                        if(yue==13)
                                yue=0;
                        write_nyr(7,yue);
                        temp=(yue)/10*16+(yue)%10;
                           write_1302(0x8e,0x00);
                           write_1302(0x88,temp);
                           write_1302(0x8e,0x80);
                        write_1602com(yh+8);
                        break;
        case 7:nian++;
                 if(nian==100)
                        nian=0;
                        write_nyr(4,nian);
                        write_1602com(yh+5);
                        break;
                       

        }

        }

        }
        if(key3==0)
        {
        delay(5);
        if(key3==0)
        {
        while(!key3);
        switch(key1n)
        {
                case 1:miao--;
                                if(miao==-1)
                                        miao=59;
                        write_sfm(0x0a,miao);//寫入新的秒數
                        write_1602com(er+0x0b);//因為設置液晶的模式是寫入數據后,指針自動加一,在這里是寫回原來的位置
                        //write_1602com(0x0b);
                        break;
                case 2:fen--;
                                if(fen==-1)
                                        fen=59;
                        write_sfm(7,fen);
                        temp=(fen)/10*16+(fen)%10;
                           write_1302(0x8e,0x00);
                           write_1302(0x82,temp);
                           write_1302(0x8e,0x80);
                        write_1602com(er+8);
                        break;

                case 3:shi--;
                           if(shi==-1)
                                        shi=23;
                        write_sfm(4,shi);
                        temp=(shi)/10*16+(shi)%10;
                           write_1302(0x8e,0x00);
                           write_1302(0x84,temp);
                           write_1302(0x8e,0x80);
                        write_1602com(er+5);
                        break;
                case 4:week--;
                                if(week==-1)
                                        week=7;
                        write_week(week);
                        write_1602com(yh+0x0f);
                        break;
                case 5:ri--;
                                if(ri==-1)
                                        ri=30;
                        write_nyr(10,ri);
                        temp=(ri)/10*16+(ri)%10;
                           write_1302(0x8e,0x00);
                           write_1302(0x86,temp);
                           write_1302(0x8e,0x80);
                        write_1602com(yh+11);
                        break;
                case 6:yue--;
                                if(yue==-1)
                                        yue=12;
                        write_nyr(7,yue);
                        temp=(yue)/10*16+(yue)%10;
                           write_1302(0x8e,0x00);
                           write_1302(0x88,temp);
                           write_1302(0x8e,0x80);
                        write_1602com(yh+8);
                        break;       
                case 7:nian--;
                 if(nian==-1)
                        nian=99;
                        write_nyr(4,nian);
                        write_1602com(yh+5);
                        break;
                       
                               
        }

        }

        }

        }



}
void init()
{
        TMOD=0x11;
        TH0=0;
        TL0=0;
        EA=1;
        ET0=1;
        TR0=1;



}

void cmg(void)//數碼管鎖存函數
{
dula=1;
P0=0x00;
dula=0;
wela=1;
P0=0x00;
wela=0;
}
void main()
{

   cmg();//數碼管鎖存
        lcd_init();
        ds1302_init();
        init();
        while(1)
        {
                //TH0=(65536-60000)/256;
        //TL0=(65536-60000)%256;
       


keyscan();
       

    }
}
void timer0() interrupt 1
{
        miao = BCD_Decimal(read_1302(0x81));
        fen = BCD_Decimal(read_1302(0x83));
        shi  = BCD_Decimal(read_1302(0x85));
        ri  = BCD_Decimal(read_1302(0x87));
        yue = BCD_Decimal(read_1302(0x89));
        nian=BCD_Decimal(read_1302(0x8d));
        week=BCD_Decimal(read_1302(0x8b));
        //keyscan();       
                write_sfm(10,miao);
        //write_1602com(er+0x0a);
        //write_1602dat(':');
        write_sfm(7,fen);
        //write_1602com(er+0x07);
        //write_1602dat(':');
        write_sfm(4,shi);
       
        //write_nyr(4,nian);
        write_nyr(10,ri);
    write_nyr(7,yue);
        //write_week(week);
}


基于51單片機的DS1302時鐘顯示設計.zip

319.43 KB, 下載次數: 26, 下載積分: 黑幣 -5

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 性色视频 | 九九久久国产精品 | 狠狠干美女 | 精品视频在线播放 | 欧美在线资源 | 日韩网站在线观看 | 韩国久久 | 九九热精品视频 | 色又黄又爽网站www久久 | 成人精品国产一区二区4080 | 亚洲精品68久久久一区 | 国产精品免费一区二区三区 | 久久中文字幕一区 | 超碰在线影院 | 蜜桃特黄a∨片免费观看 | 三级成人在线 | 亚洲一区中文字幕在线观看 | 天天摸天天干 | 日韩一区精品 | 一级大片 | 日韩淫片免费看 | 亚洲一区| 午夜视频免费 | 久久国产一区二区三区 | 亚洲成人精品在线观看 | 国产一区免费 | 亚洲啊v在线 | 欧美精品久久久久 | 久久综合狠狠综合久久综合88 | 国产在线观看福利 | 欧美性成人| 99久久精品一区二区成人 | 久久精品中文 | 亚洲国产中文在线 | 国产精品久久久久不卡 | 成人av高清在线观看 | 99在线免费视频 | 国产一区二区三区 | 国产精品久久久久久久久久 | 97国产精品视频人人做人人爱 | 欧美日韩在线精品 |