嵌入式人機(jī)界面中的鍵盤及其接口設(shè)計(jì)

字號(hào):

具體程序如下:
     SUBDESIGN keyboard
     ( clk, reset, col[3..0] : INPUT;
          row[3..0], d[3..0], keypress : OUTPUT; )
       VARIABLE
          ring[3..0] : JKFF ;
          kp : DFF ;
          adiv : TFF ;
          array[3..0] : DFF ;
          clk/2 : NODE ;
     BEGIN
          adiv.t = VCC ;
          adiv.clk = clk ;
          clk/2 = adiv.q ;
          ring[].clk = clk/2 ;
          ring[2..0].clrn = reset ;
          ring3.prn = reset ;
          ring0.j = ring3.q ;
          ring0.k = !ring3.q ;
          ring1.j = ring0.q ;
          ring1.k = !ring0.q ;
          ring2.j = ring1.q ;
          ring2.k = !ring1.q ;
          ring3.j = ring2.q ;
          ring3.k = !ring2.q ;
         row[] = !ring[].q ;
          TABLE
          ring[].q, col[] => array[].d, kp.d;
     
          B"XXXX",B"1111" => B"XXXX", 0 ;
          B"0001", B"1110" => B"0000", 1 ;
          B"0001", B"1101" => B"0001", 1 ;
          B"0001", B"1011" => B"0010", 1 ;
          B"0001", B"0111" => B"0011", 1 ;
          B"0010", B"1110" => B"0100", 1 ;
          B"0010", B"1101" => B"0101", 1 ;
          B"0010", B"1011" => B"0110", 1 ;
          B"0010", B"0111" => B"0111", 1 ;
          B"0100", B"1110" => B"1000", 1 ;
          B"0100", B"1101" => B"1001", 1 ;
          B"0100", B"1011" => B"1010", 1 ;
          B"0100", B"0111" => B"1011", 1 ;
          B"1000", B"1110" => B"1100", 1 ;
          B"1000", B"1101" => B"1101", 1 ;
          B"1000", B"1011" => B"1110", 1 ;
          B"1000", B"0111" => B"1111", 1 ;
          END TABLE;
          array[].clk = clk ;
          d[] = array[].q ;
          kp.clk = clk ;
          keypress = kp.q ;
     END
     #include // 特定常量與宏的定義
     #include "PSoCAPI.h" // 用戶模塊API接口定義
     void main()
     { BYTE t, m; WORD ttt;
      CSR_1_Start(); // 啟動(dòng)CSR模塊
         M8C_EnableGInt;
         CSR_1_SetDacCurrent(0x32,0); // 相關(guān)設(shè)置
      CSR_1_SetScanSpeed(255);
         CSR_1_StartScan(0,10,1);// 啟動(dòng)感測(cè)盤掃描
         PRT1DR |= 0xf0; // 編碼輸出端口設(shè)置
      m = 0;
      while(1)
      {if (CSR_1_GetScanStatus() &
          CSR_1_SCAN_SET_COMPLETE)
         { m += 1;
          ttt = CSR_1_iUpdateBaseline(0,10); // 取值
          ttt >>= 2;
          switch(ttt) // 按鍵識(shí)別
         {case 0x01: t = 0; break;
          case 0x02: t = 1; break;
          case 0x04: t = 2; break;
          case 0x08: t = 3; break;
          case 0x10: t = 4; break;
          case 0x20: t = 5; break;
          case 0x40: t = 6; break;
          case 0x80: t = 7; break;
          default: t = 8; break;
          }
         if(t<8) // 按鍵編碼輸出
          { if(m==1) // 編碼輸出
          { PRT1DR &= 0x8f;
          PRT1DR |= (t<<4);
          }
     
     else if(m==5) PRT1DR &= 0x7f;
     
          // 鍵動(dòng)作中斷信號(hào)輸出
          else if(m>20) // 結(jié)束一次鍵編碼輸出
          {PRT1DR |= 0xf0;
          m = 0;
          }
          }
          }
      }
     }
     char KeyIdentify(void)
     { char ADC_result;
         ADC_result = ADCR; // 讀取ADC轉(zhuǎn)換結(jié)果
         if((ADC_result>0xe0)&&(ADC_result<0xe4))
          return(1); // 按鍵0動(dòng)作
          else if((ADC_result>0xe4)&&(ADC_result<0xec))
          return(1); // 按鍵1動(dòng)作
      else if((ADC_result>0xec)&&(ADC_result<0xf4))
          return(1); // 按鍵2動(dòng)作
      else if((ADC_result>0xf4)&&(ADC_result<0xfc))
          return(1); // 按鍵3動(dòng)作
     
         else if((ADC_result>0xfc)&&(ADC_result<0x04))
          return(1); // 按鍵4動(dòng)作
      else if((ADC_result>0x04)&&(ADC_result<0x0c))
          return(1); // 按鍵5動(dòng)作
      else if((ADC_result>0x0c)&&(ADC_result<0x14))
          return(1); // 按鍵6動(dòng)作
          else if((ADC_result>0x14)&&(ADC_result<0x1a))
          return(1); // 按鍵7動(dòng)作
     }