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

QQ登錄

只需一步,快速開始

搜索
查看: 2968|回復(fù): 6
收起左側(cè)

小白求幫助 我試著用單片機(jī)和DS12C887和LCD1602做一個(gè)時(shí)鐘但是LCD沒有顯示,硬件圖.

[復(fù)制鏈接]
ID:149324 發(fā)表于 2016-11-21 23:49 | 顯示全部樓層 |閱讀模式
#include<reg52.h>          //頭文件  
#define uchar unsigned char   //數(shù)據(jù)格式宏定義
#define uint unsigned int     //數(shù)據(jù)格式宏定義   s
bit rs=P3^5;           //lcd寄存器選擇
sbit lcden=P3^4;        //lcd使能端
sbit s1=P3^0;           //開關(guān)s1
sbit s2=P3^1;           //開關(guān)s2
sbit s3=P3^2;           //開關(guān)s3
sbit beep=P1^2;         //蜂鳴器  
sbit dscs=P1^4;         //ds12c887片選  
sbit dsas=P1^5;         // ds12c887地址選通輸入腳
sbit dsrw=P1^6;         // ds12c887讀/寫輸入端  
sbit dsds=P1^7;         // ds12c887數(shù)據(jù)選擇或讀輸入腳
sbit dsirq=P3^3;         // ds12c887中斷請(qǐng)求輸入  
uchar count,s1num,flag,flag1;                          //狀態(tài)變量 char miao,shi,fen,nian,yue,ri,xingqi,amiao,afen,ashi;        //數(shù)據(jù)變量  
uchar code table[]=" 20  -  -";                         //年月日顯示格式
uchar code table1[]="      :  :  ";                     //時(shí)間顯示格式  
uchar code table2[]="MONTHUWENTHRFRISTASUN";    //星期表,每3位為一個(gè)
uchar code table3[]="   ALARM   ON   ";             //開鬧鐘提示
uchar code table4[]="   ALARM   OFF  ";             //關(guān)鬧鐘提示  
uchar code table5[]="SET ALARM PUSH  ";             //鬧鐘狀態(tài)選擇提示
void write_ds(uchar,uchar);                             //函數(shù)聲明
void set_alarm(uchar,uchar,uchar); uchar read_ds(uchar);   
void delay(uint z)       //延時(shí)子函數(shù)
{
uint x,y;  for(x=z;x>0;x--)   
for(y=110;y>0;y--);
}   
void beezzer()         //蜂鳴器發(fā)聲控制函數(shù)(鬧鐘響鈴),beep=0發(fā)聲
{  
  beep=0;  
  delay(50);  
  beep=1;  
  delay(100);  
  beep=0;
  delay(50);  
  beep=1;
}  
void write_com(uchar com) //向lcd寫入控制字com,根據(jù)lcd1602時(shí)序圖進(jìn)行操作,rs為寄存器選擇
{  
  rs=0;  
  lcden=0;  
  P0=com;  
  delay(5);  
  lcden=1;  
  delay(5);  
  lcden=0;  
}   
void write_date(uchar date)    //向lcd寫入數(shù)據(jù)date,根據(jù)lcd1602時(shí)序圖進(jìn)行操作
{  
  rs=1;  
  lcden=0;  
  P0=date;  
  delay(5);  
  lcden=1;  
  delay(5);  
  lcden=0;  
}   
void init()                //初始化單片機(jī)
{  
  uchar num;  
    EA=1;               //開總中斷
    EX1=1;              //允許外部中斷1  
    IT1=1;               //低電平觸發(fā)
    beep=1;  
    flag1=0;  
    lcden=0;  
write_ds(0x0A,0x20);   //向ds12c887控制寄存器A發(fā)送初始化控制字,啟動(dòng)振蕩器  
write_ds(0x0B,0x06);   //向ds12c887控制寄存器B發(fā)送初始化控制字,設(shè)定工作模式bcd,24 小時(shí)制  read_ds(0x0c);         //讀芯片時(shí)間數(shù)據(jù)
write_com(0x38);  
write_com(0x0c);       //初始化lcd  
write_com(0x06);  
write_com(0x01);  
write_com(0x80);        //在第一行顯示數(shù)據(jù)  
for(num=0;num<15;num++)
{   
   write_date(table[num]);   
      delay(5);   
}  
write_com(0x80+0x40);       //在第二行顯示數(shù)據(jù)  
for(num=0;num<12;num++)   
{   
    write_date(table1[num]);   
        delay(5);   
  }  
}   
void write_sfm(uchar add,uchar date)   //向lcd寫入時(shí)分秒數(shù)據(jù)
{  
  uchar shi,ge;                  //shi:待發(fā)數(shù)據(jù)十位;ge:待發(fā)數(shù)據(jù)個(gè)位  
  shi=date/10;  
  ge=date%10;  
  write_com(0x80+0x40+add);  
  write_date(0x30+shi);  
  write_date(0x30+ge);
}   
void write_nyr(uchar add,uchar date)    //向lcd寫入年月日數(shù)據(jù)
{
  uchar shi,ge;                  //shi:待發(fā)數(shù)據(jù)十位;ge:待發(fā)數(shù)據(jù)個(gè)位  
  shi=date/10;  
  ge=date%10;  
  write_com(0x80+add);
  write_date(0x30+shi);  
  write_date(0x30+ge);
}   
void write_xingqi(uchar add,uchar date)      //向lcd寫入星期數(shù)據(jù)
{
  write_com(0x80+add);  
  date=(date-1)*3;          //如星期一讀表123個(gè)字母MON顯示,星期二讀456字母THU等等    write_date(table2[date]);
  write_date(table2[++date]);  
  write_date(table2[++date]);
}   
void keyscan()                         //鍵盤掃描子程序
{
if(flag1==1)
{   
if(s2==0)                 //“加”鍵   
{   
delay(5);   
if(s2==0)   
{     
while(!s2);     
flag1=0;   
}  
}   
if(s3==0)                 //“減”鍵  
{   
  delay(5);  
  if(s3==0)  
  {   
  while(!s3);     
  flag1=0;   
    }         
   }
}  
if(s1==0)                    //功能選擇鍵,統(tǒng)計(jì)按下次數(shù)在s1num中  
{   
   delay(5);  
   if(s1==0)  
{   
   s1num++;   
   flag=1;   
   flag1=0;   
   while(!s1);   
   if(s1num==1)  
{     
    TR0=0;     
    write_com(0x80+0x40+11);   
    write_com(0x0f);  
    }  
}   
    if(s1num==2)                      //以下if語(yǔ)句是使光標(biāo)在對(duì)應(yīng)位置閃爍  
{   
       write_com(0x80+0x40+8);  
}   
if(s1num==3)  
{   
       write_com(0x80+0x40+5);
   }
       if(s1num==4)  
{   
       write_com(0x80+14);
  }   
       if(s1num==5)
  {   
       write_com(0x80+10);
   }   
       if(s1num==6)   
{   
       write_com(0x80+7);   
}   
       if(s1num==7)   
{   
       write_com(0x80+4);
  }   
       if(s1num==8)           //此判斷語(yǔ)句顯示table5表內(nèi)容,鬧鐘狀態(tài)顯示   
{   
    uchar n;   
     write_com(0x80);   
      for(n=0;n<15;n++)
    {     
write_date(table5[n]);   
   }   
write_com(0x80+14);   
}   
if(s1num==9)  
{   
    write_com(0x80+0x40+11);
  }   
    if(s1num==10)
  {   
    write_com(0x80+0x40+8);
  }   
    if(s1num==11)  
{   
    write_com(0x80+0x40+5);  
}   
    if(s1num==12)              //執(zhí)行時(shí)間寫入ds12c887芯片操作   
{   
    uchar num;   
    s1num=0;   
    write_com(0x0c);         //設(shè)置控制寄存器,狀態(tài)設(shè)置為寫   
    flag=0;      
    write_ds(0,miao);
    write_ds(2,fen);   
    write_ds(4,shi);   
    write_ds(6,xingqi);   
    write_ds(7,ri);   
    write_ds(8,yue);   
    write_ds(9,nian);   
    set_alarm(ashi,afen,amiao);   
    write_com(0x80);   
    for(num=0;num<15;num++)   
{   
       write_date(table[num]);   
       delay(5);   
}   
   write_com(0x80+0x40);   
   for(num=0;num<12;num++)   
{   
  write_date(table1[num]);   
delay(5);   
}   
}  
}   
if(s1num!=0)                         //根據(jù)s1num按下次數(shù)執(zhí)行相應(yīng)的數(shù)據(jù)設(shè)置
{  
        if(s2==0)                     //當(dāng)s2按下時(shí),如果
  {   
          delay(1);   
          if(s2==0)   
{     
while(!s2);   
   if(s1num==1)             //按s1按鍵1次改秒     
{      
      miao++;      
      if(miao==60)      
      miao=0;     
      write_sfm(10,miao);     
      write_com(0x80+0x40+11);   
  }   
      if(s1num==2)            //按s1按鍵2次改分     
{      
      fen++;      
      if(fen==60)      
      fen=0;      
      write_sfm(7,fen);     
      write_com(0x80+0x40+8);     
}
          if(s1num==3)           //按s1按鍵3次改時(shí)     
{      
           shi++;      
           if(shi==24)      
           shi=0;      
           write_sfm(4,shi);      
           write_com(0x80+0x40+5);   
}      
          if(s1num==4)           //按s1按鍵4次改星期     
{      
              xingqi++;     
              if(xingqi==8)      
              xingqi=1;     
              write_xingqi(12,xingqi);     
              write_com(0x80+14);     
}     
          if(s1num==5)            //按s1按鍵5次改日期  
   {     
              ri++;      
              if(ri==32)      
              ri=1;      
              write_nyr(9,ri);     
              write_com(0x80+10);  
   }     
          if(s1num==6)              //按s1按鍵6次改月   
  {  
              yue++;   
              if(yue==13)   
              yue=1;   
              write_nyr(6,yue);   
              write_com(0x80+7);   
}   
           if(s1num==7)              //按s1按鍵7次改年   
  {   
              nian++;   
              if(nian==100)  
              nian=0;   
              write_nyr(3,nian);  
              write_com(0x80+4);  
   }   
           if(s1num==8)            //按s1按鍵8次改鬧鐘狀態(tài)開還是關(guān)  
   {   
              uchar n;     
              write_ds(0x0B,0x26);    //向B控制寄存器寫入控制字         
              write_com(0x80);
              for(n=0;n<15;n++)      
{      
              write_date(table3[n]);      
}      
           write_com(0x80+14);   
}      
           if(s1num==9)          //按s1按鍵9次改鬧鐘時(shí)間秒     
{      
              amiao++;     
              if(amiao==60)      
              amiao=0;     
              write_sfm(10,amiao);     
              write_com(0x80+0x40+11);   
   }     
           if(s1num==10)           //按s1按鍵10次改鬧鐘時(shí)間分     
{   
              afen++;      
              if(afen==60)      
              afen=0;      
              write_sfm(7,afen);     
              write_com(0x80+0x40+8);
    }     
            if(s1num==11)           //按s1按鍵11次改鬧鐘時(shí)間時(shí)   
{     
               ashi++;     
               if(ashi==24)   
               ashi=0;     
               write_sfm(4,ashi);     
               write_com(0x80+0x40+5);   
       }  
     }
   }      
      if(s3==0)  
  {  
        delay(1);
        if(s3==0)                 //當(dāng)s3按下時(shí),如果:   
{   
while(!s3);   
if(s1num==1)         //按s1按鍵1次改秒   
{   
   miao--;     
   if(miao==-1)      
   miao=59;      
   write_sfm(10,miao);         
   write_com(0x80+0x40+11);
}     
if(s1num==2)             //按s1按鍵2次改分     
{   
   fen--;   
   if(fen==-1)     
   fen=59;   
   write_sfm(7,fen);   
   write_com(0x80+0x40+8);   
  }   
  if(s1num==3)              //按s1按鍵3次改時(shí)   
{   
   shi--;     
   if(shi==-1)   
   shi=23;   
   write_sfm(4,shi);  
   write_com(0x80+0x40+5);
    }   
  if(s1num==4)              //按s1按鍵4次改星期   
{   
   xingqi--;     
   if(xingqi==0)      
   xingqi=7;   
   write_xingqi(12,xingqi);     
   write_com(0x80+14);   
}     
if(s1num==5)             //按s1按鍵5次改日期   
  {   
    ri--;     
    if(ri==0)      
    ri=31;     
    write_nyr(9,ri);   
    write_com(0x80+10);
       }   
   if(s1num==6)              //按s1按鍵6次改月   
  {   
   yue--;     
   if(yue==0)   
   yue=12;   
   write_nyr(6,yue);  
   write_com(0x80+7);  
   }   
  if(s1num==7)             //按s1按鍵7次改年   
  {   
   nian--;      
   if(nian==-1)
   nian=99;     
   write_nyr(3,nian);   
   write_com(0x80+4);  
   }   
  if(s1num==8)            //按s1按鍵8次改鬧鐘狀態(tài)   
{  
    uchar n;     
    write_ds(0x0B,0x06);      
    write_com(0x80);      
    for(n=0;n<15;n++)      
{        
write_date(table4[n]);     
   }   
    write_com(0x80+14);
    }  
   if(s1num==9)             //按s1按鍵9次改鬧鐘秒     
{     
     amiao--;     
     if(amiao==-1)   
     amiao=59;   
     write_sfm(10,amiao);
     write_com(0x80+0x40+11);   
  }  
   if(s1num==10)             //按s1按鍵10次改鬧鐘分  
   {   
    afen--;   
    if(afen==-1)      
    afen=59;  
    write_sfm(7,afen);  
    write_com(0x80+0x40+8);   
}   
  if(s1num==11)            //按s1按鍵11次改鬧鐘時(shí)   
  {   
     ashi--;     
     if(ashi==-1)   
     ashi=23;     
     write_sfm(4,ashi);
     write_com(0x80+0x40+5);   
}
    }
   }
}
}   
void write_ds(uchar add,uchar date)     //向DS12c887寫入數(shù)據(jù)子函數(shù)
{
dscs=0;
dsas=1;  
dsds=1;
dsrw=1;
P2=add;
dsas=0;
dsrw=0;
P2=date;
dsrw=1;
dsas=1;  
dscs=1;   
  }   
