找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 2879|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

用1602單片機(jī)設(shè)計(jì)的可調(diào)電子鐘顯示不正確

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:250133 發(fā)表于 2017-11-19 16:17 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit rs=P2^0; //定義液晶顯示器控制端口
sbit rw=P2^1;
sbit en=P2^2;
sbit s1=P1^0; //定義按鍵控制
sbit s2=P1^1;
sbit s3=P1^2;
sbit s4=P1^3;
uchar shi,fen,miao,ri,yue,nin;
uchar code table[]={"      clock"};
uchar code table1[]={"    00:00:57"};
uchar num,num1,count;
uint i,sh,ge,s,g;
void delay(uchar time)   //延時(shí)
{
   uint j;
   for(;time>0;time--)
   for(j=0;j<125;j++);
  }

void write_com(uchar com)    //寫指令函數(shù)
{
  en=0;
  rs=0;
  delay(5);
  P0=com;
  delay(5);
   en=1;
  delay(5);
  en=0;
}
void write_data(uchar dat)   //寫數(shù)據(jù)函數(shù)
{
   en=0;
  rs=1;
  delay(5);
   P0=dat;
  delay(5);
   en=1;
  delay(5);
  en=0;
}
void init()   //初始化
{
     en=0;
     rw=0;
    write_com(0x38);//設(shè)置16X2顯示,5X7點(diǎn)陣,8位數(shù)據(jù)接口
    write_com(0x0c);//設(shè)置開顯示,不顯示光標(biāo)
    write_com(0x06);//寫一個(gè)字符后地址指針加1
    write_com(0x01);//顯示清零,數(shù)據(jù)指針清零

for(i=0;i<(sizeof(table)-1);i++)   //第一行寫
{
    write_com(0x80+i);
    write_data(table[i]);
}


for(i=0;i<(sizeof(table1)-1);i++) //第二行寫
{
       write_com(0x80+0x40+i);
    write_data(table1[i]);
}
miao=56;
fen=59;
shi=23;
TMOD=0x01;    //time0作為定時(shí)器工作在模式1下
TH0=(65536-50000)/256;
TL0=(65536-50000)%6;
EA=1;  //開啟總中斷
ET0=1;   //開啟time0中斷
TR0=1;   //啟動(dòng)time0
}
void write_sfm(uchar add,uchar num)  //時(shí)分秒函數(shù)
{
    sh=num/10;   //分離出十位
    ge=num;    //分離出個(gè)位
   write_com(0x80+0x40+add); //第二行數(shù)據(jù)指針位置調(diào)整
   write_data(0x30+sh);   //更改顯示數(shù)據(jù)的十位
   write_data(0x30+ge);  //更改顯示數(shù)據(jù)的個(gè)位
}

void timer0() interrupt 1 //time0中斷
{
   TH0=(65536-50000)/256;  //重裝初始值
   TL0=(65536-50000)%6;
   count++;   
if(count==20)  //20次到則滿一秒
  {
     count=0;
     miao++;
   if(miao==60)
    {
        miao=0;
        fen++;
      if(fen==60)
         {
             fen=0;
              shi++;
     if(shi==24)
                {
             shi=0;     
        }
          write_sfm(4,shi);      
          }
     write_sfm(7,fen);
     }   
   write_sfm(10,miao);
  }
}
void keyscan()    //鍵盤掃描
{  if(s1==0) //按下S1      
    {
      delay(5);
     if(s1==0)
       {
             num1++;   
         while(!s1);//等待釋放         
            if(num1==1)
              {
                  TR0=0;
          write_com(0x0e);  //顯示光標(biāo),不閃爍
      write_com(0x80+0x40+0x0b);  //數(shù)據(jù)指針移動(dòng)到秒的個(gè)位處
             write_com(0x0f);//顯示光標(biāo),閃爍
                }
                if(num1==2)
                  {
          write_com(0x80+0x40+0x08);  //數(shù)據(jù)指針移到到分鐘的個(gè)位處
                   }
                            if(num1==3)
                              {        
                 write_com(0x80+0x40+0x05);  //數(shù)據(jù)指針移到到小時(shí)的個(gè)位處
                               }
                                    if(num1==4)
                                       {
                                         num1=0;    //清零
                                      write_com(0x0c);  //重新顯示
                                       TR0=1;   //重新啟動(dòng)計(jì)時(shí)   
                                        }
        }
    }

           if(num1!=0)   //按下S2則選擇時(shí)/分/秒加1
          {
             if(s2==0)
              {
                delay(5);
                 if(s2==0)
                  {
                    while(!s2);

               if(num1==1)   
                      {
                  delay(20);
                         miao++;
                       if(miao==60)  
                      miao=0;
                       write_sfm(10,miao);            
        write_com(0x80+0x40+0x0a);
                       }
                           if(num1==2)
                            {
                              fen++;
                             if(fen==60)
                             fen=0;
                          write_sfm(7,fen);            
                     write_com(0x80+0x40+0x07);
                               }
                                  if(num1==3)
                                    {
                                     shi++;
                                    if(shi==24)
                                     shi=0;
                                  write_sfm(4,shi);                       
                         write_com(0x80+0x40+0x04);
                                       }
                    }
              }
          }

     if(num1!=0)
               if(s3==0) //按下S3則選擇時(shí)/分/秒 減1
               {
                  delay(5);
                  if(s3==0)
                  {
                  while(!s3);
                     if(num1==1)
                      {
                     delay(20);
                      miao--;
                         if(miao==-1)
                       miao=59;
              write_sfm(10,miao);      
             write_com(0x80+0x40+0x0a);
                       }
                         if(num1==2)
                          {
                               fen--;
                             if(fen==-1)
                           fen=59;
               write_sfm(7,fen);   
               write_com(0x80+0x40+0x07);
                           }
                              if(num1==3)
                               {
                                shi--;
                                if(shi==-1)
                                shi=23;
                             write_sfm(4,shi);         
               write_com(0x80+0x40+0x04);
                               }
                  }
               }

                              if(num1!=0)
            if(s4==0)   //確定按鍵
             {
                                     delay(5);
                                       if(s4==0)
                                         {
                                         while(!s4);
            num1=0;    //清零
                                           write_com(0x0c);  //重新顯示
                                            TR0=1;   //重新啟動(dòng)計(jì)時(shí)   
            }
          }

}
void main()
{
    init();
     while(1)
     {
       keyscan();
     }
}

捕獲.PNG (88.34 KB, 下載次數(shù): 39)

捕獲.PNG
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:111634 發(fā)表于 2017-11-19 19:19 | 只看該作者
本帖最后由 zl2168 于 2017-11-19 19:20 編輯

給你介紹一個(gè)正確有效的案例,自己對(duì)照查錯(cuò)吧!
實(shí)例91  具有校正功能的時(shí)鐘1302LCD1602顯示)

先Proteus仿真,確認(rèn)有效。 實(shí)例91 帶校正時(shí)鐘1302(LCD1602顯示).rar (52.68 KB, 下載次數(shù): 6)
以上摘自張志良編著《80C51單片機(jī)仿真設(shè)計(jì)實(shí)例教程——基于Keil CProteus》清華大學(xué)出版社ISBN 978-7-302-41682-1,書中電路和程序設(shè)計(jì)有詳細(xì)說(shuō)明,程序語(yǔ)句條條有注解。仿真電路和Hex文件能在清華出版社網(wǎng)站免費(fèi)下載,程序源代碼只能到書上看了。到圖書館借,或到新華書店翻閱,或到網(wǎng)上書店打折購(gòu)買。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表