#define _MAIN_C
#include "config.h"
const uint8 code LedNum[] = { //数码管显示的字符转化表
LED_NUM_0, LED_NUM_1, LED_NUM_2, LED_NUM_3, LED_NUM_4,
LED_NUM_5, LED_NUM_6, LED_NUM_7, LED_NUM_8, LED_NUM_9,
LED_NUM_A, LED_NUM_b, LED_NUM_C, LED_NUM_d, LED_NUM_E, LED_NUM_F,
};
volatile uint8 KeySta[4][4]; //当前的按键状态
/*
* 函数名:KeyScan
* 描 述:矩阵式按键扫描函数
* 备 注:本函数需在定时中断中调用,其定时时间和DEBOUNCE_MASK常数共同决定消抖时间;
* 如调用本函数的中断服务函数用using指定了寄存器组,则本函数也需用using指定相同的寄存器组。
*/
void KeyScan(void)
{
uint8 i;
static uint8 iKeyOut=0;
static uint8 KeyScanBuff[4][4];
/* 扫描按键输入 */
KeyScanBuff[iKeyOut][0] = ((KeyScanBuff[iKeyOut][0]<<1) | KEY_IN_1) & DEBOUNCE_MASK;
KeyScanBuff[iKeyOut][1] = ((KeyScanBuff[iKeyOut][1]<<1) | KEY_IN_2) & DEBOUNCE_MASK;
KeyScanBuff[iKeyOut][2] = ((KeyScanBuff[iKeyOut][2]<<1) | KEY_IN_3) & DEBOUNCE_MASK;
KeyScanBuff[iKeyOut][3] = ((KeyScanBuff[iKeyOut][3]<<1) | KEY_IN_4) & DEBOUNCE_MASK;
/* 消抖后更新按键状态 */
for (i=0; i<4; i++)
{
if (KeyScanBuff[iKeyOut][i] == DEBOUNCE_MASK)
{
KeySta[iKeyOut][i] = KEY_UP;
}
else if (KeyScanBuff[iKeyOut][i] == 0)
{
KeySta[iKeyOut][i] = KEY_DOWN;
}
}
/* 执行下一列按键输出 */
iKeyOut = (iKeyOut+1) & 0x3;
switch (iKeyOut) {
case 0:
KEY_OUT_4 = 1;
KEY_OUT_1 = 0;
break;
case 1:
KEY_OUT_1 = 1;
KEY_OUT_2 = 0;
break;
case 2:
KEY_OUT_2 = 1;
KEY_OUT_3 = 0;
break;
case 3:
KEY_OUT_3 = 1;
KEY_OUT_4 = 0;
break;
default:
break;
}
}
/*
* 函数名:KeyHandle
* 描 述:按键动作分离及动作执行函数
* 备 注:
*/
void KeyHandle(void)
{
uint8 i, j;
static uint8 bkKey[4][4];
/* 检索按键状态的变化 */
for (i=0; i<4; i++)
{
for (j=0; j<4; j++)
{
if (bkKey[i][j] != KeySta[i][j])
{
if (bkKey[i][j] == KEY_UP)
{
/* 按键按下时的动作 */
_nop_();
}
else
{
/* 按键弹起时的动作 */
DISP_DB = LedNum[i*4+j];
}
bkKey[i][j] = KeySta[i][j];
}
}
}
}
/*
* 函数名:main
* 描 述:工程的C语言入口函数
* 备 注:
*/
int main (void)
{
//按键扫描使用timer1
TMOD = 0x11;
PT1 = 0;
ET1 = 1;
TR1 = 1;
DISP_A0 = 0;
DISP_A1 = 0;
DISP_A2 = 0;
EN_LED2 = 1;
EN_LED1 = 0;
DISP_DB = 0xFF;
EA = 1;
while(1) {
KeyHandle();
}
}
/*
* 函数名:Timer1_ISR
* 描 述:Timer1定时中断服务函数
* 备 注:定时1ms,执行按键扫描
*/
void Timer1_ISR() interrupt 3
{
/* Timer1定时1ms */
TL1 = (uint8)((65535 - SYS_MCLK/1000) + 20);
TH1 = (uint8)(((65535 - SYS_MCLK/1000) + 20) >> 8);
/* 按键扫描 */
KeyScan();
}