uchar read_ds(uchar add)           //讀DS12C887芯片數(shù)據(jù),add為寄存器地址,詳見表格
{  
  uchar ds_date;  
dsas=1;  
dsds=1;  
dsrw=1;
dscs=0;
P2=add;
dsas=0;
dsds=0;
P2=0xff;
ds_date=P2;  
dsds=1;
dsas=1;  
dscs=1;
return ds_date;
}   
void set_alarm(uchar ashi,uchar afen,uchar amiao)   //向ds12c887寫入設(shè)置鬧鐘定時(shí)時(shí)間子函數(shù) {  
write_ds(1,amiao);  
write_ds(3,afen);  
write_ds(5,ashi);
}  
void main()                            //主函數(shù)
{  
init();                             //初始化函數(shù)  
while(1)
  {  
    keyscan();
    if(flag1==1)
    beezzer();   
    if(flag==0)  
{
    amiao=read_ds(0);   
    afen=read_ds(2);   
    ashi=read_ds(4);   
    miao=read_ds(0);     
    fen=read_ds(2);   
    shi=read_ds(4);   
    xingqi=read_ds(6);   
    ri=read_ds(7);   
    yue=read_ds(8);   
    nian=read_ds(9);   
    write_sfm(10,miao);   
    write_sfm(7,fen);         
    write_sfm(4,shi);   
    write_xingqi(12,xingqi);      
    write_nyr(9,ri);   
    write_nyr(6,yue);   
    write_nyr(3,nian);  
}
}
}   
void exter() interrupt 2                //外部中斷1響應(yīng)處理函數(shù)(改變flag值使蜂鳴器發(fā)聲)
{
  uchar c;  
  flag1=1;  
  c=read_ds(0x0c);
}


