①鍵輸入模塊:掃描鍵盤、讀取一次鍵盤并將鍵值存入鍵值緩沖單元。 ②顯示模塊:將顯示單元的內(nèi)容在顯示器上動態(tài)顯示。 ③主程序:調(diào)用鍵輸入模塊和顯示模塊。
向列掃描碼地址(0X002H)逐列輸出低電平,然后從行碼地址(0X001H)讀回。如果有鍵按下,則相應(yīng)行的值應(yīng)為低,如果無鍵按下,由于上拉的作用,行碼為高。這樣就可以通過輸出的列碼和讀取的行碼來判斷按下的是什么鍵。在判斷有鍵按下后,要有一定的延時,防止鍵盤抖動。 地址中的X 是由KEY/LED CS 決定,參見地址譯碼。做鍵盤和LED實驗時,需將KEY/LED CS 接到相應(yīng)的地址譯碼上。以便用相應(yīng)的地址來訪問。例如將KEY/LED CS信號接CS0上,則列掃描地址為08002H ,行碼地址為08001H 。列掃描碼還可以分時用作LED的位選通信號。
單片機源程序如下:
- #define LEDLen 6
- xdata unsigned char OUTBIT _at_ 0x8002; // 位控制口
- xdata unsigned char OUTSEG _at_ 0x8004; // 段控制口
- xdata unsigned char IN _at_ 0x8001; // 鍵盤讀入口
- unsigned char LEDBuf[LEDLen]; // 顯示緩沖
- code unsigned char LEDMAP[] = { // 八段管顯示碼
- 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,
- 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71
- };
- void Delay(unsigned char CNT)
- {
- unsigned char i;
- while (CNT-- !=0)
- for (i=100; i !=0; i--);
- }
- void DisplayLED()
- {
- unsigned char i;
- unsigned char Pos;
- unsigned char LED;
- Pos = 0x20; // 從左邊開始顯示
- for (i = 0; i < LEDLen; i++) {
- OUTBIT = 0; // 關(guān)所有八段管
- LED = LEDBuf[i];
- OUTSEG = LED;
- OUTBIT = Pos; // 顯示一位八段管
- Delay(1);
- Pos >>= 1; // 顯示下一位
- }
- }
- code unsigned char KeyTable[] = { // 鍵碼定義
- 0x16, 0x15, 0x14, 0xff,
- 0x13, 0x12, 0x11, 0x10,
- 0x0d, 0x0c, 0x0b, 0x0a,
- 0x0e, 0x03, 0x06, 0x09,
- 0x0f, 0x02, 0x05, 0x08,
- 0x00, 0x01, 0x04, 0x07
- };
- unsigned char TestKey()
- {
- OUTBIT = 0; // 輸出線置為0
- return (~IN & 0x0f); // 讀入鍵狀態(tài)(高四位不用)
- }
- unsigned char GetKey()
- {
- unsigned char Pos;
- unsigned char i;
- unsigned char k;
- i = 6;
- Pos = 0x20; // 找出鍵所在列
- do {
- OUTBIT = ~ Pos;
- Pos >>= 1;
- k = ~IN & 0x0f;
- } while ((--i != 0) && (k == 0));
- // 鍵值 = 列 x 4 + 行
- if (k != 0) {
- i *= 4;
- if (k & 2)
- i += 1;
- else if (k & 4)
- i += 2;
- else if (k & 8)
- i += 3;
- OUTBIT = 0;
- do Delay(10); while (TestKey()); // 等鍵釋放
- return(KeyTable[i]); // 取出鍵碼
- } else return(0xff);
- }
- void main()
- {
- LEDBuf[0] = 0xff;
- LEDBuf[1] = 0xff;
- LEDBuf[2] = 0xff;
- LEDBuf[3] = 0xff;
- LEDBuf[4] = 0x00;
- LEDBuf[5] = 0x00;
- while (1) {
- DisplayLED();
- if (TestKey()) LEDBuf[5] = LEDMAP[GetKey() & 0x0f];
- }
- }
復(fù)制代碼
所有資料51hei提供下載:
鍵盤掃描顯示.rar
(991 Bytes, 下載次數(shù): 7)
2018-6-29 10:08 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|