时间触发嵌入式系统设计模式 第22章 笔记 控制LCD显示面板
E:\Nu_LB_Nuc140\Nu_LB_NUC140_BSP\SampleCode\Nu-LB-NUC140\Sched_22_LCD_Time
E:\Nu_LB_Nuc140\Nu_LB_NUC140_BSP\SampleCode\Nu-LB-NUC140\Sched_22_LCD_KEY
按键扫描:
/*------------------------------------------------------------------*-
KEYPAD_Scan()
这个函数由被调度的键盘函数调用,必须根据需要修改以匹配按键标签,
包含两个“功能键”可以与其他列的任何按键同时使用
-*------------------------------------------------------------------*/
unsigned char KEYPAD_Scan(char* const pKey, char* const pFuncKey)
{
static char Old_Key;
char Key = KEYPAD_NO_NEW_DATA;
char Fn_key = (char) 0x00;
GPIO_SetMode(PA, BIT2, GPIO_MODE_QUASI);
GPIO_SetMode(PA, BIT1, GPIO_MODE_QUASI);
GPIO_SetMode(PA, BIT0, GPIO_MODE_QUASI);
PA2 = 1;
PA1 = 1;
PA0 = 1;
GPIO_SetMode(PA, BIT3, GPIO_MODE_QUASI);
GPIO_SetMode(PA, BIT4, GPIO_MODE_QUASI);
GPIO_SetMode(PA, BIT5, GPIO_MODE_QUASI);
PA5 = 1;
PA4 = 1;
PA3 = 1;
#define C1 PA2
#define C2 PA1
#define C3 PA0
#define R1 PA3
#define R2 PA4
#define R3 PA5
//
C1 = 0; // 扫描列1
if (R1 == 0) Key = '1';
if (R2 == 0) Key = '4';
if (R3 == 0) Fn_key = '*';
C1 = 1;
C2 = 0; // 扫描列 2
if (R1 == 0) Key = '2';
if (R2 == 0) Key = '5';
if (R3 == 0) Key = '0';
C2 = 1;
C3 = 0; // 扫描列 3
if (R1 == 0) Key = '3';
if (R2 == 0) Key = '6';
if (R3 == 0) Fn_key = '#';
C3 = 1;
if (Key == KEYPAD_NO_NEW_DATA)
{
// 没有按键被按下(或只是功能键)
Old_Key = KEYPAD_NO_NEW_DATA;
Last_valid_key_G = KEYPAD_NO_NEW_DATA;
return 0; // 没有新的数据
}
// 一个按键被按下,通过检查两次来消抖
if (Key == Old_Key)
{
//检测到一个有效的(经过消抖)键按下
//必须是一个新的按键才有效,不允许“自动重复”
if (Key != Last_valid_key_G)
{
// 新的按键
*pKey = Key;
printf("%c",Key);
Last_valid_key_G = Key;
// 功能键是否也被按下
if (Fn_key)
{
// 功能键与另一个按键被同时按下
*pFuncKey = Fn_key;
}
else
{
*pFuncKey = (char) 0x00;
}
return 1;
}
}
// 没有新的数据
Old_Key = Key;
return 0;
}
(稍后补充)