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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

求動態顯示數字鐘

[復制鏈接]
跳轉到指定樓層
樓主
ID:250369 發表于 2017-11-17 12:06 來自手機 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
使用2個四位共陰數碼管做顯示部分。-
上電的時候,L1發光二極管以1S閃爍。
可調時功能,有到點報時、鬧鈴功能。
最小系統:stc89c52rc,12M晶振,2*30P電容,10K電阻,10U電容;
外圍芯片:輕觸按鍵*5,4位共陰數碼管*2,三極管8550*1,蜂鳴器*1,排阻4K7*3,插針接口若干,LED*1,74HC573*1。
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:229016 發表于 2017-11-19 20:11 | 只看該作者
描述:LCD萬年歷,TX-1C實驗板 STC89C52RC,晶振11.0592MHz (如果晶振12MHz時間更準些) ********************************/ #include<reg52.h> #include<intrins.h> #define uchar unsigned char #define uint unsigned int sbit LCD_EN=P3^4;                                 //定義1602液晶LCDEN端,使能信號 sbit LCD_RS=P3^5;                                 //定義1602液晶RS端,數據/命令選擇端(H/L) //sbit LCD_RW=P3^6;                         //定義1602液晶RW端,讀/寫選擇端(H/L)已接地禁止讀 sbit BUZZ=P2^3;                                 //定義蜂鳴器端,按鍵釋放和整點響 sbit dula=P2^6;                                        //段端口 sbit wela=P2^7;                                        //位端口 sbit key_1=P3^0;                                //進入調試方式 sbit key_2=P3^1;                                //調試+ sbit key_3=P3^2;                                //調試- sbit key_4=P3^3;                                //退出調試方式 sbit MND_1=P3^7;                                //矩陣鍵盤模擬地 uchar code keycode[] = {0x11,0x12,0x14,0x18,0x21,0x22,0x24,0x28,//按鍵鍵值                         0x41,0x42,0x44,0x48,0x81,0x82,0x84,0x88}; uchar yue,ri,shi,fen,miao,week,nian;         //月、日、時、分、秒、周、年變量 uchar flag=0;        //功能鍵計數變量 uint count=0;        //中斷計數變量 bit Cnt1s=0;        //秒標志 uchar code table[7][3]={"MON","TUE","WED","THU","FRI","SAT","SUN"};//顯示周 /***********毫秒級延時函數**********/ void delay(uint x)  {         uint y,z;         for(y=x;y>0;y--)                 for(z=110;z>0;z--);  } /***********蜂鳴器發聲函數**********/ void di(uint dd)  {         BUZZ=0;         delay(dd);         BUZZ=1; } /***********LCD1602忙等待**********/  /* uchar busycheck() {         uchar s;                        //臨時變量         LCD_RS=0;                //允許寫指令 //        LCD_RW=1;                //允許讀數據(讀寫端已接地,禁止讀)         LCD_EN=1;                //高電平使能讀數據         delay(1);                //延時         s=P0;                                //讀P0數據賦值s         LCD_EN=0;                //低跳變執行         return s;                //返回s值 s=0x80有效 } */ /***********液晶寫指令函數**********/ void write_com(uchar com)  { //        while((busycheck()&0x80)==0x80);//忙等待         LCD_RS=0;        //允許寫指令 //        LCD_RW=0;        //讀寫端已接地,禁止讀         LCD_EN=0;        //初始設置LCD_EN低電平         P0=com;                //傳遞指令         delay(5);        //延時         LCD_EN=1;        //使能寫入         delay(5);        //延時         LCD_EN=0;        //低跳變執行 } /***********液晶寫數據函數**********/ void write_date(uchar date)  { //        while((busycheck()&0x80)==0x80);//忙等待         LCD_RS=1;        //允許寫數據 //        LCD_RW=0;        //讀寫端已接地,禁止讀          LCD_EN=0;        //初始設置LCD_EN低電平         P0 =date;        //傳遞數據         delay(5);        //延時         LCD_EN=1;        //使能寫入         delay(5);        //延時         LCD_EN=0;        //低跳變執行 } /***********寫年函數**********/ void write_nian(uchar add,uchar date)reentrant  //reentrant定義為可重入函數,允許被遞歸調用 {         uint bai,shi,ge;                //定義百、十、個變量         bai=date/100;                        //分解百         shi=date%100/10;                //分解十         ge=date%100%10;                //分解個         write_com(0x80+add); //寫指令、設置顯示位置         write_date(0x30+bai);//寫數據百位0~9對應的字符碼是0x30~0x39         write_date(0x30+shi);//寫數據十位         write_date(0x30+ge); //寫數據個位         /*write_date(dat[bai]);         write_date(dat[shi]);         write_date(dat[ge]);*/ } /***********大小月份設置**********/ uchar dxy(uchar r)  {         uchar k;         switch(r)         {                 case 1:                         k=31;                 break;                  case 2: //閏年29天, 平年28天                 if((2000+nian)%100==0)                         if((2000+nian)%400==0)                                 k=29;                         else                                 k=28;                         else if((2000+nian)%4==0)                                 k=29;                         else                                 k=28;                  break;                  case  3:k=31;break;                 case  4:k=30;break;                 case  5:k=31;break;                 case  6:k=30;break;                 case  7:k=31;break;                 case  8:k=31;break;                 case  9:k=30;break;                 case 10:k=31;break;                 case 11:k=30;break;                 case 12:k=31;break;         }         return k; } /***********寫月、日、時、分、秒函數**********/ void write_yrsfm(uchar add,uchar date)  {         uchar shi,ge;         shi=date/10;         ge=date%10;         write_com(0x80+add); //設置顯示位置         write_date(0x30+shi);         write_date(0x30+ge);          /*write_date(dat[shi]);         write_date(dat[ge]);*/ } /***********寫星期函數**********/ void write_week(uchar add,uchar date)  {         uchar i;         write_com(0x80+add); //設置顯示位置         for(i=0;i<3;i++)         {                 write_date(table[date][i]);                 delay(5);         } } /***********初始化函數**********/ void init()  {          count=0;                         //         dula=0;                                //關閉數碼管段端口         wela=0;                                //關閉數碼管位端口 //        P0=0xff;                         //關閉發光二極管         write_com(0x38); //設置16*2顯示,5*7點陣,8位數據接口         write_com(0x0c); //設置開顯示,不顯示光標         write_com(0x06); //寫一個字符后地址指針加1         write_com(0x01); //顯示清零,數據指針清零         write_com(0x80); //設置顯示初始位置         write_com(0x80+1); //寫出年份的最高位“2”         write_date('2');         //寫數據'2'         write_com(0x80+5); //寫指令,顯示位置 日期顯示部分的的兩'-'         write_date('-');         //寫數據'-'         write_com(0x80+8); //寫指令,顯示位置 日期顯示部分的的兩'-'         write_date('-');          //寫數據'-'         write_com(0x80+0x40+6); //寫指令,時間顯示部分的的兩個“:”         write_date(':');                //寫數據':'         write_com(0x80+0x40+9); //寫指令,時間顯示部分的的兩個“:”         write_date(':');                                //寫數據':'         miao=0;                                                        //秒         fen=0;                                                        //分         shi=0;                                                        //時         week=5;                                                //星期         ri=20;                                      //日         yue=5;                                      //月         nian=17;                                              //年         write_yrsfm(0x40+10,miao);        //寫入秒         write_yrsfm(0x40+7,fen);        //寫入分         write_yrsfm(0x40+4,shi);        //寫入時         write_week(12,week);                   //寫入星期         write_yrsfm(9,ri);                        //寫入日         write_yrsfm(6,yue);                        //寫入月         write_nian(2,nian);                        //寫入年 } /***********按鍵掃描函數**********/ void keyscan()  {         if(key_1==0) //功能鍵按下         {                  delay(10); //消抖                 if(key_1==0)//功能鍵確認按下                 {                         flag++; //記錄功能鍵按下次數                         while(!key_1); //確認釋放功能鍵                         di(100); //每當有按鍵釋放蜂鳴器發出滴聲提醒                         if((flag==1)||(flag==8)) //第一次按下功能鍵光標閃爍到秒位置                         {                                 TR0=0; //關閉定時器                                 write_com(0x80+0x40+11); //光標定位到秒位置                                 write_com(0x0f); //光標開始閃爍                         }                          if(flag==2) //第二次按下功能鍵光標閃爍到分鐘位置                         {                                 write_com(0x80+0x40+8);                         }                         if(flag==3) //第三次按下功能鍵光標閃爍到時位置                         {                                 write_com(0x80+0x40+5);                         }                         if(flag==4) //第四次按下功能鍵光標閃爍到星期位置                         {                                 write_com(0x80+12);                         }                         if(flag==5) //第五次按下功能鍵光標閃爍到日位置                         {                                 write_com(0x80+10);                         }                         if(flag==6) //第六次按下功能鍵光標閃爍到月位置                         {                                 write_com(0x80+7);                         }                         if(flag==7) //第七次按下功能鍵光標閃爍到年位置                         {                                 write_com(0x80+4);                         }                         if(flag==8) //第八次按下功能鍵退出功能鍵                                 flag=1; //記錄變成1;光標重新回到秒位置                 }         }         if(key_4==0) //退出調節         {                 delay(10);                 if(key_4==0)                 {                         while(!key_4); //釋放按鍵                         if(TR0==0)                         di(100); //只在調節時有按鍵釋放蜂鳴器發出滴聲                         flag=0; //功能鍵按鍵次數清零                         write_com(0x0c); //取消光標閃爍                         count=0;                         Cnt1s=0;                         TR0=1; //啟動定時器                 }          }         if(flag!=0) //功能鍵按下后flag=1         {  //增大鍵                 if(key_2==0) //只有功能鍵按下后,增大和減少鍵才有效                 {                         delay(10);                         if(key_2==0)//確認增加按下                         {                                 while(!key_2); //釋放按鍵                                 di(100); //每當有按鍵釋放蜂鳴器發出滴聲提醒                                 if(flag==1) //功能鍵第一次按下調節秒                                 {                                         miao++; //秒加1                                         if(miao>59)                                                  miao=0;                                         write_yrsfm(0x40+10,miao); //每調節一次送液晶顯示一下                                         write_com(0x80+0x40+11); //顯示位置重新回到調節處                                 }                                 if(flag==2) //功能鍵第二次按下調節分                                 {                                         fen++;                                          if(fen>59)                                                  fen=0;                                         write_yrsfm(0x40+7,fen);                                          write_com(0x80+0x40+8);                                 }                                 if(flag==3) //功能鍵第三次按下調節時                                 {                                         shi++;                                          if(shi>23)                                                  shi=0;                                         write_yrsfm(0x40+4,shi);                                          write_com(0x80+0x40+5);                                  }                                 if(flag==4)    //功能鍵第四次按下調節星期                                 {                                         week++;                                         if(week>6)                                                 week=0;                                         write_week(12,week);                                         write_com(0x80+12);                                 }                                 if(flag==5) //功能鍵第五次按下調節日                                 {                                         ri++;                                         if(ri>(dxy(yue)))                                                 ri=1;                                          write_yrsfm(9,ri);                                         write_com(0x80+10);                                 }                                 if(flag==6) //功能鍵第六次按下調節月份                                 {                                         yue++;                                         if(yue>12)                                                 yue=1;                                         write_yrsfm(6,yue);                                         write_com(0x80+7);                                 }                                 if(flag==7)          //功能鍵第七次按下調節年份                                 {                                          nian++;                                         write_nian(2,nian);                                         write_com(0x80+4);                                 }                         }                 }                 //減少鍵                 if(key_3==0) //減少鍵被按下                 {                         delay(10);                         if(key_3==0)//確認減少鍵被按下                         {                                 while(!key_3);//按鍵釋放                                 di(100); //每當有按鍵釋放蜂鳴器發出滴聲                                 if(flag==1) //功能鍵第一次按下調節秒                                 { //秒減1                                         miao--;                                         if((miao==(-1))||(miao>59)) //59到0循環遞減;                                                 miao=59;                                         write_yrsfm(0x40+10,miao); //每調節一次送液晶顯示一下                                         write_com(0x80+0x40+11); //顯示位置重新回到調節處                                 }                                 if(flag==2) //功能鍵第二次按下調節分                                 {                                         fen--;                                         if((fen==(-1))||(fen>59))                                                 fen=59;                                         write_yrsfm(0x40+7,fen);                                          write_com(0x80+0x40+8);                                  }                                 if(flag==3) //功能鍵第三次按下調節時                                 {                                         shi--;                                         if((shi==(-1))||(shi>23))                                                 shi=23;                                         write_yrsfm(0x40+4,shi);                                          write_com(0x80+0x40+5);                                  }                                 if(flag==4) //功能鍵第四次按下調節星期                                 {                                         week--;                                         if((week==(-1))||(week>6))                                                 week=6;                                         write_week(12,week);                                         write_com(0x80+12);                                 }                                 if(flag==5) //功能鍵第五次按下調節日                                 {                                         ri--;                                         if((ri==0)||ri>dxy(yue))                                                 ri=dxy(yue);                                         write_yrsfm(9,ri);                                         write_com(0x80+10);                                 }                                 if(flag==6) //功能鍵第六次按下調節月份                                 {                                         yue--;                                         if((yue==0)||(yue>12))                                                 yue=12;                                         write_yrsfm(6,yue);                                         write_com(0x80+7);                                 }                                 if(flag==7)         //功能鍵第七次按下調節年份                                 {                                          nian--;                                         write_nian(2,nian);                                         write_com(0x80+4);                                 }                         }                 }         } } void LCD_Refresh() {         if(flag==0)                //調整時停止刷新         {                 if((ri>dxy(yue))||(ri<1)) //大小月匹配                         ri=1;                 write_yrsfm(9,ri); //日若變化則重新寫入                 if(Cnt1s==1) //1秒時間到                 {                         Cnt1s=0; //清零                         miao++; //秒、分、時、星期、日、月、年自動調節功能運行                         if(miao==60)                         {                                 miao=0;                                 fen++;                                 if(fen==60)                            {                                    fen=0;                                    di(500); //整點提醒                                    shi++;                                          if(shi==24)                                         {                                                 shi=0;                                                 week++;                                                 ri++;                                                 if(week>6)                                                         week=0;                                                 write_week(12,week); //星期若變化則重新寫入                                                 if(ri>dxy(yue))                                                 {                                                         ri=1;                                                         yue++;                                                         if(yue==13)                                                         {                                                                 yue=1;                                                                 nian++;                                                                 write_nian(2,nian); //年份若變化則重新寫入                                                         }                                                         write_yrsfm(6,yue); //月份若變化則重新寫入                                                 }                                                 write_yrsfm(9,ri); //日若變化則重新寫入                                         }                                         write_yrsfm(0x40+4,shi); //時若變化則重新寫入                                 }                                 write_yrsfm(0x40+7,fen); //分若變化則重新寫入                         }                         write_yrsfm(0x40+10,miao); //秒若變化則重新寫入                 }         } } void Timer0Init()                                //100微秒@12.000MHz {         TMOD = 0x02;                                //設置定時器自動重載模式 //        TL0 = 0x9C;                                        //設置定時初值 //        TH0 = 0x9C;                                        //設置定時重載值         TL0=0xA4;                                         //定時器裝初值 100微秒@11.0592MHz         TH0=0xA4;                                         //定時器裝初值 100微秒@11.0592MHz         TF0 = 0;                                                //清除TF0標志         TR0 = 1;                                                //定時器0開始計時         EA=1;                                                 //開總中斷         ET0=1;                                                 //開定時器0中斷 } /***********主函數**********/ void main()  {         MND_1=0;                                                        //矩陣鍵盤模擬地         init();                                                                //初始化程序         Timer0Init();                                                //初始化定時器                                                 di(100);                                                                //開機蜂鳴器提示音         while(1)                                                         //不停地檢測按鍵是否被按下         {                 keyscan();                                                //按鍵掃描程序                 LCD_Refresh();                                        //液晶屏顯示刷新         } } /***********中斷函數**********/ void timer0() interrupt 1 {         count++;                                         //11.0592MHz誤差0.17%,12MHz誤差0         if(count>=10017)                        //1秒/11.0592MHz //        if(count>=10000)                        //1秒/12MHz         {                 count=0;                                        //清0                 Cnt1s=1;                                        //1秒標標志置1         } }
回復

使用道具 舉報

板凳
ID:229016 發表于 2017-11-19 20:11 | 只看該作者
具體參考這個,做適當修改就可以了
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产亚洲精品美女久久久久久久久久 | 超碰在线久| 午夜a√ | 中文字幕亚洲一区 | 本道综合精品 | 成人免费视频一区 | 卡通动漫第一页 | 国产成人免费在线 | 在线视频91| 亚洲精品永久免费 | h视频在线免费 | 欧美精品区 | 91精品国产综合久久婷婷香蕉 | 中文字幕在线免费观看 | 国产精品久久久久久久一区二区 | 欧美亚洲国产一区二区三区 | 特级丰满少妇一级aaaa爱毛片 | aaa大片免费观看 | 在线欧美亚洲 | 免费色网址 | 九色91视频 | 日韩a v在线免费观看 | 欧美成人自拍 | 蜜桃视频一区二区三区 | 精品国产一区二区三区久久久蜜月 | 毛片高清| 拍拍无遮挡人做人爱视频免费观看 | 精品国模一区二区三区欧美 | 久久久在线视频 | 国产精品视频97 | 国产精品视频久久久 | japanhdxxxx裸体 | 日本又色又爽又黄的大片 | 一级毛片网 | av在线电影网站 | 午夜精品视频在线观看 | 97中文视频 | 农村真人裸体丰满少妇毛片 | 性一交一乱一透一a级 | 羞羞涩涩在线观看 | 亚州毛片 |