1024手机基地看电影,午夜福利视频导航,国产精品福利在线一区,亚洲欧美日韩另类成人,在线观看午夜日本理论片,成年超爽免费网站,国产精品成人免费,精品动作一级毛片,成人免费观看网站,97精品伊人久久大香蕉

標題: 單片機鍵盤掃描顯示 [打印本頁]

作者: xk160cuijinxiu    時間: 2018-6-29 10:09
標題: 單片機鍵盤掃描顯示
①鍵輸入模塊:掃描鍵盤、讀取一次鍵盤并將鍵值存入鍵值緩沖單元。
②顯示模塊:將顯示單元的內容在顯示器上動態顯示。
③主程序:調用鍵輸入模塊和顯示模塊。

向列掃描碼地址(0X002H)逐列輸出低電平,然后從行碼地址(0X001H)讀回。如果有鍵按下,則相應行的值應為低,如果無鍵按下,由于上拉的作用,行碼為高。這樣就可以通過輸出的列碼和讀取的行碼來判斷按下的是什么鍵。在判斷有鍵按下后,要有一定的延時,防止鍵盤抖動。地址中的X是由KEY/LED CS 決定,參見地址譯碼。做鍵盤和LED實驗時,需將KEY/LED CS 接到相應的地址譯碼上。以便用相應的地址來訪問。例如將KEY/LED CS信號接CS0上,則列掃描地址為08002H,行碼地址為08001H列掃描碼還可以分時用作LED的位選通信號。

單片機源程序如下:

  1. #define LEDLen 6

  2. xdata unsigned char OUTBIT _at_ 0x8002;   // 位控制口
  3. xdata unsigned char OUTSEG _at_ 0x8004;   // 段控制口
  4. xdata unsigned char IN     _at_ 0x8001;   // 鍵盤讀入口

  5. unsigned char LEDBuf[LEDLen];    // 顯示緩沖
  6. code unsigned char LEDMAP[] = {  // 八段管顯示碼
  7.   0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,
  8.   0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71
  9. };

  10. void Delay(unsigned char CNT)
  11. {
  12.   unsigned char i;

  13.   while (CNT-- !=0)
  14.     for (i=100; i !=0; i--);
  15. }

  16. void DisplayLED()
  17. {
  18.   unsigned char i;
  19.   unsigned char Pos;
  20.   unsigned char LED;

  21.   Pos = 0x20;       // 從左邊開始顯示
  22.   for (i = 0; i < LEDLen; i++) {
  23.     OUTBIT = 0;     // 關所有八段管
  24.     LED = LEDBuf[i];
  25.     OUTSEG = LED;
  26.     OUTBIT = Pos;   // 顯示一位八段管
  27.     Delay(1);
  28.     Pos >>= 1;      // 顯示下一位
  29.   }
  30. }

  31. code unsigned char KeyTable[] = {   // 鍵碼定義
  32.   0x16, 0x15, 0x14, 0xff,
  33.   0x13, 0x12, 0x11, 0x10,
  34.   0x0d, 0x0c, 0x0b, 0x0a,
  35.   0x0e, 0x03, 0x06, 0x09,
  36.   0x0f, 0x02, 0x05, 0x08,
  37.   0x00, 0x01, 0x04, 0x07
  38. };

  39. unsigned char TestKey()
  40. {
  41.    OUTBIT = 0;            // 輸出線置為0
  42.    return (~IN & 0x0f);   // 讀入鍵狀態(高四位不用)
  43. }

  44. unsigned char GetKey()
  45. {
  46.   unsigned char Pos;
  47.   unsigned char i;
  48.   unsigned char k;

  49.   i = 6;
  50.   Pos = 0x20;     // 找出鍵所在列
  51.   do {
  52.     OUTBIT = ~ Pos;
  53.     Pos >>= 1;
  54.     k = ~IN & 0x0f;
  55.   } while ((--i != 0) && (k == 0));

  56.   // 鍵值 = 列 x 4 + 行
  57.   if (k != 0) {
  58.     i *= 4;
  59.     if (k & 2)
  60.       i += 1;
  61.     else if (k & 4)
  62.       i += 2;
  63.     else if (k & 8)
  64.       i += 3;

  65.     OUTBIT = 0;
  66.     do Delay(10); while (TestKey());  // 等鍵釋放

  67.     return(KeyTable[i]);  // 取出鍵碼
  68.   } else return(0xff);
  69. }

  70. void main()
  71. {
  72.    LEDBuf[0] = 0xff;
  73.    LEDBuf[1] = 0xff;
  74.    LEDBuf[2] = 0xff;
  75.    LEDBuf[3] = 0xff;
  76.    LEDBuf[4] = 0x00;
  77.    LEDBuf[5] = 0x00;

  78.    while (1) {
  79.      DisplayLED();
  80.      if (TestKey()) LEDBuf[5] = LEDMAP[GetKey() & 0x0f];
  81.    }
  82. }

復制代碼

所有資料51hei提供下載:
鍵盤掃描顯示.rar (991 Bytes, 下載次數: 7)








歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1