按鍵計數器,如何分別控制兩個以上的計數值 |
答題得分者是:bernie_w39
|
chjojon
一般會員 發表:7 回覆:26 積分:16 註冊:2006-07-09 發送簡訊給我 |
之前發的問題我已經弄出來了
程式碼如下 [code cpp] /* 使用SDCC編譯,語Keil C的用法不大一樣 */ #include <8051.h> #include <51port.h> sbit at P1_0 wled; sbit at P1_4 k1; sbit at P1_6 k2; sbit at P1_7 k4; char DATA_7SEG[10]={0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};/*7段顯示數字*/ char act[2]={0xfe, 0xfd}; /* p2.0--p2.1 */ /*----------延遲------------------------*/ delay(int d) { int x, y; for(x=0; x } /*----------掃描-------------------------*/ BCD1(char x1,char c1) { P2=0xff; P0=DATA_7SEG[c1]; P2=act[x1]; delay(3); } /*-----------轉換------------------------*/ BCD4(int c3) { int c4,m; for(m=0;m<2;m ) { c4=c3; c3/=10; BCD1(m,c4); } } /*--------------------------------------*/ main() { int i,count=0; while(1) { if(k4==0) count=0; /*歸0*/ for(i=0;i<10;i ) BCD4(count); while (k2==0) /*減1*/ { for(i=0;i<10;i ) BCD4(count); if(k2==1) { if(count>0) /*數值低於0就不向下減*/ count--; } } while (k1==0) /*加1*/ { for(i=0;i<10;i ) BCD4(count); if(k1==1) { if(count<99) /*不讓數字超過兩位數顯示器*/ count ; } } } } /*-----------------------------------*/ [/code] 不過這只能控制以及顯示單一個計數值而已 我一直在想如何分別控制兩個或以上的計數器 也就是 分成好幾個計數器(每個計數器都有兩個按鍵及一組LED顯示),然後每個計數器都是單一個體,不會受到其他計數器的影響 我想過利用好幾個變數去組成... 但是這樣會讓整個程式變得很龐大,不好撰寫... 不知道有沒有辦法能讓他的程式體積變小、然後易讀呢? (自己有個異想天開的想法...分兩個MPU...不過這更複雜吧...) P.S.使用89S52,容量8K應該是夠...但是一次要控制10幾個以上,用一堆變數的話...可能到最後連自己都看不懂吧... |
bernie_w39
資深會員 發表:3 回覆:199 積分:280 註冊:2007-10-07 發送簡訊給我 |
|
chjojon
一般會員 發表:7 回覆:26 積分:16 註冊:2006-07-09 發送簡訊給我 |
對8051還不是說很熟
對陣列也不是很熟... 可否寫一小段示範讓我參考看看呢? 因為看書都看不大懂... ===================引 用 bernie_w39 文 章=================== 可以用 array 吧, 例如: int count[10]; 就可以記錄 10 個計數器的值了, 不是嗎? |
bernie_w39
資深會員 發表:3 回覆:199 積分:280 註冊:2007-10-07 發送簡訊給我 |
|
chjojon
一般會員 發表:7 回覆:26 積分:16 註冊:2006-07-09 發送簡訊給我 |
它是會的!
謝謝你的回覆~ 我再試試看怎麼去用好了 其實,這是參考其他人寫的程式改出來的(它的也只能往上加>"<) 對了,您覺得還要怎麼改會比較好呢? ===================引 用 bernie_w39 文 章=================== 剛才花了一點時間看了一下, 你的程式寫的好怪. 照說 LED 的輸出掃描是 一部份, 按鍵輸入改計數器又是另一部份, 為什麼你把兩部份的程式都糾結 在一起了? 這樣你連續按 K1, 或 K2 時, 計數器會連續增加或減少嗎? |
bernie_w39
資深會員 發表:3 回覆:199 積分:280 註冊:2007-10-07 發送簡訊給我 |
第一步是先把程式分離開來, 你可以先試試用時間中斷,
把計時器調到約每秒產生 100 次中斷. 然後在中斷程式中, 輪流掃描你的兩位數七段顯示器. 這個中斷程式由一組全域變數中 digit[0], digit[1] 去讀取 要顯示的值. 然後主程式的迴圈中判斷 key 是否被 "觸動", 僅抓取由 0 轉 1 的過程, 然後依按鈕的不同去設定 count 為 0 或減 1 加 1. count 有修改後, 再用 hex 轉 bcd 的方式, 將 count 的值轉到全域變數 digit[0], digit[1] 中 |
chjojon
一般會員 發表:7 回覆:26 積分:16 註冊:2006-07-09 發送簡訊給我 |
恩
謝謝你的建議 我再來去做測試 謝謝! ===================引 用 bernie_w39 文 章=================== 第一步是先把程式分離開來, 你可以先試試用時間中斷, 把計時器調到約每秒產生 100 次中斷. 然後在中斷程式中, 輪流掃描你的兩位數七段顯示器. 這個中斷程式由一組全域變數中 digit[0], digit[1] 去讀取 要顯示的值. 然後主程式的迴圈中判斷 key 是否被 "觸動", 僅抓取由 0 轉 1 的過程, 然後依按鈕的不同去設定 count 為 0 或減 1 加 1. count 有修改後, 再用 hex 轉 bcd 的方式, 將 count 的值轉到全域變數 digit[0], digit[1] 中 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |