久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

STC15單片機—矩陣鍵盤程序的寫法

[復制鏈接]
跳轉到指定樓層
樓主
矩陣鍵盤Proteus仿真
一、Proteus仿真STC15的問題
> 據說P0口存在BUG,不會被正常拉低,而是產生短路。
  • 1
二、原理圖1、CPU

2、矩陣鍵盤

3、顯示部分


程序
一、矩陣鍵盤_單行掃描_普通寫法
  1. #include<STC15.H>
  2. #include<intrins.h>

  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. #define KeyBus P6    //定義矩陣鍵盤接口

  6. uchar Key_res =0;
  7. uchar i=0;

  8. void GPIO(void);    //IO口初始化函數
  9. void Delay10ms();                //@12.000MHz
  10. void Delay5ms();                //@12.000MHz
  11. void Delay1ms();          //@12.000MHz
  12. uchar Key16_Scan(void);//矩陣鍵盤掃描函數子程序
  13. void Key16_Function(void); //矩陣鍵盤服務(功能)子函數

  14. void main(void)
  15. {
  16.     GPIO();

  17.         while(1)
  18.         {
  19.                 Key_res =0;
  20.                 i=Key16_Scan();   //矩陣鍵盤掃描函數子程序
  21.         Key16_Function(); //矩陣鍵盤服務(功能)子函數
  22.         }
  23. }

  24. //-----------------------------------IO口初始化函數-----------------------------//
  25. void GPIO(void)
  26. {
  27.         P0M1=0;
  28.         P0M0=0;
  29.         P1M1=0;
  30.         P1M0=0;
  31.         P2M1=0;
  32.         P2M0=0;
  33.         P3M1=0;
  34.         P3M0=0;
  35.         P4M1=0;
  36.         P4M0=0;
  37.         P5M1=0;
  38.         P5M0=0;
  39. }

  40. //------------------------------------軟件延時---------------------------------------//
  41. void Delay10ms()                //@12.000MHz
  42. {
  43.         unsigned char i, j;

  44.         i = 117;
  45.         j = 184;
  46.         do
  47.         {
  48.                 while (--j);
  49.         } while (--i);
  50. }

  51. void Delay5ms()                //@12.000MHz
  52. {
  53.         unsigned char i, j;

  54.         i = 59;
  55.         j = 90;
  56.         do
  57.         {
  58.                 while (--j);
  59.         } while (--i);
  60. }

  61. void Delay1ms()                //@12.000MHz
  62. {
  63.         unsigned char i, j;

  64.         i = 12;
  65.         j = 169;
  66.         do
  67.         {
  68.                 while (--j);
  69.         } while (--i);
  70. }



  71. //---------------------------------------矩陣鍵盤掃描函數子程序-------------------------//

  72. uchar Key16_Scan(void)
  73. {
  74.         uchar temp = 0;
  75.         uchar Key_res = 0;
  76.         
  77.     KeyBus = 0XFF;        
  78.         KeyBus = 0X7F;         //0111 1111 掃描第一行
  79.          temp=KeyBus;
  80.         temp=temp&0X0F;
  81.         if(temp!=0X0F)
  82.         {
  83.           Delay10ms();   //按鍵消抖
  84.           temp=KeyBus;
  85.           temp=temp&0X0F;
  86.           if(temp!=0X0F)
  87.                 {
  88.                         temp=temp&0X0F;
  89.                         switch(temp)
  90.                         {
  91.                                 case 0X0E: Key_res=16;break;
  92.                                 case 0X0D: Key_res=15;break;
  93.                                 case 0X0B: Key_res=14;break;
  94.                                 case 0X07: Key_res=13;break;
  95.                                 default: break;
  96.                         }
  97.                         while(temp!=0X0F)     //松手檢測
  98.                         {
  99.                                 temp=KeyBus;
  100.                                 temp=temp&0X0F;
  101.                         }        
  102.                 }
  103.         }
  104.         
  105.         KeyBus = 0XFF;
  106.         KeyBus = 0XBF;         //1011 1111  掃描第二行
  107.          temp=KeyBus;
  108.         temp=temp&0X0F;
  109.         if(temp!=0X0F)
  110.         {
  111.           Delay10ms();
  112.           temp=KeyBus;
  113.           temp=temp&0X0F;
  114.           if(temp!=0X0F)
  115.                 {
  116.                         temp=temp&0X0F;
  117.                         switch(temp)
  118.                         {
  119.                                 case 0X0E: Key_res=12;break;
  120.                                 case 0X0D: Key_res=11;break;
  121.                                 case 0X0B: Key_res=10;break;
  122.                                 case 0X07: Key_res=9;break;
  123.                                 default: break;
  124.                         }
  125.                         while(temp!=0X0F)     //松手檢測
  126.                         {
  127.                                 temp=KeyBus;
  128.                                 temp=temp&0X0F;
  129.                         }        
  130.                 }
  131.         }

  132.         KeyBus = 0XFF;        
  133.         KeyBus = 0XDF;         //1101 1111  掃描第三行
  134.          temp=KeyBus;
  135.         temp=temp&0X0F;
  136.         if(temp!=0X0F)
  137.         {
  138.           Delay10ms();
  139.           temp=KeyBus;
  140.           temp=temp&0X0F;
  141.           if(temp!=0X0F)
  142.                 {
  143.                         temp=temp&0X0F;
  144.                         switch(temp)
  145.                         {
  146.                                 case 0X0E: Key_res=8;break;
  147.                                 case 0X0D: Key_res=7;break;
  148.                                 case 0X0B: Key_res=6;break;
  149.                                 case 0X07: Key_res=5;break;
  150.                                 default: break;
  151.                         }
  152.                         while(temp!=0X0F)    //松手檢測
  153.                         {
  154.                                 temp=KeyBus;
  155.                                 temp=temp&0X0F;
  156.                         }        
  157.                 }
  158.         }

  159.         KeyBus = 0XFF;        
  160.         KeyBus = 0XEF;         //1110 1111  掃描第四行
  161.          temp=KeyBus;
  162.         temp=temp&0X0F;
  163.         if(temp!=0X0F)
  164.         {
  165.           Delay10ms();
  166.           temp=KeyBus;
  167.           temp=temp&0X0F;
  168.           if(temp!=0X0F)
  169.                 {
  170.                         temp=temp&0X0F;
  171.                         switch(temp)
  172.                         {
  173.                                 case 0X0E: Key_res=4;break;
  174.                                 case 0X0D: Key_res=3;break;
  175.                                 case 0X0B: Key_res=2;break;
  176.                                 case 0X07: Key_res=1;break;
  177.                                 default: break;
  178.                         }
  179.                         while(temp!=0X0F)     //松手檢測
  180.                         {
  181.                                 temp=KeyBus;
  182.                                 temp=temp&0X0F;
  183.                         }        
  184.                 }
  185.         }
  186.         return Key_res;
  187. }


  188. //-----------------------------------矩陣鍵盤服務(功能)子函數-------------------//
  189. void Key16_Function(void)
  190. {
  191.         if(i != 0)
  192.                 {
  193.                         switch(i)
  194.                         {
  195.                           case  1: P1=0XFE;P2=0XFF;break;
  196.                           case  2: P1=0XFD;P2=0XFF;break;
  197.                       case  3: P1=0XFB;P2=0XFF;break;
  198.                       case  4: P1=0XF7;P2=0XFF;break;
  199.                           case  5: P1=0XEF;P2=0XFF;break;
  200.                           case  6: P1=0XDF;P2=0XFF;break;
  201.                           case  7: P1=0XBF;P2=0XFF;break;
  202.                           case  8: P1=0X7F;P2=0XFF;break;
  203.                           case  9: P1=0XFF;P2=0XFE;break;
  204.                           case 10: P1=0XFF;P2=0XFD;break;
  205.                           case 11: P1=0XFF;P2=0XFB;break;
  206.                           case 12: P1=0XFF;P2=0XF7;break;
  207.                           case 13: P1=0XFF;P2=0XEF;break;
  208.                           case 14: P1=0XFF;P2=0XDF;break;
  209.                           case 15: P1=0XFF;P2=0XBF;break;
  210.                           case 16: P1=0XFF;P2=0X7F;break;
  211.                           default:P1=0X00;P2=0X00;break;
  212.                         }
  213.         }
  214. }
