您的位置:控制工程论坛网论坛 » 软件与程序 » 嵌入式人机界面中的键盘及其接口设计

xilinxue

xilinxue   |   当前状态:在线

总积分:16186  2024年可用积分:0

注册时间: 2008-06-26

最后登录时间: 2020-03-22

空间 发短消息加为好友

嵌入式人机界面中的键盘及其接口设计

xilinxue  发表于 2008/10/22 12:55:42      806 查看 0 回复  [上一主题]  [下一主题]

手机阅读

《嵌入式人机界面中的键盘及其接口设计》P24

  具体程序如下:

    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 <m8c.h>      // 特定常量与宏的定义

    #include "PSoCAPI.h"  // 用户模块API接口定义

    void main()

    { BYTE t, m; WORD ttt;

     CSR_1_Start();                                // 启动CSR模块

    M8C_EnableGInt;

    CSR_1_SetDacCurrent(0x32,0); // 相关设置

     CSR_1_SetScanSpeed(255);

    CSR_1_StartScan(0,10,1);// 启动感测盘扫描

    PRT1DR |= 0xf0;                      // 编码输出端口设置

     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)        // 按键识别

      {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;
    
                                        // 键动作中断信号输出

        else if(m>20)        // 结束一次键编码输出

        {PRT1DR |= 0xf0;

        m = 0;

        }

       }

     }

     }

    }

    char KeyIdentify(void)

    { char ADC_result;

      ADC_result = ADCR; // 读取ADC转换结果

      if((ADC_result>0xe0)&&(ADC_result<0xe4))

                return(1);              //    按键0动作

     else if((ADC_result>0xe4)&&(ADC_result<0xec))

                  return(1);              //    按键1动作

      else if((ADC_result>0xec)&&(ADC_result<0xf4))

                  return(1);              //    按键2动作

      else if((ADC_result>0xf4)&&(ADC_result<0xfc))

                  return(1);              //    按键3动作
    
      else if((ADC_result>0xfc)&&(ADC_result<0x04))

                return(1);              //    按键4动作

      else if((ADC_result>0x04)&&(ADC_result<0x0c))

                return(1);              //    按键5动作

      else if((ADC_result>0x0c)&&(ADC_result<0x14))

                  return(1);              //    按键6动作

     else if((ADC_result>0x14)&&(ADC_result<0x1a))

                  return(1);              //    按键7动作

    }



1楼 0 0 回复