⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 key.c

📁 ucosii的源代码希望能给予学习嵌入式系统的朋友一定的帮助
💻 C
📖 第 1 页 / 共 2 页
字号:
}

/*$PAGE*/
/*
*********************************************************************************************************
*                                  虐啊 倔付唱 坷贰 喘妨廉 乐菌绰 瘤甫 舅酒晨
*
* 汲疙     : 捞 窃荐绰 虐啊 喘妨廉 乐绰 矫埃阑 府畔茄促
* 傈崔牢磊 : 绝澜
* 府畔蔼   : 虐啊 喘妨柳 矫埃(剐府檬, milliseconds)
*********************************************************************************************************
*/

INT32U  KeyGetKeyDownTime (void)
{
    INT16U tmr;


    OS_ENTER_CRITICAL();
    tmr = KeyDownTmr;
    OS_EXIT_CRITICAL();
    return (tmr * KEY_SCAN_TASK_DLY);
}

/*$PAGE*/
/*
*********************************************************************************************************
*                                 滚欺俊 胶牡内靛啊 历厘登绢 乐绰 瘤 舅酒晨
*
* 汲疙     : 捞 窃荐绰 虐啊 喘妨廉 乐菌绰 瘤甫 犬牢茄促
* 傈崔牢磊 : 绝澜
* 府畔蔼   : TRUE   虐啊 喘妨脸带 版快
*            FALSE  虐啊 喘妨瘤瘤 臼疽带 版快
*********************************************************************************************************
*/

BOOLEAN  KeyHit (void)
{
    BOOLEAN hit;


    OS_ENTER_CRITICAL();
    hit = (BOOLEAN)(KeyNRead > 0) ? TRUE : FALSE;
    OS_EXIT_CRITICAL();
    return (hit);
}

/*
*********************************************************************************************************
*                                             虐焊靛 檬扁拳
*
* 汲疙     : 虐焊靛 檬扁拳 窃荐. KeyInit()绰 虐焊靛 包访等 荤侩磊 窃荐甫 龋免窍扁 傈俊 馆靛矫 弥檬肺 
*            龋免登绢具 茄促
* 傈崔牢磊 : 绝澜
* 府畔蔼   : 绝澜
*********************************************************************************************************
*/

void  KeyInit (void)
{
    KeySelRow(KEY_ALL_ROWS);                     /* 葛电 青阑 急琶茄促                                 */
    KeyScanState = KEY_STATE_UP;                 /* 虐焊靛 胶某醋 怕胶农狼 檬扁惑怕甫 技飘茄促         */
    KeyNRead     = 0;                            /* 佬囚柳 虐狼 荐甫 历厘窍绰 函荐 檬扁拳              */
    KeyDownTmr   = 0;
    KeyBufInIx   = 0;                            /* 历厘瞪 胶牡内靛绰 滚欺狼 贸澜何磐 矫累凳           */
    KeyBufOutIx  = 0;                            /* 佬囚龙 胶牡内靛绰 滚欺狼 贸澜何磐 矫累凳           */
    KeySemPtr    = OSSemCreate(0);               /* 虐焊靛 技付器绢 檬扁拳                             */
    KeyInitPort();                               /* 虐焊靛 靛扼捞滚俊辑 荤侩登绰 I/O器飘 檬扁拳        */
    OSTaskCreate(KeyScanTask, (void *)0, &KeyScanTaskStk[KEY_SCAN_TASK_STK_SIZE], KEY_SCAN_TASK_PRIO);
}

/*$PAGE*/
/*
*********************************************************************************************************
*                                           SEE IF KEY PRESSED
*
* 汲疙     : 捞 窃荐绰 泅犁 虐啊 喘妨廉 乐绰 瘤甫 舅酒辰促
* 傈崔牢磊 : 绝澜
* 府畔蔼   : TRUE   虐啊 喘妨柳 版快
*            FALSE  虐啊 喘妨瘤瘤 臼篮 版快
* 畴飘     : (1 << KEY_MAX_COLS) - 1  绰 凯涝仿阑 盒府窍扁 困秦 荤侩登绰 付胶农 蔼捞促
*            (i.e. mask off the SHIFT keys).
*********************************************************************************************************
*/

static  BOOLEAN  KeyIsKeyDown (void)
{
    if (KeyGetCol() & ((1 << KEY_MAX_COLS) - 1)) {         /* 0捞搁 虐啊 喘妨瘤瘤 臼澜阑 狼固          */
        OS_ENTER_CRITICAL();
        KeyDownTmr++;                                      /* 虐促款 墨款磐甫 刘啊茄促                 */
        OS_EXIT_CRITICAL();
        return (TRUE);
    } else {
        return (FALSE);
    }
}

/*$PAGE*/
/*
*********************************************************************************************************
*                                          虐焊靛 胶某醋 怕胶农
*
* 汲疙     : 捞 窃荐绰 虐焊靛 胶某醋 怕胶农促. 捞 怕胶农狼 快急鉴困绰 撤霸 且寸蹬具 窍哥
*            胶某醋 林扁绰 KEY_SCAN_TASK_DLY俊 狼秦 搬沥等促
* 傈崔牢磊 : 'data'  怕胶农啊 积己瞪 锭 傈崔登绰 牢磊狼 器牢磐(荤侩登瘤绰 臼澜)
* 府畔蔼   : KeyScanTask()绰 汗蓖登瘤 臼绰促
* 畴飘     : KEY_RPT_START_DLY焊促 坷阀悼救 虐啊 喘妨廉 乐绰 版快 磊悼馆汗 扁瓷捞 悼累茄促
*            老窜 磊悼馆汗 扁瓷捞 矫累登搁 虐啊 喘妨廉 乐绰 茄 KEY_RPT_DLY付促 馆汗等促
*            抗甫 甸搁, 虐焊靛 胶某醋捞 50msec付促 荐青登绊 KEY_RPT_START_DLY绰 40, KEY_RPT_DLY绰 2肺
*            汲沥登绢 乐促搁, 磊悼馆汗篮 虐甫 穿弗 饶 2檬饶俊 矫累登绊 100msec付促 虐啊 馆汗瞪 巴捞促
*
*
*********************************************************************************************************
*/

/*$PAGE*/
static  void  KeyScanTask (void *data)
{
    INT8U code;


    data = data;                                           /* 哪颇老矾 版绊甫 乔茄促 (uC/OS-II req.)   */
    for (;;) {
        OSTimeDlyHMSM(0, 0, 0, KEY_SCAN_TASK_DLY);         /* 虐焊靛 胶某醋 掉饭捞                     */
        switch (KeyScanState) {
            case KEY_STATE_UP:                             /* 虐啊 喘妨廉 乐绰 瘤甫 犬牢且 鞘夸啊 乐澜 */
                 if (KeyIsKeyDown()) {                     /* 虐喘覆阑 犬牢茄促                        */
                     KeyScanState = KEY_STATE_DEBOUNCE;    /* 叼官款胶 胶抛捞飘肺 惑怕 函版            */
                     KeyDownTmr   = 0;                     /* 虐促款 鸥捞赣甫 府悸                     */
                 }
                 break;

            case KEY_STATE_DEBOUNCE:                       /* 虐 喘覆, 胶牡内靛甫 犬牢                 */
                 if (KeyIsKeyDown()) {                     /* 虐啊 喘啡绰啊?                           */
                     code              = KeyDecode();      /* 喘赴 虐狼 胶牡内靛甫 舅酒辰促            */
                     KeyBufIn(code);                       /* 胶牡内靛甫 滚欺俊 历厘                   */
                     KeyRptStartDlyCtr = KEY_RPT_START_DLY;/* 磊悼馆汗 扁瓷阑 矫累窍扁 困秦 掉饭捞 矫累*/
                     KeyScanState      = KEY_STATE_RPT_START_DLY;
                 } else {
                     KeySelRow(KEY_ALL_ROWS);              /* 葛电 青阑 急琶                           */
                     KeyScanState      = KEY_STATE_UP;     /* 虐啊 喘妨廉 乐瘤 臼促                    */
                 }
                 break;

            case KEY_STATE_RPT_START_DLY:
                 if (KeyIsKeyDown()) {                     /* 酒流档 虐啊 喘妨廉 乐绰啊?               */
                     if (KeyRptStartDlyCtr > 0) {          /* 磊悼馆汗 扁瓷 矫累傈俊 掉饭捞啊 鞘夸茄啊?*/
                         KeyRptStartDlyCtr--;              /* 抗, 磊悼馆汗 矫累阑 困秦 墨款磐甫 皑家   */
                         if (KeyRptStartDlyCtr == 0) {     /* 磊悼馆汗阑 困茄 掉饭捞啊 肯丰登菌绰啊?...*/
                             code         = KeyDecode();   /* 胶牡内靛甫 舅酒辰促                      */
                             KeyBufIn(code);               /* 滚欺俊 胶牡内靛甫 历厘茄促               */
                             KeyRptDlyCtr = KEY_RPT_DLY;   /* 促澜 馆汗阑 困茄 掉饭捞 蔼阑 肺靛        */
                             KeyScanState = KEY_STATE_RPT_DLY;
                         }
                     }
                 } else {
                     KeyScanState = KEY_STATE_DEBOUNCE;    /* 虐啊 喘妨廉 乐瘤 臼促                    */
                 }
                 break;

            case KEY_STATE_RPT_DLY:
                 if (KeyIsKeyDown()) {                     /* 酒流档 虐啊 喘妨廉 乐绰啊?               */
                     if (KeyRptDlyCtr > 0) {               /* 虐 馆汗傈俊 扁促副 鞘夸啊 乐绰啊?        */
                         KeyRptDlyCtr--;                   /* 抗, 皑家窍绊 促澜 虐馆汗阑 扁促赴促      */
                         if (KeyRptDlyCtr == 0) {          /* 虐甫 馆汗且 锭牢啊                       */
                             code         = KeyDecode();   /* 胶牡内靛甫 舅酒辰促                      */
                             KeyBufIn(code);               /* 胶牡内靛甫 历厘茄促                      */
                             KeyRptDlyCtr = KEY_RPT_DLY;   /* 磊悼馆汗俊 鞘夸茄 掉饭捞 蔼阑 府肺靛茄促 */
                         }
                     }
                 } else {
                     KeyScanState = KEY_STATE_DEBOUNCE;    /* 虐啊 喘妨廉 乐瘤 臼澜                    */
                 }
                 break;
        }
    }
}

/*$PAGE*/
/*
*********************************************************************************************************
*                                                 凯 佬扁
*
* 汲疙     : 捞 窃荐绰 凯 器飘甫 佬扁困秦 龋免等促
* 傈崔牢磊 : 绝澜
* 府畔蔼   : 凯 器飘狼 哪敲府刚飘 捞骨肺 1狼 蔼阑 爱绰 厚飘俊 秦寸窍绰 凯捞 喘妨咙
*********************************************************************************************************
*/

#ifdef ORIGINAL_DRIVER
INT8U  KeyGetCol (void)
{
    return (~inp(KEY_PORT_COL));                 /* Complement columns (1捞 虐啊 喘啡澜阑 狼固)        */
}
#else
INT8U  KeyGetCol (void)
{
    INT8U val;
    
    val = ioport1;
    val = ~val;
    val >>= 4;
    val &= 0x07;
    return val;
}
#endif


/*
*********************************************************************************************************
*                                             I/O 器飘 檬扁拳
*********************************************************************************************************
*/

#ifdef ORIGINAL_DRIVER
void  KeyInitPort (void)
{
    outp(KEY_PORT_CW, 0x82);                     /* 82C55檬扁拳 : A=免仿, B=涝仿(凯), C=免仿(青)       */
}
#else
void  KeyInitPort (void)
{
}
#endif


/*
*********************************************************************************************************
*                                                 青 急琶
*
* 汲疙     : 捞 窃荐绰 虐焊靛狼 青阑 急琶窍扁 困秦 龋免等促
* 傈崔牢磊 : row 绰 青狼 荐甫 富窃(0..7) 肚绰 KEY_ALL_ROWS
* 府畔蔼   : 绝澜
* Note     : 阿 青篮 0阑 免仿窃栏肺结 急琶凳
*********************************************************************************************************
*/

#ifdef ORIGINAL_DRIVER
void  KeySelRow (INT8U row)
{
    if (row == KEY_ALL_ROWS) {
        outp(KEY_PORT_ROW, 0x00);                /* 葛电 青阑 0栏肺 免仿窃                             */
    } else {
        outp(KEY_PORT_ROW, ~(1 << row));         /* 盔窍绰 青父 0栏肺 免仿窃                           */
    }
}
#else
void  KeySelRow (INT8U row)
{
    if (row == KEY_ALL_ROWS) {
        ioport1 = 0xf0;                         /* 葛电 青阑 0栏肺 免仿窃                             */
    } else {
        row = ~(1 << row);
        row |= 0xf0;
        ioport1 = row;                          /* 盔窍绰 青父 0栏肺 免仿窃                           */
    }
}
#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -