欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2064|回復: 0
打印 上一主題 下一主題
收起左側

單片機鍵盤掃描顯示

[復制鏈接]
跳轉到指定樓層
樓主
ID:361540 發表于 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)



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表