!
        \~english
        Set key button event
        @param btnId: Key button pin number in BCM
        @param keyCallback: A interrupt <b>callback_function</b> or <b>None</b>. <br>
               If set to <b>None</b> means keybutton work in query mode<br>
               then uses RPiKeyButtons#readKeyButton for get keybutton status
        @param bounceTime: Default set to DEF_BOUNCE_TIME_NORMAL
        @param pullUpDown: Default set to GPIO.PUD_UP
        @param event: Default set to GPIO.BOTH. it can be: { GPIO.RISING | GPIO.FALLING | GPIO.BOTH }

        \~chinese
        设置按键事件
        @param btnId: 按键IO号(in BCM mode)
        @param keyCallback: 按键中断回调函数 <b>callback_function</b> 或 <b>None</b><br>
                如果设置为<b>None</b>，则表示按键工作在查询模式<br>
                然后使用 RPiKeyButtons#readKeyButton 获取 keybutton 状态
        @param bounceTime: 默认 DEF_BOUNCE_TIME_NORMAL
        @param pullUpDown: 默认 GPIO.PUD_UP
        @param event: 默认 GPIO.BOTH 它可以是: { GPIO.RISING | GPIO.FALLING | GPIO.BOTH }

        \~ \n
        @see DEF_BOUNCE_TIME_SHORT_MON (10ms)
        @see DEF_BOUNCE_TIME_SHORT (50ms)
        @see DEF_BOUNCE_TIME_NORMAL (100ms)
        @see DEF_BOUNCE_TIME_LONG (200ms)

        @note
            * setKeyButton(btnId = 12, keyCallback = None )
            * setKeyButton(btnId = 14, keyCallback = aKeyCallbackFun ) <br>
                <pre>
                \# a simple callback function
                def aKeyCallbackFun(channel):
                    print(channel)
                    pass
                </pre>

def setKeyButton( self, btnId, keyCallback, bounceTime = DEF_BOUNCE_TIME_NORMAL, pullUpDown = GPIO.PUD_UP, event = GPIO.BOTH ):
        """!
        \~english
        Set key button event
        @param btnId: Key button pin number in BCM
        @param keyCallback: A interrupt <b>callback_function</b> or <b>None</b>. <br>
               If set to <b>None</b> means keybutton work in query mode<br>
               then uses RPiKeyButtons#readKeyButton for get keybutton status
        @param bounceTime: Default set to DEF_BOUNCE_TIME_NORMAL
        @param pullUpDown: Default set to GPIO.PUD_UP
        @param event: Default set to GPIO.BOTH. it can be: { GPIO.RISING | GPIO.FALLING | GPIO.BOTH }

        \~chinese
        设置按键事件
        @param btnId: 按键IO号(in BCM mode)
        @param keyCallback: 按键中断回调函数 <b>callback_function</b> 或 <b>None</b><br>
                如果设置为<b>None</b>，则表示按键工作在查询模式<br>
                然后使用 RPiKeyButtons#readKeyButton 获取 keybutton 状态
        @param bounceTime: 默认 DEF_BOUNCE_TIME_NORMAL
        @param pullUpDown: 默认 GPIO.PUD_UP
        @param event: 默认 GPIO.BOTH 它可以是: { GPIO.RISING | GPIO.FALLING | GPIO.BOTH }

        \~ \n
        @see DEF_BOUNCE_TIME_SHORT_MON (10ms)
        @see DEF_BOUNCE_TIME_SHORT (50ms)
        @see DEF_BOUNCE_TIME_NORMAL (100ms)
        @see DEF_BOUNCE_TIME_LONG (200ms)

        @note
            * setKeyButton(btnId = 12, keyCallback = None )
            * setKeyButton(btnId = 14, keyCallback = aKeyCallbackFun ) <br>
                <pre>
                \# a simple callback function
                def aKeyCallbackFun(channel):
                    print(channel)
                    pass
                </pre>
        """
        GPIO.setup( btnId, GPIO.IN, pull_up_down=pullUpDown)
        # The keyCallback is None means setting keybutton in query mode, 
        # then uses readKeyButton for get keybutton status
        # event can be { RISING, FALLING, BOTH }
        if keyCallback != None:
            try:
                GPIO.add_event_detect( btnId, event, callback=keyCallback, bouncetime=bounceTime )
            except:
                pass
        pass