标题: 单片机键盘扫描显示 [打印本页]

作者: 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.51hei.com/bbs/) Powered by Discuz! X3.1