找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4009|回復(fù): 4
收起左側(cè)

矩陣鍵盤16乘16高效率程序(新算法)

[復(fù)制鏈接]
ID:76556 發(fā)表于 2015-4-10 02:43 | 顯示全部樓層 |閱讀模式
電路圖下載:http://www.torrancerestoration.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])才能進(jìn)入此程序所以KeySta[i][j]的值必須等于1,而KeySta[i][j]的值等于1的唯一辦法就是松開按鍵,按鍵松開KeySta[i][j]的值等于1便進(jìn)入了

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

  51. //第一遍(backup[i][j]的值任然等于1所以無法進(jìn)入if)        第二遍(此時(shí)backup[i][j] == 0便順理成章的進(jìn)入了

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

  56. //第一遍(KeySta[i][j]的值附給了backup[i][j],所以此時(shí)backup[i][j]的值等于0)        第二遍(由于此時(shí)KeySta[i][j]的值等于1,而KeySta[i][j]又把自己的值賦給了        backup[i][j],所以backup[i][j]的值又回到了初始化時(shí)的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. //注意數(shù)組也會(huì)重新初始化!

  90. 設(shè)計(jì)者:薛羽豪
復(fù)制代碼


回復(fù)

使用道具 舉報(bào)

ID:76556 發(fā)表于 2015-4-10 02:44 | 顯示全部樓層
矩陣鍵盤的一種新算法         程序運(yùn)行效率超高
根本沒用延時(shí)
注意for語句的特殊性
回復(fù)

使用道具 舉報(bào)

ID:76556 發(fā)表于 2015-4-10 02:44 | 顯示全部樓層
數(shù)組沒加code函數(shù)的話內(nèi)部的數(shù)值是可以更改的
回復(fù)

使用道具 舉報(bào)

ID:76556 發(fā)表于 2015-4-10 02:44 | 顯示全部樓層
鄭重聲明:0. 飛過漠北的南天只是馬家溝皇家核工業(yè)高級技工專修學(xué)院的一名學(xué)生, 不是什么大神,只是傻 B 一個(gè),菜鳥一枚!大神們請自覺繞道, 拍磚可以, 但切莫人生攻擊。
1.  本文所寫程序,過程不一定是最規(guī)范的,但一定是對的,因?yàn)檫@是 哥自己試驗(yàn)過得, 證明是可行的。3. 本文所有權(quán),解釋權(quán),都?xì)w飛過漠北的南天所有!若有轉(zhuǎn)載,請注明出處!4. 如有問題, 請聯(lián)系
但是。。。有問題也不一定回,
回復(fù)

使用道具 舉報(bào)

ID:76556 發(fā)表于 2015-4-10 02:44 | 顯示全部樓層
注意:數(shù)組也會(huì)重興初始化,如果不能移動(dòng)數(shù)組的話,最好的方法是將數(shù)組定義為靜態(tài)變量,(默認(rèn)情況下數(shù)組都是動(dòng)態(tài)變量即自動(dòng)變量)
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表