復制代碼
二、矩陣鍵盤_單行掃描_外部中斷

(代碼未能實現,改進ing)


  1. #include<STC15.H>
  2. #include<intrins.h>


  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. #define KeyBus P6    //定義矩陣鍵盤接口

  6. uchar Key_res =0;
  7. uchar i=0;

  8. void GPIO(void);    //IO口初始化函數
  9. void Delay10ms();                //@12.000MHz
  10. void Delay5ms();                //@12.000MHz
  11. void Delay1ms();          //@12.000MHz
  12. void INT1_INIT(void);    //外部中斷1初始化函數
  13. uchar Key16_Scan(void);//矩陣鍵盤掃描函數子程序
  14. void Key16_Function(void); //矩陣鍵盤服務(功能)子函數

  15. void main(void)
  16. {
  17.   GPIO();
  18.   INT1_INIT();
  19.         while(1)
  20.         {
  21.            KeyBus=0X0F;               
  22.        Key16_Function(); //矩陣鍵盤服務(功能)子函數
  23.         }
  24. }

  25. //-----------------------------------IO口初始化函數-----------------------------//
  26. void GPIO(void)
  27. {
  28.         P0M1=0;
  29.         P0M0=0;
  30.         P1M1=0;
  31.         P1M0=0;
  32.         P2M1=0;
  33.         P2M0=0;
  34.         P3M1=0;
  35.         P3M0=0;
  36.         P4M1=0;
  37.         P4M0=0;
  38.         P5M1=0;
  39.         P5M0=0;

  40. }

  41. //------------------------------------軟件延時---------------------------------------//
  42. void Delay10ms()                //@12.000MHz
  43. {
  44.         unsigned char i, j;

  45.         i = 117;
  46.         j = 184;
  47.         do
  48.         {
  49.                 while (--j);
  50.         } while (--i);
  51. }

  52. void Delay5ms()                //@12.000MHz
  53. {
  54.         unsigned char i, j;

  55.         i = 59;
  56.         j = 90;
  57.         do
  58.         {
  59.                 while (--j);
  60.         } while (--i);
  61. }

  62. void Delay1ms()                //@12.000MHz
  63. {
  64.         unsigned char i, j;

  65.         i = 12;
  66.         j = 169;
  67.         do
  68.         {
  69.                 while (--j);
  70.         } while (--i);
  71. }

  72. //---------------------------------------外部中斷1初始化函數-----------------------------//
  73. void INT1_INIT(void)
  74. {
  75.         IT1=1;
  76.         EX1=1;
  77.   EA=1;

  78. }

  79. //---------------------------------------矩陣鍵盤掃描函數子程序-------------------------//

  80. uchar Key16_Scan(void)
  81. {
  82.         uchar temp = 0;
  83.         uchar Key_res = 0;
  84.         
  85.     KeyBus = 0XFF;        
  86.         KeyBus = 0X7F;         //0111 1111
  87.          temp=KeyBus;
  88.         temp=temp&0X0F;
  89.         if(temp!=0X0F)
  90.         {
  91.           Delay10ms();
  92.           temp=KeyBus;
  93.           temp=temp&0X0F;
  94.           if(temp!=0X0F)
  95.                 {
  96.                         temp=temp&0X0F;
  97.                         switch(temp)
  98.                         {
  99.                                 case 0X0E: Key_res=16;break;
  100.                                 case 0X0D: Key_res=15;break;
  101.                                 case 0X0B: Key_res=14;break;
  102.                                 case 0X07: Key_res=13;break;
  103.                                 default: break;
  104.                         }
  105.                         while(temp!=0X0F)     //松手檢測
  106.                         {
  107.                                 temp=KeyBus;
  108.                                 temp=temp&0X0F;
  109.                         }        
  110.                 }
  111.         }
  112.         
  113.         KeyBus = 0XFF;
  114.         KeyBus = 0XBF;         //1011 1111
  115.          temp=KeyBus;
  116.         temp=temp&0X0F;
  117.         if(temp!=0X0F)
  118.         {
  119.           Delay10ms();
  120.           temp=KeyBus;
  121.           temp=temp&0X0F;
  122.           if(temp!=0X0F)
  123.                 {
  124.                         temp=temp&0X0F;
  125.                         switch(temp)
  126.                         {
  127.                                 case 0X0E: Key_res=12;break;
  128.                                 case 0X0D: Key_res=11;break;
  129.                                 case 0X0B: Key_res=10;break;
  130.                                 case 0X07: Key_res=9;break;
  131.                                 default: break;
  132.                         }
  133.                         while(temp!=0X0F)     //松手檢測
  134.                         {
  135.                                 temp=KeyBus;
  136.                                 temp=temp&0X0F;
  137.                         }        
  138.                 }
  139.         }

  140.         KeyBus = 0XFF;        
  141.         KeyBus = 0XDF;         //1101 1111
  142.          temp=KeyBus;
  143.         temp=temp&0X0F;
  144.         if(temp!=0X0F)
  145.         {
  146.           Delay10ms();
  147.       temp=KeyBus;
  148.           temp=temp&0X0F;
  149.           if(temp!=0X0F)
  150.                 {
  151.                         temp=temp&0X0F;
  152.                         switch(temp)
  153.                         {
  154.                                 case 0X0E: Key_res=8;break;
  155.                                 case 0X0D: Key_res=7;break;
  156.                                 case 0X0B: Key_res=6;break;
  157.                                 case 0X07: Key_res=5;break;
  158.                                 default: break;
  159.                         }
  160.                         while(temp!=0X0F)    //松手檢測
  161.                         {
  162.                                 temp=KeyBus;
  163.                                 temp=temp&0X0F;
  164.                         }        
  165.                 }
  166.         }

  167.         KeyBus = 0XFF;        
  168.         KeyBus = 0XEF;         //1110 1111
  169.          temp=KeyBus;
  170.         temp=temp&0X0F;
  171.         if(temp!=0X0F)
  172.         {
  173.       Delay10ms();
  174.           temp=KeyBus;
  175.           temp=temp&0X0F;
  176.           if(temp!=0X0F)
  177.                 {
  178.                         temp=temp&0X0F;
  179.                         switch(temp)
  180.                         {
  181.                                 case 0X0E: Key_res=4;break;
  182.                                 case 0X0D: Key_res=3;break;
  183.                                 case 0X0B: Key_res=2;break;
  184.                                 case 0X07: Key_res=1;break;
  185.                                 default: break;
  186.                         }
  187.                         while(temp!=0X0F)     //松手檢測
  188.                         {
  189.                                 temp=KeyBus;
  190.                                 temp=temp&0X0F;
  191.                         }        
  192.                 }
  193.         }
  194.         return Key_res;
  195. }

  196. //--------------------------------------外部中斷1服務函數-----------------------------//
  197. void INT1_ISR() interrupt 2
  198. {
  199.                 i = Key16_Scan();   //矩陣鍵盤掃描函數子程序
  200. }



  201. //-----------------------------------矩陣鍵盤服務(功能)子函數-------------------//
  202. void Key16_Function(void)
  203. {
  204.         if(i != 0)
  205.                 {
  206.                         switch(i)
  207.                         {
  208.                           case  1: P1=0XFE;P2=0XFF;break;
  209.                           case  2: P1=0XFD;P2=0XFF;break;
  210.                       case  3: P1=0XFB;P2=0XFF;break;
  211.                       case  4: P1=0XF7;P2=0XFF;break;
  212.                           case  5: P1=0XEF;P2=0XFF;break;
  213.                           case  6: P1=0XDF;P2=0XFF;break;
  214.                           case  7: P1=0XBF;P2=0XFF;break;
  215.                           case  8: P1=0X7F;P2=0XFF;break;
  216.                           case  9: P1=0XFF;P2=0XFE;break;
  217.                           case 10: P1=0XFF;P2=0XFD;break;
  218.                           case 11: P1=0XFF;P2=0XFB;break;
  219.                           case 12: P1=0XFF;P2=0XF7;break;
  220.                           case 13: P1=0XFF;P2=0XEF;break;
  221.                           case 14: P1=0XFF;P2=0XDF;break;
  222.                           case 15: P1=0XFF;P2=0XBF;break;
  223.                           case 16: P1=0XFF;P2=0X7F;break;
  224.                           default:P1=0X00;P2=0X00;break;
  225.                         }
  226.         }
  227. }

復制代碼


三、矩陣鍵盤_多行掃描_普通寫法
  1. #include<STC15.H>
  2. #include<intrins.h>

  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. #define KeyBus P6    //定義矩陣鍵盤接口

  6. uchar Key_res =0;
  7. uchar i=0;

  8. void GPIO(void);    //IO口初始化函數
  9. void Delay10ms();                //@12.000MHz
  10. void Delay5ms();                //@12.000MHz
  11. void Delay1ms();          //@12.000MHz
  12. uchar Key16_Scan(void);//矩陣鍵盤掃描函數子程序
  13. void Key16_Function(void); //矩陣鍵盤服務(功能)子函數

  14. void main(void)
  15. {
  16.   GPIO();    //IO口初始化函數

  17.         while(1)
  18.         {
  19.                 Key_res =0;
  20.                 i=Key16_Scan();   //矩陣鍵盤掃描函數子程序
  21.     Key16_Function(); //矩陣鍵盤服務(功能)子函數
  22.         }
  23. }

  24. //-----------------------------------IO口初始化函數-----------------------------//
  25. void GPIO(void)
  26. {
  27.         P0M1=0;
  28.         P0M0=0;
  29.         P1M1=0;
  30.         P1M0=0;
  31.         P2M1=0;
  32.         P2M0=0;
  33.         P3M1=0;
  34.         P3M0=0;
  35.         P4M1=0;
  36.         P4M0=0;
  37.         P5M1=0;
  38.         P5M0=0;

  39. }

  40. //------------------------------------軟件延時---------------------------------------//
  41. void Delay10ms()                //@12.000MHz
  42. {
  43.         unsigned char i, j;

  44.         i = 117;
  45.         j = 184;
  46.         do
  47.         {
  48.                 while (--j);
  49.         } while (--i);
  50. }

  51. void Delay5ms()                //@12.000MHz
  52. {
  53.         unsigned char i, j;

  54.         i = 59;
  55.         j = 90;
  56.         do
  57.         {
  58.                 while (--j);
  59.         } while (--i);
  60. }

  61. void Delay1ms()                //@12.000MHz
  62. {
  63.         unsigned char i, j;

  64.         i = 12;
  65.         j = 169;
  66.         do
  67.         {
  68.                 while (--j);
  69.         } while (--i);
  70. }



  71. //---------------------------------------矩陣鍵盤掃描函數子程序-------------------------//

  72. uchar Key16_Scan(void)
  73. {
  74.         uchar X_temp = 0,Y_temp = 0;
  75.         uchar Key_down = 0;
  76.         
  77.         KeyBus = 0XFF;        
  78.         KeyBus = 0X0F;        //高4位置0,低4位置1,此時有按鍵按下時,低四位的某一位會被拉低,由此定位按下的按鍵在第幾列
  79.         Y_temp = KeyBus&0X0F;
  80.         
  81.         if(Y_temp!=0X0F)        //如果檢測到某列有按鍵按下(有按鍵按下時,低四位會有一位被拉低)
  82.         {
  83.                 Delay5ms();    //按鍵消抖(不知道有無必要)
  84.                 KeyBus = 0X0F;         
  85.             Y_temp = KeyBus&0X0F;//將KeyBus低四位的按鍵信息賦值給Y_temp
  86.                 if(Y_temp!=0X0F)
  87.                 {
  88.                         KeyBus = 0X0F;
  89.                         Y_temp = KeyBus&0X0F;  //將KeyBus低四位的按鍵信息賦值給Y_temp,反應列信息
  90.                         KeyBus = 0XF0;
  91.                         X_temp = KeyBus&0XF0;  //將KeyBus高四位的按鍵信息賦值給X_temp,反應行信息
  92.                         if(Key_down == 0)      //按鍵抬起檢測,        
  93.                         {
  94.                           switch(Y_temp)    //判斷列
  95.                           {
  96.                                   case 0X07: Key_res=1; break;
  97.                                   case 0X0B: Key_res=2; break;
  98.                                   case 0X0D: Key_res=3; break;
  99.                                   case 0X0E: Key_res=4; break;
  100.                                   default: return 0;    //無按鍵按下,返回0
  101.                           }
  102.                          switch(X_temp)    //判斷行
  103.                           {
  104.                                 case 0X70: return Key_res+12;break;
  105.                              case 0XB0: return Key_res+ 8;break;
  106.                 case 0XD0: return Key_res+ 4;break;
  107.                 case 0XE0: return Key_res;   break;
  108.                 default: return 0;         //無按鍵按下,返回0        
  109.                          }
  110.                  }
  111.          }
  112.         }
  113.         else
  114.                 Key_down = 0;        //按鍵被松開
  115.         
  116.         if(Key_res)
  117.                 Key_down = 1;        //標志按鍵被按下,防止重入

  118.         return Key_res;
  119. }
  120.    

  121. //-----------------------------------矩陣鍵盤服務(功能)子函數-------------------//
  122. void Key16_Function(void)
  123. {
  124.         if(i != 0)    //按鍵按下
  125.                 {
  126.                         switch(i)
  127.                         {
  128.                           case  1: P1=0XFE;P2=0XFF;break;
  129.                           case  2: P1=0XFD;P2=0XFF;break;
  130.                       case  3: P1=0XFB;P2=0XFF;break;
  131.                       case  4: P1=0XF7;P2=0XFF;break;
  132.                           case  5: P1=0XEF;P2=0XFF;break;
  133.                           case  6: P1=0XDF;P2=0XFF;break;
  134.                           case  7: P1=0XBF;P2=0XFF;break;
  135.                           case  8: P1=0X7F;P2=0XFF;break;
  136.                           case  9: P1=0XFF;P2=0XFE;break;
  137.                           case 10: P1=0XFF;P2=0XFD;break;
  138.                           case 11: P1=0XFF;P2=0XFB;break;
  139.                           case 12: P1=0XFF;P2=0XF7;break;
  140.                           case 13: P1=0XFF;P2=0XEF;break;
  141.                           case 14: P1=0XFF;P2=0XDF;break;
  142.                           case 15: P1=0XFF;P2=0XBF;break;
  143.                           case 16: P1=0XFF;P2=0X7F;break;
  144.                           default:P1=0X00;P2=0X00;break;
  145.                         }
  146.         }
  147. }
復制代碼



四、矩陣鍵盤_多行掃描_外部中斷

(僅能檢測到列,檢測不到行,改進ing)


  1. #include<STC15.H>
  2. #include<intrins.h>

  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. #define KeyBus P6    //定義矩陣鍵盤接口

  6. uchar Key_res =0;
  7. uchar i=0;

  8. void GPIO(void);    //IO口初始化函數
  9. void Delay10ms();                //@12.000MHz
  10. void Delay5ms();                //@12.000MHz
  11. void Delay1ms();          //@12.000MHz
  12. void INT1_INIT(void); //外部中斷1初始化函數
  13. uchar Key16_Scan(void);//矩陣鍵盤掃描函數子程序
  14. void Key16_Function(void); //矩陣鍵盤服務(功能)子函數

  15. void main(void)
  16. {
  17.    GPIO();    //IO口初始化函數
  18.    INT1_INIT();
  19.         while(1)
  20.         {
  21.           KeyBus = 0X0F;
  22.       Key16_Function(); //矩陣鍵盤服務(功能)子函數
  23.         }
  24. }

  25. //-----------------------------------IO口初始化函數-----------------------------//
  26. void GPIO(void)
  27. {
  28.         P0M1=0;
  29.         P0M0=0;
  30.         P1M1=0;
  31.         P1M0=0;
  32.         P2M1=0;
  33.         P2M0=0;
  34.         P3M1=0;
  35.         P3M0=0;
  36.         P4M1=0;
  37.         P4M0=0;
  38.         P5M1=0;
  39.         P5M0=0;

  40. }

  41. //------------------------------------軟件延時---------------------------------------//
  42. void Delay10ms()                //@12.000MHz
  43. {
  44.         unsigned char i, j;

  45.         i = 117;
  46.         j = 184;
  47.         do
  48.         {
  49.                 while (--j);
  50.         } while (--i);
  51. }

  52. void Delay5ms()                //@12.000MHz
  53. {
  54.         unsigned char i, j;

  55.         i = 59;
  56.         j = 90;
  57.         do
  58.         {
  59.                 while (--j);
  60.         } while (--i);
  61. }

  62. void Delay1ms()                //@12.000MHz
  63. {
  64.         unsigned char i, j;

  65.         i = 12;
  66.         j = 169;
  67.         do
  68.         {
  69.                 while (--j);
  70.         } while (--i);
  71. }

  72. //---------------------------------------外部中斷1初始化函數-----------------------------//
  73. void INT1_INIT(void)
  74. {
  75.         IT1=1;
  76.         EX1=1;
  77.     EA=1;

  78. }

  79. //---------------------------------------矩陣鍵盤掃描函數子程序-------------------------//

  80. uchar Key16_Scan(void)
  81. {

  82.         uchar X_temp = 0,Y_temp = 0;
  83.         uchar Key_down = 0;
  84.         
  85.         KeyBus = 0XFF;        
  86.         KeyBus = 0X0F;        //高4位置0,低4位置1,此時有按鍵按下時,低四位的某一位會被拉低,由此定位按下的按鍵在第幾列
  87.         Y_temp = KeyBus&0X0F;
  88.         
  89.         if(Y_temp!=0X0F)        //如果檢測到某列有按鍵按下(有按鍵按下時,低四位會有一位被拉低)
  90.         {
  91.                 Delay1ms();    //按鍵消抖(不知道有無必要)
  92.                 KeyBus = 0X0F;         
  93.             Y_temp = KeyBus&0X0F;//將KeyBus低四位的按鍵信息賦值給Y_temp
  94.                 if(Y_temp!=0X0F)
  95.                 {
  96.                         KeyBus = 0X0F;
  97.                         Y_temp = KeyBus&0X0F;  //將KeyBus低四位的按鍵信息賦值給Y_temp,反應列信息
  98.                         KeyBus = 0XF0;
  99.                         X_temp = KeyBus&0XF0;  //將KeyBus高四位的按鍵信息賦值給X_temp,反應行信息
  100.                         if(Key_down == 0)      //按鍵抬起檢測,        
  101.                         {
  102.                           switch(Y_temp)    //判斷列
  103.                           {
  104.                                   case 0X07: Key_res=1; break;
  105.                                   case 0X0B: Key_res=2; break;
  106.                                   case 0X0D: Key_res=3; break;
  107.                                   case 0X0E: Key_res=4; break;
  108.                                   default: return 0;    //無按鍵按下,返回0
  109.                           }
  110.                          switch(X_temp)    //判斷行
  111.                           {
  112.                                 case 0X70: return Key_res+12;break;
  113.                                    case 0XB0: return Key_res+ 8;break;
  114.                 case 0XD0: return Key_res+ 4;break;
  115.                 case 0XE0: return Key_res;   break;
  116.                 default: return 0;         //無按鍵按下,返回0        
  117.                          }
  118.                  }
  119.          }
  120.         }
  121.         else
  122.                 Key_down = 0;        //按鍵被松開
  123.         
  124.         if(Key_res)
  125.                 Key_down = 1;        //標志按鍵被按下,防止重入

  126.         return Key_res;
  127. }
  128.    
  129. //--------------------------------------外部中斷1服務函數-----------------------------//
  130. void INT1_ISR() interrupt 2
  131. {
  132.                 i = Key16_Scan();   //矩陣鍵盤掃描函數子程序
  133. }

  134. //-----------------------------------矩陣鍵盤服務(功能)子函數-------------------//
  135. void Key16_Function(void)
  136. {
  137.         EX1=0;
  138.         if(i != 0)    //按鍵按下
  139.                 {
  140.                         switch(i)
  141.                         {
  142.                           case  1: P1=0XFE;P2=0XFF;break;
  143.                           case  2: P1=0XFD;P2=0XFF;break;
  144.                       case  3: P1=0XFB;P2=0XFF;break;
  145.                       case  4: P1=0XF7;P2=0XFF;break;
  146.                           case  5: P1=0XEF;P2=0XFF;break;                                    
  147.                           case  6: P1=0XDF;P2=0XFF;break;
  148.                           case  7: P1=0XBF;P2=0XFF;break;
  149.                           case  8: P1=0X7F;P2=0XFF;break;
  150.                           case  9: P1=0XFF;P2=0XFE;break;
  151.                           case 10: P1=0XFF;P2=0XFD;break;
  152.                           case 11: P1=0XFF;P2=0XFB;break;
  153.                           case 12: P1=0XFF;P2=0XF7;break;
  154.                           case 13: P1=0XFF;P2=0XEF;break;
  155.                           case 14: P1=0XFF;P2=0XDF;break;
  156.                           case 15: P1=0XFF;P2=0XBF;break;
  157.                           case 16: P1=0XFF;P2=0X7F;break;
  158.                           default:P1=0X00;P2=0X00;break;
  159.                         }
  160.         }
  161.         EX1=1;
  162. }

