SOGO論壇
  登入   註冊   找回密碼
查看: 3528|回覆: 5

[問題求助] 想學一個使用C語言顯示碼錶功能的程式 [複製連結]

Rank: 2

狀態︰ 離線
發表於 2016-2-23 21:47:10 |顯示全部樓層
本帖最後由 NICEPLAY1 於 2016-2-24 22:37 編輯

我想學一個使用C語言顯示碼錶功能的程式
有小時.分鐘..秒鐘.毫秒 目前希望能夠讓他在23:59:59:99時停止
並且要利用紅外線感應來控制開始及暫停
使用的IC是8951   
七段顯示器的LED端接在P0.0~P0.7 掃描端接在P2
由兩個四合一七段組成
以下是我目前的程式   

#include<reg51.h >
code char tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7c,0x27,0x7f,0x67}; //0~9的字型碼
code char com[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
char time=0;   
char cnt,hour,min,sec,ms,index,disp[8];
  // 顯示副程式   
void display(void)                      
  { disp[0]=tab[hour10];  // 放小時鐘的拾位數
    disp[1]=tab[hour%10];   //放小時鐘的個位數
    disp[2]=tab[min10];   //放分鐘的拾位數
    disp[3]=tab[min%10];   //放分鐘的個位數
    disp[4]=tab[sec10];
    disp[5]=tab[sec%10];
    disp[6]=tab[ms10];
    disp[7]=tab[ms%10];  
}
  //T0 計時中斷的副程式
void timer0 (void) interrupt 1   
  { TH0=(65536-1000)256; // TH0存放商數
    TL0=(65536-1000)%256; // TL0存放餘數
    P2=0xff;                // 顯示器不亮
    P0=~disp[index];         //顯示的字型碼由P1輸出
    P2=~com[index];        //顯示器的掃描碼由P0輸出
    index++;if(index=8) index=0; //輪流掃描顯示器
  }
  //T1 計時中斷的副程式
void timer1 (void) interrupt 3
  { TH1=(65536-10000)256;        //   TH1存放商數
    TL1=(65536-10000)%256;        //   TL1存放餘數
    cnt++;                             //  計數變數(cnt)加 1  
    if(cnt=0.01)
        {cnt=0;ms++;}
        if(ms=99)
        { ms=0;sec++;}
        if(sec=59)
        { sec=0;min++;}
        if(min=59)
        { min=0;hour++;}
        if(hour=23)
                {hour=TR1;}
       
       
               
                                   
                display();         }   //      呼叫顯示副程式
   //主程式   
main( )         
  {        IE=0x8A;        // 開啟Timer 0,1 計時計數中斷
    TMOD=0x11; // T0,T1的工作模式為1(16 bits)
        TR0=TR1=1;        //  啟動Timer 0 ,Timer 1
        while(1){        
                        for(ms=0;ms=99;cnt++)
                       
                        display();        } }   // 呼叫顯示副程式

Rank: 2

狀態︰ 離線
發表於 2016-2-26 16:08:17 |顯示全部樓層
你的cnt的資料型態是什麼?
另外  if(cnt=0.01)這一行會對嗎?

Rank: 2

狀態︰ 離線
發表於 2016-2-26 20:05:02 |顯示全部樓層
mikekao 發表於 2016-2-26 16:08  
你的cnt的資料型態是什麼?
另外  if(cnt=0.01)這一行會對嗎?

cnt是 一個計數變數     我在模擬器上模擬是沒有問題的

Rank: 2

狀態︰ 離線
發表於 2016-2-27 21:31:36 |顯示全部樓層
NICEPLAY1 發表於 2016-2-26 20:05  
cnt是 一個計數變數     我在模擬器上模擬是沒有問題的

if(cnt=0.01)
通常在判斷是否相等是用"==",你的用法是指定喔。

Rank: 2

狀態︰ 離線
發表於 2016-2-27 23:16:55 |顯示全部樓層
mikekao 發表於 2016-2-27 21:31  
if(cnt=0.01)
通常在判斷是否相等是用"==",你的用法是指定喔。

好的 謝謝你
目前正常的功能已經沒問題了
但是現在想知道
想要他在23:59:59:99時停止的話該如何編寫
另外  for(ms=0;ms=99;cnt++)  這個迴圈在這個程式上似乎沒有起到作用
把他刪掉了  還是能正常動做 是為甚麼呢

狀態︰ 離線
發表於 2016-12-11 20:35:34 |顯示全部樓層
你的點燈是由void timer0 (void) interrupt 1 控制的唷

void timer1 (void) interrupt 3 //此function最後一行有呼叫到display(); ,
在細心看一下timer1、timer0這function和你所宣告的array有甚麼關聯性

給您幾個建議:
1.建議您把中斷的概念弄熟會比較好debug,善用單步執行(可能要有類似JTAG的工具才有辦法做Debug)

2.code 排列整齊也很重要,會更容易讓人家了解你的code、更好閱讀

加油~

請注意︰利用多帳號發表自問自答的業配文置入性行銷廣告者,將直接禁訪或刪除帳號及全部文章!
您需要登錄後才可以回覆 登入 | 註冊


本論壇為非營利自由討論平台,所有個人言論不代表本站立場。文章內容如有涉及侵權,請通知管理人員,將立即刪除相關文章資料。侵權申訴或移除要求:abuse@oursogo.com

GMT+8, 2024-4-18 16:56

© 2004-2024 SOGO論壇 OURSOGO.COM
回頂部