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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

液晶1602數字時鐘顯示屏

[復制鏈接]
跳轉到指定樓層
樓主
ID:421891 發表于 2018-11-6 19:48 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
#include<reg51.h>
#define ucharunsigned char
#define uintunsigned int
sbit lcdrs=P2^0;//定義1602 液晶RS端
sbit lcdrw=P2^1;
sbitlcden=P2^2;  //定義1602液晶lcden端
sbits1=P1^0;  //定義按鍵--功能鍵
sbit s2=P1^1; //定義按鍵-增加鍵
sbit s3=P1^2;                 //減小
sbit s4=P1^3; //定義按鍵-鬧鐘鍵
sbitbeep=P2^4;//定義蜂鳴器
sbit led=P2^3;//定義LED燈端
ucharcount,s1num,s4num;
charyear,month,day,week,miao,shi,fen,pshi;
uchar codetable[]=" 20 - - ";//定義初始上電時液晶默認顯示狀態
void delay(uintz) //延時函數
{
   uint x,y;
   for(x=z;x>0;x--)
      for(y=110;y>0;y--);
}
void zhuanhuan()
{
if(shi==0)
     pshi=12;
if(shi<=12&&shi>=1)
     pshi=shi;
if(shi>12)
   pshi=shi-12;
}
void di()//蜂鳴器發生函數
{
  beep=0;
  delay(300);
  beep=1;
  delay(300);
}
void write_com(ucharcom) //液晶寫命令
{
lcdrs=0;
lcden=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
voidwrite_date(uchar date)    //液晶寫數據函數
  {
      lcdrs=1;
       lcden=0;
       P0=date;
       delay(5);
       lcden=1;
       delay(5);
       lcden=0;
      }
void _shi()//寫 'AM"、"PM"函數
      {
      if(shi>=12)
        {
      write_com(0x80+0x40+1);//寫出"PM"
       write_date('P');
       write_date('M');
        }
      else
        {
      write_com(0x80+0x40+1);//寫出"AM"
       write_date('A');
       write_date('M');
        }
}
voidwrite_ymd(uchar add1,uchar date1)
{
      uchar shi,ge;
      shi=date1/10;//分解-一個 2位數的十位和個位
       ge=date1%10;
      write_com(0x80+add1);//設置 顯示位置
       write_date(0x30+shi); //送去液晶顯示十位   
       write_date(0x30+ge);  //送去液晶顯示各位
}
voidwrite_sfm(uchar add,uchar date) //寫時分秒函數
{
      uchar shi,ge;
      shi=date/10;//分解一一個2位數的十位和個位
       ge=date%10;
      write_com(0x80+0x40+add);// 設置顯示位置
       write_date(0x30+shi);//送 去液晶顯示十位
       write_date(0x30+ge); //送 去液晶顯示個位
  }
voidwrite_week(char week)  //與液晶星期顯示函數
{
      write_com(0x80+12);
       switch(week)
        {
      case 1: write_date('M');delay(5);
               write_date('O');delay(5);
                write_date('N');
                     break;
      case 2: write_date('T');delay(5);
               write_date('U' );delay(5);
                write_date('E');
                     break;
      case 3: write_date('W');delay(5);
               write_date('E' );delay(5);
                write_date('D');break;
      case 4: write_date('T');delay(5);
               write_date('H');delay(5);
                     write_date('U');
                     break;
      case 5: write_date('F');delay(5);
               write_date('R');delay(5);
                     write_date('I');
                     break;
      case 6: write_date('S');delay(5);
               write_date('A');delay(5);
                     write_date('T');
                     break;

      case 7: write_date('S');delay(5);
                 write_date('U');delay(5);
                     write_date('N');
                     break;
                     }
                     }
void writeym()
{
day=1;
month++;
if(month==13)
{
  month=1;
  year++;
if(year==100)
      year=0;
      write_ymd(3,year);// 若變化則重新寫入
        }
      write_ymd(6,month);//月 若變化則重新寫入
      }
void init()//初始化函數
{
      uchar num;
       lcden=0;
      year=13;//初始化種變量值
       month=6;
       day=21;
       week=5;
       shi=13;
       fen=59;
       miao=58;
       count=0;
       s1num=0;
       s4num=0;
      write_com(0x38);//初始化1602液晶
       write_com(0x0c);
       write_com(0x06);
       write_com(0x01);
      write_com(0x80);// 設置顯示初始坐標
      for(num=0;num<15;num++)//顯示年月日星期
     {
      write_date(table[num]);
       delay(5);
        }
      delay(5);
         write_com(0x80+0x40+6);//與出時間顯示部分的兩個".”
            write_date(':');
            delay(5);
        write_com(0x80+0x40+9);
            write_date(':');
            delay(5);
        write_week(week);
        write_ymd(3,year);//分 別送去液晶顯示
            write_ymd(6,month);
            write_ymd(9,day);
        write_sfm(10,miao);//分別送去液晶顯示
            write_sfm(7,fen);
            write_sfm(4,shi);
        TMOD=0x01;//設置定時器0 I.作模式1
            TH0=(65536-50000)/256;//定時器裝初值
            TL0=(65536-50000)%256;
            EA=1; //開總中斷
        ET0=1; //開定時器0中斷
            TR0=1; //啟動定時器 0
            }
void keyscan()//按鍵掃描函數
{
    if(s1==0)
      {
      delay(5);
     if(s1==0)   //確認按鍵被按下
       {
       s1num++;//功能鍵按下次數記錄
        while(!s1);//釋放確認
       if(s1num==1)//
         {
          TR0=0; //關閉定時 器
         write_com(0x80+3);//光標定位到年位置
             write_com(0x0f); //光標開始閃爍
             }
       if(s1num==2)//第二次按下光標閃爍定位到月位置
       {
        write_com(0x80+6);
         }
        if(s1num==3)//第三次按下光標閃爍定位到日位置{
         {
             write_com(0x80+9);
             }
        if(s1num==4)//第四次按下光標閃爍定位到星期位置
            {
         write_com(0x80+12);
             }
         if(s1num==7)//第七次按下光標閃爍定位到秒位置
             {
         write_com(0x80+0x40+10);
         }
         if(s1num==6)//第六次按下光標閃爍定位到分位置
          {
             write_com(0x80+0x40+7);
             }
          if(s1num==5)//第五次按下光標閃爍定位到時位置
             {
           write_com(0x80+0x40+4);
              }
          if(s1num==8)//第七次按下{
             {
         s1num=0;//記錄按鍵數清零
         write_com(0x0c);//取消光標閃爍
         TR0=1; //啟動定時 器使時鐘開始走
             }
        }
}
if(s1num!=0)//只有功能鍵被按下后,增加和減小鍵才有效{
{
     if(s2==0)
      {
          delay(5);
      if(s2==0)//增加鍵確認被按下
      {
         while(!s2);//按鍵釋放
         if(s1num==1)//若功能鍵第1次按下
   {
       year++;//  則調整年加1
         if(year==100)//若滿100后將清零
        year=0;
       write_ymd(3,year);//每調節-次送液晶顯示-下
        write_com(0x80+3);//顯示位 置重新回到調節處
        
            }
             if(s1num==2)// 若功能鍵第二次按下
          {
             month++;//則調整月加1
            if(month==13)//若滿12后將置:,
               month=1;
            write_ymd(6,month);//每調節次送液晶顯示一 下
            write_com(0x80+6);//顯示位 置重新回到調節處
           }
            if(s1num==3)//若功能鍵第三次按下
             {
                      day++;//則調整日加1
              if(year%4==0&&month==2)
              {
                    if(day==30)//若滿29后將置1
                    day=1;
                    }
              if(year%4!=0&&month==2)
              {
                    if(day==29)//若滿28后將置1
              day=1;
                    }
     if(month!=2&&month!=4&&month!=6&&month!=9&&month!=11)
         {
      if(day==32)//若滿31后將置1
       day=1;
        }
      if(month==4||month==6||month==9||month==11)
        {
      if(day==31)//若滿30后將置1
       day=1;
         }
      write_ymd(9,day);//每調節-次送液晶顯示-下
       write_com(0x80+9);//顯示位置重新回到調節處
       }
     if(s1num==4)//若功能鍵第四次按下
        {
      week++;//則調整星期加1
      if(week==8)//若滿8后將置一
      week=1;
      write_week(week);//每調節-次送液晶顯示一下
       write_com(0x80+12);//顯示位置重新回到調節處
         }
     if(s1num==7)//若功能鍵第七次按下
        {
      miao++;//則調整秒加一
      if(miao==60)//若滿60后將清零
       miao=0;
      write_sfm(10,miao);//每調節一次送液晶顯示 : ." 下
      write_com(0x80+0x40+10);//顯示位置重新回到調節處
     }
      if(s1num==6)//巖功能鍵第2次按下
        {
      fen++;//則調整分鐘加1
      if(fen==60)//若滿60后將清零
      fen=0;
      write_sfm(7,fen);//每調節次送液晶顯示 . 下
      write_com(0x80+0x40+7);//顯示位置重新回到調節處
        }
       if(s1num==5)//巖功能鍵第5次按下
        {
      shi++;
      if(shi==24)//若滿24后將清零
       {
        shi=0;
         }
       if(s4num==0)
        {
             write_sfm(4,shi);//每調節一 次送液 晶顯示一下
         write_com(0x80+0x40+4);//顯示位置重新回到調節處
        }
            if(s4num==1)
            {
          zhuanhuan();
             _shi();
          write_sfm(4,pshi);//每調節 - 次送液晶顯示. 下
          write_com(0x80+0x40+4);// 顯示位置重新回到調節處
            }
       }
      }   
  }            
}         
      if(s3==0)
       {
      delay(5);
      if(s3==0)//確認減小鍵被按下
      {
       while(!s3);//按鍵釋放
      if(s1num==1)//若功能鍵第1次按下
        {
        year--;        //則調整秒減一
        if(year==-1)//若減到負數則將其重新設置為99
            year=99;
       write_ymd(3,year);//每調節 -次送液晶顯示- 下
        write_com(0x80+3);//顯示位 置重新回到調節處
         }
      if(s1num==2)//若功能鍵第二次按下
        {
      month--;//則調整分鐘減1                     
      if(month==0);//若減到負數則將其重新設置為59
      month=12;
      write_ymd(6,month);//每調節次送液晶顯示 --下
       write_com(0x80+6);//顯示位 置重新回到調節處
      }
       if(s1num==3)//若功能鍵第_次按下
        {
      day--;//則調整日加1
      if(year%4==0&&month==2)
    {
      if(day==0)//若滿29后置一
      day=29;
      }
    if(year%4!=0&&month==2)
      {
    if(day==0)//若滿28后置一
      day=28;
      }
  if(month!=2&&month!=4&&month!=6&&month!=9&&month!=11)
      {
       if(day==0)//若滿31后置一
       day=31;
        }
   if(month==4||month==6||month==9||month==11)
     {
    if(day==0)//若滿30后置一
      day=30;
       }
     write_ymd(9,day);//每調節一次送液晶屏顯示一下
       write_com(0x80+9);//顯示位 置重新回到調節處
      }
    if(s1num==4)//若功能鍵第二次被按下
      {
       week--;//則調整小時減1
       if(week==0)//若減到負數則將其重新設置為23
         week=7;
      write_week(week);//每調節 次送液晶顯示一 下
       write_com(0x80+12);// 顯示位置重新回到調節處
       }
      if(s1num==7)//若功能鍵第-次按下
      {  
       miao--;//則調整秒誠1
      if(miao==-1)//若減到負數則將其重新設置為59
      miao=59;
      write_sfm(10,miao);//每調節一次送液晶顯示- - 下
      write_com(0x80+0x40+10);// 顯示位置重新回到調節處
        }
     if(s1num==6)//若功能鍵第2次按下
        {
      fen--;//則調整分鐘減1
      if(fen==-1)//若減到負數則將其重新設置為59
      fen=59;
      write_sfm(7,fen);//每調節一次送液晶顯示- 下
      write_com(0x80+0x40+7);// 顯示位置重新回到調節處
      }
       if(s1num==5)//若功能鍵第二次按下
        {
       shi--;
       if(shi==-1)//若滿24后將清零
        shi=23;
       if(s4num==0)
         {
       write_sfm(4,shi);//每調節一 次送液 晶顯示- 下
       write_com(0x80+0x40+4);//顯示位置重新回到調節處
         }
       if(s4num==1)
       {
        zhuanhuan();
        _shi();
       write_sfm(4,pshi);//每調節 - 次送液晶顯示. 下
       write_com(0x80+0x40+4);// 顯示位置重新回到調節處
         }
        }
    }
}
if(s1num==0)
{
     if(s4==0)
       {
       delay(5);
       if(s4==0)// 確認功能鍵被按下
         {
       s4num++;//功能鍵按下次數記錄
       while(!s4);//釋放確認
       if(s4num==1)//第一次被按下
        {
        zhuanhuan();
            _shi();
        write_sfm(4,pshi);
         }
       if(s4num==2)//第二次按下{
         {
         s4num=0;//記錄按鍵數清零
             write_com(0x80+0x40+1);
             write_date(' ');
         write_date(' ');
         write_sfm(4,shi);
         }
        }
       }
      }
}
void main()
{
   init();//首先初始化各數據
   while(1)//進入主程序大循環
      {
     keyscan();//不停的檢測按鍵是否被按下
     if(s1num!=0)
        led=0;
     else
      led=miao%2;
    if((shi>7&&shi<23)&&(fen==0)&&(miao==0) )
       {
      di();
        }
   }
}
void timer0()interrupt 1  //定時器0中斷服務程序
{
  TH0=(65536-50000)/256;//再次裝定時器初值
  TL0=(65536-50000)%256;
  count++; //中斷次數累加
  if(count==20)//20次50毫秒為1秒
  {
     count=0;
       miao++;
    if(miao==60)//秒加到60則進位分鐘
     {
       miao=0;//同時秒數清零
       fen++;
    if(fen==60)//分鐘加到60則進位小時
      {
       fen=0;//同時分鐘數清零
        shi++;
     if(shi==24)//小時加到24則小時清零
       {
     shi=0;
     week++;
  if(week==8)
    {
      week=1;
      }
    write_week(week);//星期若變化則重新寫入
      day++;
     if(year%4==0&&month==2)//判斷是否為閏年的2月
       {
       if(day==30)
         {
       writeym();
         }
       write_ymd(9,day);//日若變化則重新寫入
       }
      if(year%4!=0&&month==2)//判斷是否為平年的2月
        {
             if(day==29)
             {
          writeym();
             }
          write_ymd(9,day);//日若變化則重新寫入
       }
        if(month!=2&&month!=4&&month!=6&&month!=9&&month!=11)
            {
      if(day==32)
        {
       writeym();
         }
        write_ymd(9,day);//ri若變化則重新寫入     
        }
       if(month==4||month==6||month==9||month==11)
      {
       if(day==31)
      {
       writeym();
        }
     write_ymd(9,day);//H 若變化則重新寫入
       }
        if(s4num==1)
         {
          zhuanhuan();
          _shi();
          write_sfm(4,pshi);//12 小時制小時若變化則重新寫入
            }
      else write_sfm(4,shi);//24 小時制小時若變化則重新寫入
       }
    write_sfm(7,fen);//分鐘若變化則重新寫入
      }
write_sfm(0,miao);//秒若變化則重新寫入
   } }
}




評分

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

查看全部評分

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 99精品视频一区二区三区 | 精品国产一区探花在线观看 | av网站免费观看 | 日韩一二区在线 | 皇色视频在线 | 国产精品黄视频 | 国产剧情一区 | 黄网站在线观看 | 亚洲国产成人精品久久久国产成人一区 | 亚洲网址 | 伊人最新网址 | 亚洲欧洲精品一区 | 欧美日韩成人网 | 久久久久久久久国产 | 狠狠色综合网站久久久久久久 | 午夜精品久久久久久久久久久久 | 91伊人 | 韩日在线观看视频 | 国产成人精品久久二区二区 | 亚洲国产精品视频 | 99久久久久久 | 色久五月| 精品一区二区久久 | 国产亚洲成av人片在线观看桃 | 在线成人免费视频 | 99亚洲国产精品 | 久久最新精品 | 成人欧美一区二区三区在线播放 | 国产高清视频一区 | 亚洲成人午夜电影 | 国产乱码精品一区二区三区忘忧草 | 久久久久久久久久久久久9999 | 免费黄色片在线观看 | 免费一区二区 | 欧美日韩福利视频 | 精品视频在线播放 | 精品欧美一区二区三区久久久 | 欧美视频一区 | 亚洲精精品 | 欧洲一级黄 | 亚洲 中文 欧美 日韩 在线观看 |