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

📄 main.c

📁 一个用过的最好的用状态机做的键盘程序
💻 C
字号:
#include	"..\ucos-ii\includes.h"               /* uC/OS interface */
#include    "..\uhal\uhal.h"
#include    "..\Target\44b.h"
#include    "..\Target\44blib.h"


//*************defines********************//
#define     KEY_STATE_UP             1
#define     KEY_STATE_DEBOUNCE       2
#define     KEY_STATE_RPT_START_DLY  3
#define     KEY_STATE_RPT_DLY        4

//***************************************
#define     KEY_BUF_SIZE             10
#define     KEY_RPT_START_DLY        10
#define     KEY_RPT_DLY              2

//*************global variables***********//
static INT8U    KeyBuf[KEY_BUF_SIZE];
static INT8U    KeyNRead;
static INT8U    KeyBufInIx;
static INT8U    KeyBufOutIx;
static INT8U    KeyRptStartDlyCtr;
static INT8U    KeyRptDlyCtr;
static INT8U    KeyScanState;

static OS_EVENT *KeySemPtr;


#define		TASK_STACK_SIZE	10*1024

OS_STK Main_Stack[TASK_STACK_SIZE]= {0, };
void Main_Task(void *Id);
#define Main_PRIO       10

OS_STK TaskKEY_Stack[TASK_STACK_SIZE]= {0, };
void TaskKEY_Task(void *Id);
#define TaskKEY_PRIO  17

OS_STK TaskA_Stack[TASK_STACK_SIZE]= {0, };
void TaskA_Task(void *Id);
#define TaskA_PRIO    18

//***********local function****************//
static void    KeyBufIn(INT8U code);
static INT8U   KeyDecode(void);
static BOOLEAN KeyIsDown(void);


//*******************************************
static void  KeyBufIn(INT8U code)
{
    OS_ENTER_CRITICAL();
    if(KeyNRead<KEY_BUF_SIZE)
    {
        KeyBuf[KeyBufInIx++] = code;
        KeyNRead++;
        if(KeyBufInIx >= KEY_BUF_SIZE)
        {
            KeyBufInIx = 0;
        }
        OS_EXIT_CRITICAL();
        OSSemPost(KeySemPtr);
    }
    else
    {
        OS_EXIT_CRITICAL();
    }

}

//******************************************
static INT8U KeyDecode(void)
{
    INT8U inp;
    INT8U result;
    inp = rPDATG;
    
    if(inp < 0xf0)
    {
        inp |= 0x0f;
        if(inp == 0x7f)
        {
            result = 7;
        }
        else if(inp == 0xbf)
        {
            result = 6;
        }
        else if(inp == 0xdf)
        {
            result = 5;
        }
        else if(inp == 0xef)
        {
            result = 4;
        }
    }
    return (result);
}

//********************************************
void KeyInit(void)
{
    rPCONG &= 0x00ff;
    rPUPG  &= 0x0f;
    
    KeyScanState = KEY_STATE_UP;
    
    KeyNRead = 0;
    KeyBufInIx = 0;
    KeyBufOutIx = 0;
    KeySemPtr = OSSemCreate(0);
}


//***********************************************
static BOOLEAN KeyIsDown(void)
{
    INT8U inp;
    inp = rPDATG;
    
    if(inp < 0xf0)
    {
        return (TRUE);
    }
    else
    {
        return (FALSE);
    }
}

//************************************************
INT8U KeyGetKey(void)
{
    INT8U code;
    INT8U err;
    
    OSSemPend(KeySemPtr, 0, &err);
    OS_ENTER_CRITICAL();
    if(KeyNRead > 0)
    {
        KeyNRead--;
        code = KeyBuf[KeyBufOutIx];
        KeyBufOutIx++;
        if(KeyBufOutIx >= KEY_BUF_SIZE)
        {
            KeyBufOutIx = 0;
        }
        OS_EXIT_CRITICAL();
        return (code);    
    }
    else
    {
        OS_EXIT_CRITICAL();
        return (0xff);
    }
}


//**************************************************
void Main_Task(void *Id)
{
    ARMTargetStart();
    
    KeyInit();
    
    OSTaskCreate(TaskKEY_Task, (void *)0, (OS_STK *)&TaskKEY_Stack[TASK_STACK_SIZE-1],  TaskKEY_PRIO);
    OSTaskCreate(TaskA_Task, (void *)0, (OS_STK *)&TaskA_Stack[TASK_STACK_SIZE-1], TaskA_PRIO);
    
    while(1)
    {
        OSTimeDly(500);
    }
}


void TaskKEY_Task(void *Id)
{
    INT8U code;
    
    while(1)
    {
        OSTimeDly(50);
        switch(KeyScanState)
        {
            case KEY_STATE_UP:
                if(KeyIsDown())
                {
                    KeyScanState = KEY_STATE_DEBOUNCE;
                }
                break;
            case KEY_STATE_DEBOUNCE:
                if(KeyIsDown())
                {
                    code = KeyDecode();
                    KeyBufIn(code);
                    KeyRptStartDlyCtr = KEY_RPT_START_DLY;
                    KeyScanState = KEY_STATE_RPT_START_DLY;
                }
                else
                {
                    KeyScanState = KEY_STATE_UP;
                }
                break;
            case KEY_STATE_RPT_START_DLY:
                if(KeyIsDown())
                {
                    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(KeyIsDown())
                {
                    if(KeyRptDlyCtr > 0)
                    {
                        KeyRptDlyCtr--;
                        if(KeyRptDlyCtr == 0)
                        {
                            code = KeyDecode();
                            KeyBufIn(code);
                            KeyRptDlyCtr = KEY_RPT_DLY;
                        }
                    }
                }
                else
                {
                    KeyScanState = KEY_STATE_DEBOUNCE;
                }
                break;
        }
    }

}


//*******************************************
void TaskA_Task(void *Id)
{
    INT8U code;
    while(1)
    {
        code = KeyGetKey();
        if(code != 0xff)
        {
            OS_ENTER_CRITICAL();
            Uart_Printf("%d",code);
            OS_EXIT_CRITICAL();
        }
    }
    OSTimeDly(150);
}


int Main()
{
	Port_Init();
	Uart_Init(0,115200);
	Led_Display(0xf);
	Delay(0);
    Beep(0x01);
	Uart_Select(0); //Select UART0//
	Uart_Printf("\n---------------------------------------------------------------");
	Beep(0x00);
	Uart_Printf("\nOEM name   :     LiYuTai Elec.Co.,Ltd.			               ");
	Uart_Printf("\nWebsite    :     www.hzlitai.com.cn                             ");
	Uart_Printf("\nEmail      :     lyt_tech@yahoo.com.cn                          ");
	Uart_Printf("\nFunction   :     ARMSYS44b0's uCOS-II Ex2 Program               ");
	Uart_Printf("\nUART config:     115.2kbps,8Bit,NP,UART0                        ");
	Uart_Printf("\n---------------------------------------------------------------");
	Uart_Printf("\n---------Press Exint7 to Start, Press Exint6 to Stop-----------\n");
	Led_Display(0x0);
	ARMTargetInit();//initialize Target
	
	// Init uCOS-II
	OSInit();

	//Create the Main Task
	OSTaskCreate(Main_Task, (void *)0, (OS_STK *)&Main_Stack[TASK_STACK_SIZE-1],  Main_PRIO);

	/* Start uCOS-II */
	OSStart();
	return 0;
}

⌨️ 快捷键说明

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