查看: 1507|回复: 8
打印 上一主题 下一主题

历时两天,终于出来啦!!!额。。。矩阵键盘!!!

[复制链接]
跳转到指定楼层
沙发
发表于 2014-8-9 11:15:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. /*******************************************************
  2. *   程序功能:矩阵键盘扫描
  3. *   接线说明:核心板JP1 PB0-PB7连接到核心板数码管显示电路JP71 JP2的PC0-PC7接到JP76
  4. *   实验现象:按下矩阵键盘,LED数码管显示相应的数字
  5. *        日    期 : 2014/8/9
  6. *        作    者 : 翟志刚
  7. *******************************************************/

  8. #include <iom16v.h>
  9. #include <macros.h>
  10. #define  uchar unsigned char
  11. #define  uint  unsigned int


  12. //数码管字型码表显示:从0显示到F
  13. uchar table[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0XFF};

  14. /*******************************************************
  15. //函数名称:delay_ms(uint ms)
  16. //函数功能:延时子程序
  17. //入口参数:i,j,延时时间参数
  18. //返回参数:无
  19. ********************************************************/

  20. void delay(uint ms)
  21. {
  22.         uint i,j;
  23.         for(i = 0;i < ms;i++)
  24.         {
  25.            for(j = 0;j < 1141;j++);
  26.         }
  27. }

  28. /*******************************************************
  29. //函数名称:key_press(void)
  30. //函数功能:检测按键释放与否
  31. //入口参数:i,PC口的输入参数
  32. //返回参数:无
  33. ********************************************************/

  34. uchar key_press(void)
  35. {
  36.         uchar i;
  37.         i = PINC;
  38.         if(i == 0XF0)                        //没按键按下
  39.         {
  40.                 DDRC = 0X0f;                //端口PC初始化
  41.             return 0;                        //返回0
  42.         }
  43.         else
  44.         {
  45.                 DDRC = 0X0f;                //端口PC初始化
  46.             return 1;                        //返回1,继续判断
  47.         }
  48. }

  49. /*******************************************************
  50. //函数名称:key_scan(void)
  51. //函数功能:按键扫描
  52. //入口参数:keycode,key,i,j
  53. //返回参数:无
  54. ********************************************************/

  55. uchar key_scan(void)
  56. {
  57.         uchar keycode,key,i,j;
  58.         delay(10);                                //利用延时函数进行消除抖动
  59.         if(key_press())                        //有按键按下
  60.         {
  61.                 i = 0X7F;
  62.                 PORTA=0x00;
  63.                 do
  64.                 {
  65.                         i = (i << 1|i >> 7);        //保证每次只能选中一个按键
  66.                         DDRC = 0X0F;                        //初始化PC口
  67.                         PORTC = i;
  68.                         keycode = PINC;
  69.                         j = keycode & 0XF0;                //判断是否有按键按下

  70.             }while(j == 0XF0);

  71.                 switch(keycode)                                //扫描键数值
  72.                 {
  73.                         case 0xEE:
  74.                                 key = 0;
  75.                                 break;
  76.                         case 0xDE:
  77.                                 key = 1;
  78.                                 break;
  79.                         case 0xBE:
  80.                                 key = 2;
  81.                                 break;
  82.                         case 0x7E:
  83.                                 key = 3;
  84.                                 break;
  85.                         case 0xED:
  86.                                 key = 4;
  87.                                 break;
  88.                         case 0xDD:
  89.                                 key = 5;
  90.                                 break;
  91.                         case 0xBD:
  92.                                 key        = 6;
  93.                                 break;
  94.                         case 0x7D:
  95.                                 key = 7;
  96.                                 break;
  97.                         case 0xEB:
  98.                                 key = 8;
  99.                                 break;
  100.                         case 0xDB:
  101.                                 key = 9;
  102.                                 break;
  103.                         case 0xBB:
  104.                                 key = 10;
  105.                                 break;
  106.                         case 0x7B:
  107.                                 key = 11;
  108.                                 break;
  109.                         case 0xE7:
  110.                                 key = 12;
  111.                                 break;
  112.                         case 0xD7:
  113.                                 key = 13;
  114.                                 break;
  115.                         case 0xB7:
  116.                                 key = 14;
  117.                                 break;
  118.                         case 0x77:
  119.                                 key = 15;
  120.                                 break;
  121.                 }
  122.          }

  123.          return key;
  124. }

  125. /*******************************************************
  126. //函数名称:main(void)
  127. //函数功能:程序主函数
  128. ********************************************************/

  129. void main(void)
  130. {
  131.         uchar a;

  132.         DDRC = 0X0F;                        //初始化PC口高四位为输入,第四位为输出
  133.         PORTC = 0X00;                        //定义PC口第四位输出为0

  134.         DDRB = 0XFF;                        //初始化PB口为输出
  135.         PORTB = 0x00;                        //定义PB口输出为0
  136.         while(1)
  137.         {
  138.                 if(key_press())                //判断是否有按键按下
  139.                 {
  140.                         a = key_scan();        //将按键值送给参数a
  141.                         PORTB=table[a];        //扫描按键 显示数据
  142.                 }
  143.         }
  144. }

复制代码


回复

使用道具 举报

板凳
发表于 2014-8-9 11:16:50 | 只看该作者
{:soso_e141:}
回复 支持 反对

使用道具 举报

地板
发表于 2014-8-9 11:16:51 | 只看该作者
卧槽,技术大神又出新帖啊,大家膜拜
回复 支持 反对

使用道具 举报

4#
 楼主| 发表于 2014-8-9 11:18:09 | 只看该作者
还你一世界 发表于 2014-8-9 11:16
卧槽,技术大神又出新帖啊,大家膜拜

妈蛋,这几天心力交瘁!
回复 支持 反对

使用道具 举报

5#
 楼主| 发表于 2014-8-9 11:18:49 | 只看该作者
回复 支持 反对

使用道具 举报

6#
发表于 2014-8-9 11:20:14 | 只看该作者
吃鸡心补了没?
回复 支持 反对

使用道具 举报

7#
 楼主| 发表于 2014-8-9 11:25:11 | 只看该作者

补了,昨晚还流了鼻血呢!
回复 支持 反对

使用道具 举报

8#
发表于 2014-8-9 11:26:52 | 只看该作者
jerryzhai 发表于 2014-8-9 11:25
补了,昨晚还流了鼻血呢!

。。。这明显是偷看美女才导到致吧
回复 支持 反对

使用道具 举报

9#
发表于 2014-8-9 14:23:29 | 只看该作者
大神,我们做朋友吧
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入因仑

本版积分规则

快速回复 返回顶部 返回列表