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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

基于51單片機的電子鐘1602

[復制鏈接]
跳轉到指定樓層
樓主
可調日期,時間,第一個按鍵進入設置,第二個加數,第三個減數


代碼如下:
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int

uchar a,count,S1num,xqnum;
char yue,ri,shi,fen,miao;
int nian;

sbit lcdrs=P2^0;
sbit lcdrw=P2^1;
sbit lcden=P2^2;

sbit S1=P2^4;                                //定義鍵——進入設置
sbit S2=P2^5;                                //定義鍵——增大
sbit S3=P2^6;                                //定義鍵——減小
sbit S4=P2^7;                                //定義鍵——退出設置

uchar code table0[]="2019-05-14 TUE";
uchar code table1[]="00:00:00";
uchar code xingqi[][3]={"MON","TUE","WED","THU","FRI","SAT","SUN"};

void delay(uint z)                                                         //延時1ms的程序
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);
}
/**************************************************
1602液晶顯示器模塊
sbit lcdrs=P2^5;
sbit lcdrw=P2^4;
sbit lcden=P2^3;
*************************************************/
void write_com(uchar com)                                        //液晶寫指令
{
        lcdrw=0;
        lcdrs=0;
        P0=com;
        delay(5);
        lcden=1;
        delay(5);
        lcden=0;
}

void write_data(uchar dat)                                        //液晶寫數據
{
        lcdrw=0;
        lcdrs=1;
        P0=dat;
        delay(5);
        lcden=1;
        delay(5);
        lcden=0;
}
/********************************************
年月日寫入1602函數
********************************************/
void write_sfm(uchar add,uchar dat)                           //寫時分秒函數
{
        uchar shi,ge;
        shi=dat/10;
        ge=dat%10;
        write_com(0x80+0x40+add);
        write_data(0x30+shi);
        write_data(0x30+ge);
}
void write_yr(uchar add,uchar dat)                           //寫月日函數
{
        uchar shi,ge;
        shi=dat/10;
        ge=dat%10;
        write_com(0x80+add);
        write_data(0x30+shi);
        write_data(0x30+ge);
}
void write_nian(uchar add,uint dat)                           //寫年函數
{
        uint qian,bai,shi,ge;
        qian=dat/1000;
        bai=dat%1000/100;
        shi=dat%100/10;
        ge=dat%10;
        write_com(0x80+add);
        write_data(0x30+qian);
        write_data(0x30+bai);
        write_data(0x30+shi);
        write_data(0x30+ge);
}
/***************************************************
初始化
***************************************************/
void init_lcd()                                                          //液晶初始化
{
        lcden=0;

        nian=2019;
        yue=5;
        ri=14;
        shi=0;                                                                   //初始shi、fen、miao
        fen=0;
        miao=0;

        write_com(0x38);                                           //設置16x2顯示,5x7點陣,8位數據口
        write_com(0x0c);                                           //設置開顯示,不顯示光標
        write_com(0x06);                                           //寫一個字符后地址指針加1
        write_com(0x01);                                           //顯示清0,數據指針清0
}

void init()                                                                        //初始化函數
{
        init_lcd();                                                                 //液晶初始化
        write_com(0x80);                                                  //設置顯示初始坐標
        for(a=0;a<14;a++)                                                   //顯示年月日初始值
        {
                write_data(table0[a]);
                delay(5);
        }
        write_com(0x80+0x40);                                           //設置顯示初始坐標
        for(a=0;a<8;a++)                                                        //顯示時分秒初始值
        {
                write_data(table1[a]);                                       
                delay(5);
        }

        write_nian(0,nian);
        write_sfm(6,miao);                                                         //分別將shi、fen、miao送去液晶顯示
        write_sfm(3,fen);
        write_sfm(0,shi);

        count=0;
        xqnum=0;
        S1num=0;                                                                         //初始化全局變量count

        TMOD=0x01;                                                                          //設置定時器0工作模式1
        TH0=(65535-50000)/256;                                                  //定時器裝初始值
        TL0=(65535-50000)%256;
        EA=1;                                                                                        //開總中斷
        ET0=1;                                                                                        //開定時器0中斷
        TR0=1;                                                                                        //啟動定時器0
}
/**************************************************
獨立鍵盤
sbit S1=P3^0;                                //定義鍵——進入設置
sbit S2=P3^1;                                //定義鍵——增大
sbit S3=P3^2;                                //定義鍵——減小
sbit S4=P3^3;                                //定義鍵——退出設置
獨立鍵盤已接地
*************************************************/
void keyscan()
{
        if(S1==0)
        {
                delay(5);                                        //確認定義鍵被按下
                if(S1==0)
                {
                        S1num++;                                //定義鍵S1按下次數記錄
                        while(!S1);                                //釋放按鍵確認
                        if(S1num==1)                        //S1按下一次時
                        {
                                TR0=0;                                //關閉定時器
                                write_com(0xc0+7);        //光標定位到秒位置
                                write_com(0x0f);        //光標閃爍
                        }
                        if(S1num==2)                         //S1按下兩次時
                        {
                                write_com(0xc0+4);         //光標定位到分位置
                        }
                        if(S1num==3)                          //S1按下三次時
                        {
                                write_com(0xc0+1);          //光標定位到時位置
                        }
                        if(S1num==4)                          //S1按下四次時
                        {
                                write_com(0x80+13);          //光標定位到星期位置
                        }
                        if(S1num==5)                          //S1按下五次時
                        {
                                write_com(0x80+9);          //光標定位到日位置
                        }
                        if(S1num==6)                          //S1按下六次時
                        {
                                write_com(0x80+6);          //光標定位到月位置
                        }
                        if(S1num==7)                          //S1按下七次時
                        {
                                write_com(0x80+3);          //光標定位到年位置
                        }
                        if(S1num==8)                          //S1按下八次時
                        {
                                S1num=0;                          //S1記錄按鍵次數清零
                                TR0=1;                                  //開啟定時器
                                write_com(0x0c);          //取消光標閃爍
                        }
                }
        }
        if(S1num!=0)                                           //只有定義鍵按下后S2、S3、S4才有效
        {
                if(S2==0)
                {
                        delay(5);                                        //防抖
                        if(S2==0)                                   //確認按鍵被按下
                        {
                                while(!S2);                                //釋放按鍵確認
                                if(S1num==1)                        //S1按下一次時
                                {
                                        miao++;                                //調整秒加1
                                        if(miao==60)                //滿60清零
                                                miao=0;
                                        write_sfm(6,miao);                   //每調節一次送液晶顯示一次
                                        write_com(0x80+0x40+6);           //顯示位置重新回到調節處
                                }
                                if(S1num==2)                           //S1按下兩次時
                                {
                                        fen++;                                        //調整分加1
                                        if(fen==60)
                                                fen=0;
                                        write_sfm(3,fen);
                                        write_com(0x80+0x40+3);
                                }
                                if(S1num==3)                                 //S1按下三次時
                                {
                                        shi++;                                          //調整時加1
                                        if(shi==24)
                                                shi=0;
                                        write_com(0x80+0x40);
                                        write_sfm(0,shi);
                                }
                                if(S1num==4)                                                   //星期加調整
                                {
                                        xqnum++;
                                        if(xqnum==7)
                                                xqnum=0;
                                        write_com(0x80+0x0b);
                                        for(a=0;a<3;a++)
                                        {
                                                write_data(xingqi[xqnum][a]);
                                                delay(5);
                                        }
                                }
                                if(S1num==5)                                                                //日加調整
                                {
                                        ri++;
                                        if(yue==2)
                                        {
                                                if(nian%4==0&&nian%100!=0||nian%400==0)
                                                {
                                                        if(ri==30)
                                                        {
                                                                ri=1;
                                                        }
                                                }
                                                if(nian%400!=0)
                                                {
                                                        if(ri==29)
                                                        {
                                                                ri=1;
                                                        }
                                                }
                                        }
                                        else if(yue<=7)
                                        {
                                                if(yue%2==0&yue!=2)
                                                {
                                                        if(ri==31)
                                                        {
                                                                ri=1;
                                                        }
                                                }
                                                else if(yue%2!=0&yue!=2)
                                                {
                                                        if(ri==32)
                                                        {
                                                                ri=1;
                                                        }
                                                }
                                        }
                                        else if(yue>=8)
                                        {
                                                if(yue%2==0)
                                                {
                                                        if(ri==32)
                                                        {
                                                                ri=1;
                                                        }
                                                }
                                                else if(yue%2!=0)
                                                {
                                                        if(ri==31)
                                                        {
                                                                ri=1;
                                                        }
                                                }
                                        }
                                        write_yr(8,ri);
                                }
                                if(S1num==6)                                                        //月加調整
                                {
                                        yue++;
                                        if(yue==13)
                                                yue=1;
                                        write_yr(5,yue);
                                }                                                                                 
                                if(S1num==7)                                                 //年加調整
                                {
                                        nian++;
                                        if(nian==2019)
                                                nian=2014;
                                        write_nian(0,nian);
                                }
                        }
                }
                if(S3==0)
                {
                        delay(5);
                        if(S3==0)                                                 //確認按鍵被按下
                        {
                                while(!S3);
                                if(S1num==1)                                 
                                {
                                        miao--;                                          //調整秒減1
                                        if(miao==-1)                          //減到00后再減重新設置為59
                                                miao=59;
                                        write_sfm(6,miao);
                                        write_com(0x80+0x40+6);
                                }
                                if(S1num==2)
                                {
                                        fen--;                                           //調整分減1
                                        if(fen==-1)
                                                fen=59;
                                        write_sfm(3,fen);
                                        write_com(0x80+0x40+3);
                                }
                                if(S1num==3)
                                {
                                        shi--;                                                //調整時減1
                                        if(shi==-1)
                                                shi=23;
                                        write_sfm(0,shi);
                                        write_com(0x80+0x40);
                                }
                                if(S1num==4)
                                {
                                        xqnum--;                                        //調整星期減一
                                        if(xqnum==-1)
                                                xqnum=6;
                                        write_com(0x80+0x0b);
                                        for(a=0;a<3;a++)
                                        {
                                                write_data(xingqi[xqnum][a]);
                                                delay(5);
                                        }
                                }
                                if(S1num==5)                                   //調整日
                                {
                                        ri--;                                                
                                        if(yue==2)
                                        {
                                                if(nian%400==0)
                                                {
                                                        if(ri==0)
                                                        {
                                                                ri=29;
                                                        }
                                                }
                                                if(nian%400!=0)
                                                {
                                                        if(ri==0)
                                                        {
                                                                ri=28;
                                                        }
                                                }
                                        }
                                        else if(yue==4|6|9|11)                                 
                                        {               
                                                if(yue%2==0&yue!=2)
                                                {
                                                        if(ri==0)
                                                        {
                                                                ri=30;
                                                        }
                                                }
                                                else if(yue%2!=0&yue!=2)
                                                {
                                                        if(ri==0)
                                                        {
                                                                ri=31;
                                                        }
                                                }
                                        }
                                        else if(yue>=8)
                                        {                                                                        
                                                                                        if(yue%2==0)
                                                {
                                                        if(ri==0)
                                                        {
                                                                ri=31;
                                                        }
                                                }
                                                else if(yue%2!=0)
                                                {
                                                        if(ri==0)
                                                        {
                                                                ri=30;
                                                        }
                                                }
                                        }
                                        write_yr(8,ri);                                                
                                }
                                if(S1num==6)                                           //調整月
                                {
                                        yue--;
                                        if(yue==0)
                                                yue=12;
                                        write_yr(5,yue);
                                }
                                if(S1num==7)                                          //調整年
                                {
                                        nian--;
                                        if(nian==2013)
                                                nian=2018;
                                        write_nian(0,nian);
                                }
                        }
                }
                if(S4==0)                                                                   //退出設置、開啟中斷
                {
                        delay(5);
                        if(S4==0)
                        {
                                S1num=0;
                                TR0=1;
                                write_com(0x0c);
                        }
                }
        }
}
/**************************************************
定時器0
*************************************************/
void timer0() interrupt 1                                         //定時器0中斷服務程序
{
        TH0=(65535-50000)/256;                                         //重裝定時器初始值
        TL0=(65535-50000)%256;
        count++;                                                                  //中斷次數累加

}
/*************************************************
主函數
*************************************************/
void main()
{
        init();
        while(1)
        {
                keyscan();
                if(count==20)                                                         //20次50毫秒即一秒
        {
                count=0;
                miao++;
                if(miao==60)                                                  //秒加到60時分進位
                {
                        miao=0;
                        fen++;
                        if(fen==60)                                                  //分加到60時時進位
                        {
                                fen=0;
                                shi++;
                                if(shi==24)                                                //時加到24時清0
                                {
                                        shi=0;
                                        xqnum++;
                                        ri++;

                                        if(yue==2)                                        //如果是二月
                                        {
                                                if(nian%400==0)                         //閏年判斷
                                                {
                                                        if(ri==30)
                                                        {
                                                                ri=1;
                                                                yue++;
                                                                write_yr(5,yue);
                                                        }
                                                }
                                                if(nian%400!=0)                           //平年判斷
                                                {
                                                        if(ri==29)
                                                        {
                                                                ri=1;
                                                                yue++;
                                                                write_yr(5,yue);
                                                        }
                                                }
                                        }
                                        else if(yue<=7&yue!=2)           //一月到七月
                                        {
                                                if(yue%2==0)                //偶數月(除二月)
                                                {
                                                        if(ri==31)                                          
                                                        {
                                                                ri=1;
                                                                yue++;
                                                        }
                                                }
                                                else if(yue%2!=0)                         //奇數月
                                                {
                                                        if(ri==32)
                                                        {
                                                                ri=1;
                                                                yue++;
                                                        }
                                                }
                                                write_yr(5,yue);
                                        }
                                        else if(yue>=8)                                         //八月到12月
                                        {
                                                if(yue%2==0)                //偶數月(除二月)
                                                {
                                                        if(ri==32)                                          
                                                        {
                                                                ri=1;
                                                                yue++;
                                                                if(yue==13)                                   //如果判斷月份為12月,則加一后重新定義月份為1
                                                                {
                                                                        yue=1;
                                                                        nian++;
                                                                        write_nian(0,nian);
                                                                }
                                                                write_yr(5,yue);
                                                        }
                                                }
                                                else if(yue%2!=0)                         //奇數月
                                                {
                                                        if(ri==31)
                                                        {
                                                                ri=1;
                                                                yue++;
                                                                write_yr(5,yue);
                                                        }
                                                }
                                        }
                                        write_yr(8,ri);

                                        if(xqnum==7)                                        //星期寫入
                                                xqnum=0;
                                        write_com(0x80+0x0b);
                                        for(a=0;a<3;a++)
                                        {
                                                write_data(xingqi[xqnum][a]);
                                                delay(5);
                                        }
                                }
                                write_sfm(0,shi);                                //重新寫入數據
                        }
                        write_sfm(3,fen);                                        //重新寫入數據
                }
                write_sfm(6,miao);                                                //重新寫入數據
        }                                                                               //不停的檢測按鍵是否被按下
        }
}


