找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3905|回复: 4
打印 上一主题 下一主题
收起左侧

矩阵键盘16乘16高效率程序(新算法)

[复制链接]
跳转到指定楼层
楼主
ID:76556 发表于 2015-4-10 02:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
电路图下载:http://www.51hei.com/f/ks51.pdf

  1. #include<reg52.h>
  2. sbit ADDR0 = P1^0;
  3. sbit ADDR1 = P1^1;
  4. sbit ADDR2 = P1^2;
  5. sbit ADDR3 = P1^3;
  6. sbit ENLED = P1^4;
  7. sbit KEY_IN1 = P2^4;
  8. sbit KEY_IN2 = P2^5;
  9. sbit KEY_IN3 = P2^6;
  10. sbit KEY_IN4 = P2^7;
  11. sbit KEY_OUT1 = P2^3;
  12. sbit KEY_OUT2 = P2^2;
  13. sbit KEY_OUT3 = P2^1;
  14. sbit KEY_OUT4 = P2^0;
  15. unsigned char code LedChar[]={
  16. 0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
  17. 0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
  18. };
  19. unsigned char Key_Buff[4][4]={{1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}};
  20. void T0_Init()
  21. {
  22. EA = 1;
  23. TMOD = 0x01;
  24. TH0 = 0xFC;
  25. TL0 = 0x67;
  26. ET0 = 1;
  27. TR0 = 1;
  28. }
  29. void main()
  30. {
  31. unsigned char Key_Loosen[4][4]={{1,1,1,1},{1,1,1,1},{1,1,1,1},{1,1,1,1}};
  32. ENLED = 0;
  33. ADDR3 = 1;
  34. ADDR2 = 0;
  35. ADDR1 = 0;
  36. ADDR0 = 0;
  37. P0 = LedChar[0];
  38. P2=0xff;
  39. T0_Init();
  40. while(1)
  41. {
  42. unsigned char Num2,Num4;
  43. for(Num4=0;Num4<4;Num4++)
  44. {
  45. for(Num2=0;Num2<4;Num2++)
  46. {
  47. if(Key_Loosen[Num4][Num2]!=Key_Buff[Num4][Num2])   

  48. // 第一遍(最开始backup[i][j]的值等于1)        第二遍(由于KeySta[i][j]的值附给了backup[i][j],,backup[i][j]的值等于0,但是KeySta[i][j]的值任然等于0,由于if(backup[i][j] != KeySta[i][j])才能进入此程序所以KeySta[i][j]的值必须等于1,而KeySta[i][j]的值等于1的唯一办法就是松开按键,按键松开KeySta[i][j]的值等于1便进入了

  49. {
  50. if(Key_Loosen[Num4][Num2]==0)

  51. //第一遍(backup[i][j]的值任然等于1所以无法进入if)        第二遍(此时backup[i][j] == 0便顺理成章的进入了

  52. {
  53. P0 = LedChar[Num4*4+Num2];
  54. }
  55. Key_Loosen[Num4][Num2]=Key_Buff[Num4][Num2];

  56. //第一遍(KeySta[i][j]的值附给了backup[i][j],所以此时backup[i][j]的值等于0)        第二遍(由于此时KeySta[i][j]的值等于1,而KeySta[i][j]又把自己的值赋给了        backup[i][j],所以backup[i][j]的值又回到了初始化时的1)Over^-^

  57. }
  58. }
  59. }       
  60. }
  61. }

  62. void InterruptTimer0() interrupt 1
  63. {
  64. unsigned char Num1;
  65. static unsigned char Keys=0;
  66. TH0 = 0xFC;
  67. TL0 = 0x67;
  68. Key_Buff[Keys][0]=(Key_Buff[Keys][0]<<1)|KEY_IN1;
  69. Key_Buff[Keys][1]=(Key_Buff[Keys][1]<<1)|KEY_IN2;
  70. Key_Buff[Keys][2]=(Key_Buff[Keys][2]<<1)|KEY_IN3;
  71. Key_Buff[Keys][3]=(Key_Buff[Keys][3]<<1)|KEY_IN4;
  72. for(Num1=0;Num1<4;Num1++)
  73. {
  74. if((Key_Buff[Keys][Num1]&0x0f)==0x00)
  75. {
  76. Key_Buff[Keys][Num1]=0;
  77. }
  78. }
  79. Keys++;
  80. Keys=Keys&0x03;
  81. switch(Keys)
  82. {
  83. case 0:KEY_OUT4=1;KEY_OUT1=0;break;
  84. case 1:KEY_OUT1=1;KEY_OUT2=0;break;
  85. case 2:KEY_OUT2=1;KEY_OUT3=0;break;
  86. case 3:KEY_OUT3=1;KEY_OUT4=0;break;
  87. }
  88. }


  89. //注意数组也会重新初始化!

  90. 设计者:薛羽豪
复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:76556 发表于 2015-4-10 02:44 | 只看该作者
矩阵键盘的一种新算法         程序运行效率超高
根本没用延时
注意for语句的特殊性
回复

使用道具 举报

板凳
ID:76556 发表于 2015-4-10 02:44 | 只看该作者
数组没加code函数的话内部的数值是可以更改的
回复

使用道具 举报

地板
ID:76556 发表于 2015-4-10 02:44 | 只看该作者
郑重声明:0. 飞过漠北的南天只是马家沟皇家核工业高级技工专修学院的一名学生, 不是什么大神,只是傻 B 一个,菜鸟一枚!大神们请自觉绕道, 拍砖可以, 但切莫人生攻击!!
1.  本文所写程序,过程不一定是最规范的,但一定是对的,因为这是 哥自己试验过得, 证明是可行的。3. 本文所有权,解释权,都归飞过漠北的南天所有!若有转载,请注明出处!4. 如有问题, 请联系
但是。。。有问题也不一定回,
回复

使用道具 举报

5#
ID:76556 发表于 2015-4-10 02:44 | 只看该作者
注意:数组也会重兴初始化,如果不能移动数组的话,最好的方法是将数组定义为静态变量,(默认情况下数组都是动态变量即自动变量)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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