復制代碼

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产一级片免费在线观看 | 亚洲一区精品在线 | 欧美精品在欧美一区二区 | 日日操日日干 | 成人免费视频在线观看 | 亚洲传媒在线 | 精品免费视频一区二区 | 国产在线一区二区 | 亚洲一区二区三区四区在线观看 | 成人欧美一区二区三区在线观看 | 欧区一欧区二欧区三免费 | 日韩成人av在线播放 | 国产高清免费 | 麻豆av片 | 成人免费小视频 | 亚洲91av| 一区二区三区视频播放 | 成人精品一区亚洲午夜久久久 | 毛片一级片 | 欧美a级成人淫片免费看 | 久久久噜噜噜www成人网 | 国产欧美一级二级三级在线视频 | 日韩1区2区 | 欧美精品成人一区二区三区四区 | 密乳av| 国产精品区二区三区日本 | 日韩欧美在线视频观看 | 久久久精品一区二区三区 | 免费观看av | 精品国产乱码久久久久久88av | 91玖玖| 国产精品视频一 | 亚洲一区二区在线 | 日本精品国产 | 欧美精品91爱爱 | 免费黄色录像片 | 91精品久久久久久久久久 | 国产日韩欧美一区 | www.99re| 色综合久久88色综合天天 | 91一区二区 |