扫描程序如下,在定时中断扫键,主循环中查键,但组合键一直只能识别为shift键。不解啊?
/******************************************************************************/
#define _KEY_SCAN_C_
/******************************************************************************/
#include <STC90CxxAD.H>
#include <intrins.H>
#include "DELAY.h"
#include "KEY_SCAN.h"
/***************************************************************
功能:判断是否有按键按下
keycode=0 无效 表示当前没有键按下
keycode=1 UP 表示当前UP键按下
keycode=2 DOWN 表示当前DOWN键按下
keycode=3 LEFT 表示当前LEFT/shift键按下
keycode=4 RIGHT 表示当前RIGHT键按下
keycode=5 OK 表示当前ENTER键按下
keycode=6 BACK 表示当前BACK键按下
keycode=7 ZHISHU 表示当前ZHISHU键按下
keycode=8 BLINC 表示当前UP键与shift键按下
keycode=9 BLDEC 表示当前DOWN键与shift键按下
keycode=10 CLRDEP 表示当前取消键与shift键按下
keycode=11 CPLDIR 表示当前换向键与shift键按下
行列键盘 分布图
K06----[ -- ]----[ -- ]----[SET ]
| | |
K05----[BACK]----[ OK ]----[RIGH]
| | |
K04----[LEFT]----[DOWN]----[ UP ]
| | |
K03 K02 K01
***************************************************************/
void Beep(void)
{
Buzz_cnt =0;
Buzz_flag =1;
BUZZ =1;
}
unsigned char GetKey(void)
/************************************
函数功能:键盘消抖 连续按键120MS为键有效
输入参数:无
输出参数:unsigned char keycode;
全局变量:
************************************/
{
if (KeyCount >30)
{
Beep();
KeyCount =0;
Key_Press_flag =1;
switch (KeyCode)
{
case 0x1B:
return KEY_UP;
case 0x2B:
return KEY_DOWN;
case 0x33:
return KEY_LEFT;
case 0x1D:
return KEY_RIGHT;
case 0x2D:
return KEY_OK;
case 0x35:
return KEY_BACK;
case 0x1E:
return KEY_ZHISHU;
case 0x15:
return KEY_CPLDIR;
case 0x19:
return KEY_CLRDEP;
default:
Key_Press_flag =0;
return NO_KEY;
}
}
else
{
return NO_KEY;
}
}
void Scan_Key(void)
/************************************
函数功能:线反转行列扫描
输入参数:先行清零列扫描; 再列清零行扫描;
全局变量:KeyCode KeyCount
************************************/
{
unsigned char Scan_Code,Col_Scan_Code,Row_Scan_Code;
// 置键 行清零列扫描 K01=K02=K03=0; K04=K05=K06=1
KEYBUS &=0xF8;
_nop_(); _nop_();
Col_Scan_Code =KEYBUS &0x38;
KEYBUS |=0x3F;
if (0x38 ==Col_Scan_Code)
{
Scan_Code =NO_KEY;
Key_Press_flag =0;
return;
}
// 置键 列清零行扫描 K01=K02=K03=1; K04=K05=K06=0
KEYBUS &=0xC7;
_nop_(); _nop_();
Row_Scan_Code =KEYBUS &0x07;
KEYBUS |=0x3F;
if (0x07 ==Row_Scan_Code)
{
Scan_Code =NO_KEY;
Key_Press_flag =0;
return;
}
if (!Key_Press_flag)
{
Scan_Code =(Col_Scan_Code | Row_Scan_Code);
if (KeyCode ==Scan_Code)
{
if (255!=KeyCount)
{
KeyCount++;
}
}
else
{
KeyCode =Scan_Code;
KeyCount=1;
}
}
}
中断调用
void INTER_Timer0(void) interrupt 1
// T0定时4毫秒@11.0592MHz时钟12T模式
{
TH0 =0xF1;
TL0 =0x9A;
Scan_Key(); //每4ms扫描按键
T0_cnt ++;
if (125==T0_cnt)
{
flash_flag =~flash_flag; //闪烁频率 0.5秒
}
if (1==Buzz_flag)
{
Buzz_cnt ++;
if (15==Buzz_cnt)
{
BUZZ =0;
Buzz_flag =0;
Buzz_cnt =0; //蜂鸣60ms
}
}
}
大致就这麽多相关部分了,请大家帮忙看看
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>