📄 key.c
字号:
//文件名 Key.C
//目 的 键盘处理
//Copyright (c) 2006-2007 东方久乐公司电子研究所
//编 写 文洪奎 2007-01-15
//修 改
//修改原因
#include "global.h"
#include "key.h"
#ifndef KEYCLK
#define KEYCLK 30
#endif
#ifndef KEYBUF
unsigned char KeyBuf[4];
unsigned char pKey;
#define KEYBUF
#endif
unsigned char KeyStatic; //键盘状态
//0 放开状态
//1 防抖
//2 重复等待
//3 一级加速
void Initkey()
{
DDRD = 0x0C3; //F0;
PTD = 0x000;
T2SC = 0x030; // 125K = 8MHz / 64
T2MOD = SYSCLK / 64 / KEYCLK;
T2SC = 0x076; //允许中断,停止工作,复位TCNT
pKey = 0;
KBSCR_IMASKK = 1;
KBSCR_MODEK = 0;
KBIER = 0x03C; //0F;
KBSCR_ACKK = 1; //清除中断
KBSCR_IMASKK = 0; //开始键盘中断
KeyStatic = 0;
}
unsigned char GetKey()
{
if(pKey == 0)
return 0;
else
{
pKey--;
switch(KeyBuf[pKey])
{
case 221:
return '0';
case 237:
return '1';
case 238:
return '2';
case 111:
return '3';
case 245:
return '4';
case 246:
return '5';
case 119:
return '6';
case 249:
return '7';
case 250:
return '8';
case 123:
return '9';
case 187:
return 'E';
case 183:
return '\n';
case 222:
return '<';
case 95:
return '>';
case 175:
return 'U';
case 159:
return 'D';
default:
return 0;
};
}
}
unsigned char ScanKey()
{
unsigned char KeyTemp1;
unsigned char KeyTemp2;
KeyTemp1 = PTD & 0x03C; //0F;
if(KeyTemp1 == 0x03C) //0F
{
DDRD = 0x0C3; //F0;
KBIER = 0x03C; //0F;
return 0x0FF;
}
DDRD = 0x03C; //0F;
KBIER = 0x0C3; //F0;
_asm nop;
_asm nop;
KeyTemp2 = PTD & 0x0C3; //F0;
DDRD = 0x0C3; //F0;
KBIER = 0x03C; //0F;
if(KeyTemp2 == 0x0C3) //F0
{
return 0x0FF;
}
return KeyTemp1 | KeyTemp2;
}
unsigned char KeyTemp;
__interrupt void Key_Interrupt(void)
{
KBSCR_IMASKK = 1; //关键盘中断
T2SC_TSTOP = 0; //开始记时中断
KBSCR_ACKK = 1;
KeyStatic = 1;
}
__interrupt void Timer2_Interrupt(void)
{
static unsigned char nWait;
T2SC_TOF = T2SC_TRST; //新中断
KeyTemp = ScanKey();
if(KeyStatic == 3)
{
if(KeyTemp == 0x0FF)
{
KeyStatic = 0;
T2SC_TSTOP = 1; //停止记时器
KBSCR_ACKK = 1; //清除原中断标记
KBSCR_IMASKK = 0; //开键盘中断
}
else
{
if(pKey < 4)
{
KeyBuf[pKey] = KeyTemp;
pKey++;
}
}
}
if(KeyStatic == 2)
{
if(KeyTemp == 0x0FF)
{
KeyStatic = 0;
T2SC_TSTOP = 1; //停止记时器
KBSCR_ACKK = 1; //清除原中断标记
KBSCR_IMASKK = 0; //开键盘中断
}
else
{
if(nWait > 0)
nWait--;
else
KeyStatic = 3;
}
}
if(KeyStatic == 1)
{
if(KeyTemp == 0x0FF)
{
KeyStatic = 0;
T2SC_TSTOP = 1; //停止记时器
KBSCR_ACKK = 1; //清除原中断标记
KBSCR_IMASKK = 0; //开键盘中断
}
else
{
if(pKey < 4)
{
KeyBuf[pKey] = KeyTemp;
pKey++;
}
KeyStatic = 2;
nWait = 50;
PTA_PTA7 = ~PTA_PTA7;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -