📄 keyscan.c
字号:
/*--------------------------------------------------------------------------------
**工程名称:3*4键盘扫描测试程序
**编译器:ICCAVR6.31A pro
**日期:2005.10.10
**作者:coole
**芯片类型:M16
**时钟频率:内部8M
---------------------------------------------------------------------------------*/
#include "keyscan.h"
#include "3510i.h"
#include "buzzpr.h"
extern uchar fBuzzring;
extern uchar BuzzringCnt;
extern uchar BuzzringTime;
extern LCD_BGColor;
//**************************************************************
const uchar Convert[]={0,1,4,7,10,2,5,8,11,3,6,9,12};
uchar flag1;
#define fkeyreq 0 //按键请求
#define fkeyeff 1 //按键有效
#define fkeyhid 2 //按键屏蔽
#define fkeysucc 3 //连键判断
#define finputeff 4 //按键输入有效
uchar MenuLevel;
uchar MenuItemMax;
uchar MenuSelect[3];
uchar KeyNow,KeyOld,KeyCode,KeyCnt;
uchar Get_Key_Value(void)
{
uchar i,keyvalue,keynum;
keynum=0xff;
DDRD = 0xf0;//低四位为输入,高四位为输出
for(i=0;i<3;i++)
{
PORTD = 0xff;
clr_bit(PORTD,4+i);//将第i列输出低电平
delay_nus(20);
keyvalue=PIND&0x0f;
if(keyvalue!=0x0f)
{
switch(keyvalue)
{
case 0x0e:keynum=13-(3-i)*4;break;
case 0x0d:keynum=14-(3-i)*4;break;
case 0x0b:keynum=15-(3-i)*4;break;
case 0x07:keynum=16-(3-i)*4;break;
default:break;
}
}
}
DDRD = 0xff;
PORTD = 0xff;
return keynum;//return 0xff;
}
//**************************************//
// 函数名称:void Key_Scan()
// 输--入:无
// 输--出:无
// 功--能:按键扫描
// 影响标志:
// 创--建:
// 修--改:
//**************************************//
void Key_Scan(void)
{
uchar temp;
temp=Get_Key_Value();
if(temp!=0xff)
{
KeyNow=Convert[temp];
//LCD_WriteEnglishChar((KeyNow+48),10 , 50);
}
else
{
KeyNow=0;
KeyCode=0;
KeyOld=0;
}
if(KeyNow)
{
if(KeyNow!=KeyCode)
{
KeyCode=KeyNow;
KeyCnt=0;
}
else
{ //起滤波作用,修改这里的数字可以调整按键的灵敏度
KeyCnt++;
if(KeyCnt>5)
{
KeyCnt=0;
set_bit(flag1,fkeyreq);
}
}
}
if(get_bit(flag1,fkeyreq))
{
clr_bit(flag1,fkeyreq);
if(KeyCode!=KeyOld)
{
//无连键
if(!(get_bit(flag1,fkeyhid)))
{
set_bit(flag1,fkeyhid); //有按键时,设置按键屏蔽,屏蔽掉其它按键
KeyOld=KeyCode;
set_bit(flag1,fkeyeff);
}
//keyccnt=40;
}
else
{
//有连键现象
set_bit(flag1,fkeyhid);
/*if((KeyCode==3)||(KeyCode==4)) //这里的数字对应有连键现象的键值
{
keyccnt--;
if(keyccnt==0)
{
keyccnt=6;
set_bit(flag1,fkeyeff);
set_bit(flag1,fkeysucc);
}
}*/
}
}
if(!KeyNow) //没有任何按键时,清除按键屏蔽
clr_bit(flag1,fkeyhid);
}
//**************************************//
// 函数名称:void Key_Pr()
// 输--入:KeyCode
// 输--出:data_buffer[0]
// 功--能:按键处理
// 影响标志:
// 创--建:
// 修--改:
//**************************************//
void Key_Pr(void)
{
if(get_bit(flag1,fkeyeff))
{
fBuzzring|=(1<<fbuzzeff)|(1<<fbuzzring);
BuzzringCnt=2;
clr_bit(flag1,fkeyeff);
set_bit(flag1,finputeff);
if(KeyOld==10)
KeyOld=0;
//******************
//**各按键功能处理
//******************
switch(KeyOld)
{
case 1: //confirm键
{
++MenuLevel;
if(MenuLevel==1) //enter the menu
{
}
LCD_BGColor=0xff;
LCD_EraseBlock(0,0,97,66);
LCD_BGColor=0b11100000;
LCD_EraseBlock(10,10,87,56);
LCD_WriteEnglishString("Confirm Key",10 , 25);
break;
}
case 2://up
{
LCD_BGColor=0b11100000;
LCD_EraseBlock(10,10,87,56);
LCD_WriteEnglishString("Up Key",10 , 25);
break;
}
case 3://cancel
{
if(MenuLevel>0)
--MenuLevel;
else
MenuLevel=0;
LCD_BGColor=0b11100000;
LCD_EraseBlock(10,10,87,56);
LCD_WriteEnglishString("Cancel Key",10 , 25);
break;
}
case 4: //left
{
LCD_BGColor=0b11100000;
LCD_EraseBlock(10,10,87,56);
LCD_WriteEnglishString("Left Key",10 , 25);
break;
}
case 5://confirm
{
LCD_BGColor=0b11100000;
LCD_EraseBlock(10,10,87,56);
LCD_WriteEnglishString("Confirm Key",10 , 25);
break;
}
case 6://right
{
LCD_BGColor=0b11100000;
LCD_EraseBlock(10,10,87,56);
LCD_WriteEnglishString("Right Key",10 , 25);
break;
}
case 7: //
{
//LCD_WriteEnglishString("KeyValue=7",10 , 25);
break;
}
case 8://down
{
LCD_BGColor=0b11100000;
LCD_EraseBlock(10,10,87,56);
LCD_WriteEnglishString("Down Key",10 , 25);
break;
}
case 9://
{
//LCD_WriteEnglishString("KeyValue=9",10 , 25);
break;
}
case 0: //
{
//LCD_WriteEnglishString("KeyValue=0",10 , 25);
break;
}
case 0x0b://Time
{
LCD_BGColor=0b11100000;
LCD_EraseBlock(10,10,87,56);
LCD_WriteEnglishString("KeyValue=*",10 , 25);
break;
}
case 0x0c://Temp
{
LCD_BGColor=0b11100000;
LCD_EraseBlock(10,10,87,56);
LCD_WriteEnglishString("KeyValue=#",10 , 25);
break;
}
default:break;
}
}
}
/*--------------------------------------------延时函数------------------------------------*/
//1us延时函数
void delay_1us(void)
{
NOP();
}
//n us 延时函数
void delay_nus(unsigned int n)
{
unsigned int i;
for(i=0;i<n;i++)
delay_1us();
}
//1ms延时函数
void delay_1ms(void)
{
unsigned int i;
for(i=0;i<600;i++);
}
//n ms延时函数
void delay_nms(unsigned int n)
{
unsigned int i;
for(i=0;i<n;i++)
delay_1ms();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -