線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2855
推到 Plurk!
推到 Facebook!

按鍵計數器,如何分別控制兩個以上的計數值

答題得分者是:bernie_w39
chjojon
一般會員


發表:7
回覆:26
積分:16
註冊:2006-07-09

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-07-23 23:50:07 IP:218.169.xxx.xxx 訂閱
之前發的問題我已經弄出來了
程式碼如下
[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 for(y=0; y<100; y );
}
/*----------掃描-------------------------*/
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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-07-24 00:02:05 IP:118.166.xxx.xxx 訂閱
可以用  array 吧, 例如:

int count[10];

就可以記錄 10 個計數器的值了, 不是嗎?
chjojon
一般會員


發表:7
回覆:26
積分:16
註冊:2006-07-09

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-07-24 00:11:29 IP:218.169.xxx.xxx 訂閱
對8051還不是說很熟
對陣列也不是很熟...
可否寫一小段示範讓我參考看看呢?
因為看書都看不大懂...

===================引 用 bernie_w39 文 章===================
可以用 array 吧, 例如:

int count[10];

就可以記錄 10 個計數器的值了, 不是嗎?
bernie_w39
資深會員


發表:3
回覆:199
積分:280
註冊:2007-10-07

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-07-24 22:25:24 IP:118.166.xxx.xxx 訂閱
剛才花了一點時間看了一下, 你的程式寫的好怪. 照說 LED 的輸出掃描是
一部份, 按鍵輸入改計數器又是另一部份, 為什麼你把兩部份的程式都糾結
在一起了? 這樣你連續按 K1, 或 K2 時, 計數器會連續增加或減少嗎?
chjojon
一般會員


發表:7
回覆:26
積分:16
註冊:2006-07-09

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-07-25 15:18:58 IP:218.169.xxx.xxx 訂閱
它是會的!
謝謝你的回覆~
我再試試看怎麼去用好了

其實,這是參考其他人寫的程式改出來的(它的也只能往上加>"<)
對了,您覺得還要怎麼改會比較好呢?
===================引 用 bernie_w39 文 章===================
剛才花了一點時間看了一下, 你的程式寫的好怪. 照說 LED 的輸出掃描是
一部份, 按鍵輸入改計數器又是另一部份, 為什麼你把兩部份的程式都糾結
在一起了? 這樣你連續按 K1, 或 K2 時, 計數器會連續增加或減少嗎?
bernie_w39
資深會員


發表:3
回覆:199
積分:280
註冊:2007-10-07

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-07-26 00:35:07 IP:118.166.xxx.xxx 訂閱
第一步是先把程式分離開來, 你可以先試試用時間中斷,
把計時器調到約每秒產生 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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-08-02 02:26:59 IP:218.169.xxx.xxx 訂閱

謝謝你的建議
我再來去做測試

謝謝!
===================引 用 bernie_w39 文 章===================
第一步是先把程式分離開來, 你可以先試試用時間中斷,
把計時器調到約每秒產生 100 次中斷. 然後在中斷程式中,
輪流掃描你的兩位數七段顯示器.

這個中斷程式由一組全域變數中 digit[0], digit[1] 去讀取
要顯示的值.

然後主程式的迴圈中判斷 key 是否被 "觸動", 僅抓取由 0
轉 1 的過程, 然後依按鈕的不同去設定 count 為 0 或減 1
加 1. count 有修改後, 再用 hex 轉 bcd 的方式, 將 count
的值轉到全域變數 digit[0], digit[1] 中
系統時間:2024-05-02 10:02:14
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!