相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

ID:149324 發(fā)表于 2016-11-23 12:42 | 顯示全部樓層
xsynet 發(fā)表于 2016-11-23 10:43
先排查硬件問題,沒有的話,去掉時(shí)鐘電路,讓1602只顯示一個(gè)字符串,看是否好用,好用的話,就檢查時(shí)鐘部分 ...

謝謝。已經(jīng)解決了
回復(fù)

使用道具 舉報(bào)

ID:70330 發(fā)表于 2016-11-23 10:43 | 顯示全部樓層
先排查硬件問題,沒有的話,去掉時(shí)鐘電路,讓1602只顯示一個(gè)字符串,看是否好用,好用的話,就檢查時(shí)鐘部分的程序。軟件問題一般都是延時(shí)時(shí)序不對(duì)
回復(fù)

使用道具 舉報(bào)

ID:149513 發(fā)表于 2016-11-22 17:23 | 顯示全部樓層
放那么長(zhǎng)
回復(fù)

使用道具 舉報(bào)

ID:85726 發(fā)表于 2016-11-22 17:19 | 顯示全部樓層
其他的先不看,一個(gè)模塊一個(gè)模塊的去排查!首先是LCD1602的驅(qū)動(dòng)代碼有沒有問題,先不要讓其顯示從C887中讀取的數(shù)據(jù)!可以讓他顯示簡(jiǎn)單的東西,如數(shù)字!如沒問題,接著就是C887的驅(qū)動(dòng)了,多部分問題都是出在這里!特別是寫指令和寫數(shù)據(jù)函數(shù),時(shí)序一定要嚴(yán)格按照數(shù)據(jù)手冊(cè)上的來,(注意你自己寫的延時(shí)函數(shù)),寫指令和寫數(shù)據(jù)函數(shù)沒問題的話,接著就是讀取函數(shù)了,不要把寄存器的地址搞錯(cuò)了!當(dāng)然了,以上的這些都要基于硬件100%沒問題的基礎(chǔ)上進(jìn)行,如果硬件有問題,那一切免談!有問題先自己一步一步來排查,養(yǎng)成習(xí)慣,對(duì)你只有好處,沒有壞處!
回復(fù)

使用道具 舉報(bào)

ID:111634 發(fā)表于 2016-11-22 16:02 | 顯示全部樓層
!“大神”門,快來吧!
回復(fù)

使用道具 舉報(bào)

ID:111634 發(fā)表于 2016-11-22 11:06 | 顯示全部樓層
為什么沒人解答?如此冗長(zhǎng)又無注釋的程序,誰(shuí)有空或耐心看?叫人猜謎揣摩嗎???
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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