電子鐘1602.rar

119.28 KB, 下載次數: 63, 下載積分: 黑幣 -5

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:649592 發表于 2019-12-12 15:48 | 只看該作者
原理圖打不開?
回復

使用道具 舉報

板凳
ID:328014 發表于 2019-12-12 16:01 | 只看該作者
Chen333 發表于 2019-12-12 15:48
原理圖打不開?

百度一個Proteus8.8白菜直裝版才能打開
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲一二三在线 | 国产精品日韩欧美一区二区三区 | 精品国产乱码久久久久久丨区2区 | 国产精品日韩在线观看 | 日韩在线视频播放 | 精品视频成人 | 国产精品入口久久 | 欧美成人h版在线观看 | 中文字幕第100页 | 日韩在线xx| 日本精品久久久久 | 久久久久国产精品一区二区 | 羞羞的视频在线观看 | 国产日韩欧美在线观看 | 欧美一级特黄aaa大片在线观看 | 欧美一级免费看 | 精品乱子伦一区二区三区 | 久久久久久影院 | 超碰美女在线 | 99久久婷婷国产综合精品电影 | 亚洲欧美中文日韩在线v日本 | 91精品国产欧美一区二区成人 | 亚洲欧美中文日韩在线v日本 | 国产在线一区二区三区 | 激情综合五月 | 亚洲欧美一区二区三区国产精品 | 午夜影院| 亚洲精品1 | 欧美日韩精选 | 国产高清自拍视频在线观看 | 日韩综合在线 | 日韩免费视频一区二区 | 中文字幕视频在线 | 国产婷婷精品 | 人人干人人干人人干 | 欧美一区二区三区 | 中文字幕第90页 | 精品国产伦一区二区三区观看体验 | 精品乱码一区二区 | 国产精彩视频 | 国产一区二区三区四区 |