[問題] 我想請教有關4X4建盤掃描程式的問題.

作者: MoonGoblin (小呱ㄗ)   2011-12-18 00:38:25
這個程式原本的功能是
如果你按4X4鍵盤上的數字
他就會在7段顯示器上顯示出你按的數字
現在我想加入的功能是
如果你同時按下建盤上的1跟0
他就會顯示出你剛剛按的10個數字
程式裡面後面沒有中文注解的就是我自己加進去的功能
但是現在就卡在 他只有一開始按什麼數字就顯示什麼數字的功能
沒有我寫進去的那個功能
所以我想請各位大大們指導一下 看看我哪裡有錯
程式從下面開始
#include <reg51.h> // 定義8051暫存器之標頭檔
#define KEYP P2 // 掃瞄輸出埠(高位元)及鍵盤輸入埠(低位元)
#define SEG7P P0 // 7節顯示器(g~a)輸出埤
unsigned char code TAB[15]= // 共陽7節顯示器(g~a)編碼
{ 0xc0, 0xf9, 0xa4, 0xb0, 0x99, // 數字0-4
0x92, 0x82, 0xf8, 0x80, 0x98, // 數字5-9
0xa0, 0x83, 0xa7, 0xa1, 0x84, // 字母a-e(10-14)
};
char disp =0x7f;
unsigned char scan[4]={ 0xef, 0xdf ,0xbf ,0x7f }; // 7顯示器及鍵盤之掃瞄碼
void delay1ms(int); // 宣告延遲函數
void scanner(void); // 宣告掃瞄函數
int TAB1[10];
int x;
//==主程式================================================
main() // 主程式開始
{ while(1) // 無窮迴圈,程式一直跑
scanner(); // 掃瞄鍵盤及顯示7段顯示器
} // 主程式結束
// === 延遲函數,延遲約x*1ms ================================
void delay1ms(int x) // 防彈跳函數開始
{ int i,j; // 宣告整數變數i
for(i=0;i<x;i++) // 計數x次,延遲約*1ms
for(j=0;j<120;j++); // 計數120次,延遲約1ms
} // 防彈跳函數結束
// ======= 掃瞄4*4鍵盤及4個7節顯示器函數 ================
void scanner(void) // 掃瞄函數開始
{ unsigned char col,row; // 宣告變數(col:行,row:列,dig:顥示位)
unsigned char rowkey,kcode; // 宣告變數(rowkey:列鍵值,kcode:按鍵碼)
for(col=0;col<4;col++) // for迴圈,掃瞄第col行
{ KEYP = scan[col]; // 高4位輸出掃瞄信號,低4位元輸入列值
SEG7P = disp; // 輸出數字
rowkey= ~KEYP & 0x0f; // 讀入KEYP低4位,反相再清除高4位求出列鍵值
if(rowkey != 0) // 若有按鍵
{ if(rowkey == 0x03) //====>這邊是同時按下1跟0的話會顯示出剛剛的10個數字
{ SEG7P = TAB1[x];
}
if(rowkey == 0x01) row=0; // 若第0列被按下
else if(rowkey == 0x02) row=1; // 若第1列被按下
else if(rowkey == 0x04) row=2; // 若第2列被按下
else if(rowkey == 0x08) row=3; // 若第3列被按下
kcode = 4 * col + row; // 算出按鍵之號碼
disp=TAB[kcode]; // 鍵值編碼後,寫入最右邊
if(x<10) //======> 這裡是把剛剛按的數字儲存在TAB1[x] 裡面
{TAB1[x] = TAB[kcode];
x = x + 1;
}
while(rowkey != 0) // 當按鈕未放開
rowkey=~KEYP & 0x0f; // 再讀入列鍵值
} // if敘述(有按鍵時)結束
delay1ms(4); // 延遲4ms
} // for迴圈結束(掃瞄col行)
} // 掃瞄函數scanner()結束
希望能幫忙一下>< 謝謝><

Links booklink

Contact Us: admin [ a t ] ucptt.com