📄 main.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 + -